{"version":3,"file":"main.bundle.js","sources":["webpack:///./src/app/shared/services/settings.service.ts","webpack:///./src/app/shared/services/stats.service.ts","webpack:///./src/app/shared/services/networks.service.ts","webpack:///./~/@angular/material/bundles/material.umd.js","webpack:///./~/ng2-material/core/util/viewport.js","webpack:///./src/app/shared/services/edw.service.ts","webpack:///./~/ng2-charts/ng2-charts.js","webpack:///./src/app/shared/services/authentication.service.ts","webpack:///./~/ng2-material/core/util/animate.js","webpack:///./~/ng2-material/core/util/media.js","webpack:///./src/app/auth/auth.guard.ts","webpack:///./src/app/components/chartjs/by-day/by-day.ts","webpack:///./src/app/shared/services/gateway.service.ts","webpack:///./~/ng2-material/components/data-table/data_table_selectable_tr.js","webpack:///./~/ng2-material/components/dialog/dialog-actions.js","webpack:///./~/ng2-material/components/dialog/dialog-portal.js","webpack:///./~/ng2-material/components/dialog/dialog.js","webpack:///./src/app/auth-callback/auth-callback.component.ts","webpack:///./src/app/auth/login.component.ts","webpack:///./src/app/components/chartjs/by-month/by-month.ts","webpack:///./src/app/components/chartjs/by-network/by-network.ts","webpack:///./src/app/components/chartjs/type-by-day/by-day.ts","webpack:///./src/app/pages/dashboards/ads-by-day/dashboard.component.ts","webpack:///./src/app/pages/dashboards/aim-sales/dashboard.component.ts","webpack:///./src/app/pages/dashboards/balance-by-day/dashboard.component.ts","webpack:///./src/app/pages/dashboards/billing-statements/dashboard.component.ts","webpack:///./src/app/pages/dashboards/by-day/dashboard.component.ts","webpack:///./src/app/pages/dashboards/cb-tracker/dashboard.component.ts","webpack:///./src/app/pages/dashboards/credit-cards/dashboard.component.ts","webpack:///./src/app/pages/dashboards/data-by-network/dashboard.component.ts","webpack:///./src/app/pages/dashboards/edw-billing-performance/dashboard.component.ts","webpack:///./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.ts","webpack:///./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.ts","webpack:///./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.ts","webpack:///./src/app/pages/dashboards/gateway-data/dashboard.component.ts","webpack:///./src/app/pages/dashboards/gateway-status/dashboard.component.ts","webpack:///./src/app/pages/dashboards/iso-data/dashboard.component.ts","webpack:///./src/app/pages/dashboards/main/dashboard.component.ts","webpack:///./src/app/pages/dashboards/networks/dashboard.component.ts","webpack:///./src/app/pages/dashboards/pandl/dashboard.component.ts","webpack:///./src/app/pages/dashboards/rev-split-values/dashboard.component.ts","webpack:///./src/app/pages/dashboards/revenue-analysis/dashboard.component.ts","webpack:///./src/app/pages/dashboards/revenue-by-subid/dashboard.component.ts","webpack:///./src/app/pages/dashboards/revenue-daily/dashboard.component.ts","webpack:///./src/app/pages/dashboards/spend-analysis/dashboard.component.ts","webpack:///./src/app/pages/dashboards/sub-ids/dashboard.component.ts","webpack:///./src/app/pages/dashboards/tonic-today/dashboard.component.ts","webpack:///./src/app/shared/services/alert.service.ts","webpack:///./src/app/shared/services/billing_statements.ts","webpack:///./src/app/shared/services/spend.service.ts","webpack:///./~/ng2-material/components/backdrop/backdrop.js","webpack:///./~/ng2-material/components/content/content.js","webpack:///./~/ng2-material/components/data-table/data_table.js","webpack:///./~/ng2-material/components/data-table/index.js","webpack:///./~/ng2-material/components/dialog/dialog-title.js","webpack:///./~/ng2-material/components/divider/divider.js","webpack:///./~/ng2-material/components/pagination/index.js","webpack:///./~/ng2-material/components/pagination/pagination_service.js","webpack:///./~/ng2-material/components/peekaboo/peekaboo.js","webpack:///./~/ng2-material/components/subheader/subheader.js","webpack:///./~/ng2-material/core/util/util.module.js","webpack:///./~/@angular2-mdl-ext/popover/index.umd.js","webpack:///./~/@angular2-mdl-ext/select/index.umd.js","webpack:///./src/app/app.module.ts","webpack:///./src/app/components/editors/remap-confirmation-pwd/dashboard.component.ts","webpack:///./src/app/components/editors/rev-split-values/dashboard.component.ts","webpack:///./src/app/components/editors/subids/subid.component.ts","webpack:///./src/app/pages/dashboards/by-month/dashboard.component.ts","webpack:///./src/app/shared/http/custom-http.ts","webpack:///./src/app/shared/layout/layout.component.ts","webpack:///./src/app/shared/routing/app.routes.ts","webpack:///./src/app/shared/services/chargebacks.service.ts","webpack:///./src/app/shared/services/credits_cards.ts","webpack:///./src/app/shared/services/iso.service.ts","webpack:///./src/app/shared/services/rev_split_values.service.ts","webpack:///./src/app/shared/services/today.service.ts","webpack:///./src/main.ts","webpack:///./~/md2/md2.umd.js","webpack:///./~/ng2-charts/components/charts/charts.js","webpack:///./~/ng2-completer/ng2-completer.umd.js","webpack:///./~/ng2-material/components/dialog/dialog.module.js","webpack:///./~/ng2-material/components/dialog/index.js","webpack:///./~/ng2-material/components/pagination/pagination.js","webpack:///./~/ng2-material/core/key_codes.js","webpack:///./~/ng2-material/index.js","webpack:///./src/app/auth-callback/auth-callback.component.html","webpack:///./src/app/auth/login.component.html","webpack:///./src/app/components/chartjs/by-day/by-day.html","webpack:///./src/app/components/chartjs/by-month/by-month.html","webpack:///./src/app/components/chartjs/by-network/by-network.html","webpack:///./src/app/components/chartjs/type-by-day/by-day.html","webpack:///./src/app/components/editors/remap-confirmation-pwd/dashboard.component.html","webpack:///./src/app/components/editors/rev-split-values/dashboard.component.html","webpack:///./src/app/components/editors/subids/subid.component.html","webpack:///./src/app/pages/dashboards/ads-by-day/dashboard.component.html","webpack:///./src/app/pages/dashboards/aim-sales/dashboard.component.html","webpack:///./src/app/pages/dashboards/balance-by-day/dashboard.component.html","webpack:///./src/app/pages/dashboards/billing-statements/dashboard.component.html","webpack:///./src/app/pages/dashboards/by-day/dashboard.component.html","webpack:///./src/app/pages/dashboards/by-month/dashboard.component.html","webpack:///./src/app/pages/dashboards/cb-tracker/dashboard.component.html","webpack:///./src/app/pages/dashboards/credit-cards/dashboard.component.html","webpack:///./src/app/pages/dashboards/data-by-network/dashboard.component.html","webpack:///./src/app/pages/dashboards/edw-billing-performance/dashboard.component.html","webpack:///./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.html","webpack:///./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.html","webpack:///./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.html","webpack:///./src/app/pages/dashboards/gateway-data/dashboard.component.html","webpack:///./src/app/pages/dashboards/gateway-status/dashboard.component.html","webpack:///./src/app/pages/dashboards/iso-data/dashboard.component.html","webpack:///./src/app/pages/dashboards/main/dashboard.component.html","webpack:///./src/app/pages/dashboards/networks/dashboard.component.html","webpack:///./src/app/pages/dashboards/pandl/dashboard.component.html","webpack:///./src/app/pages/dashboards/rev-split-values/dashboard.component.html","webpack:///./src/app/pages/dashboards/revenue-analysis/dashboard.component.html","webpack:///./src/app/pages/dashboards/revenue-by-subid/dashboard.component.html","webpack:///./src/app/pages/dashboards/revenue-daily/dashboard.component.html","webpack:///./src/app/pages/dashboards/spend-analysis/dashboard.component.html","webpack:///./src/app/pages/dashboards/sub-ids/dashboard.component.html","webpack:///./src/app/pages/dashboards/tonic-today/dashboard.component.html","webpack:///./src/app/shared/layout/layout.component.html","webpack:///./src/app/auth-callback/auth-callback.component.css","webpack:///./src/app/auth/login.component.css","webpack:///./src/app/pages/dashboards/aim-sales/dashboard.component.css","webpack:///./src/app/pages/dashboards/billing-statements/dashboard.component.css","webpack:///./src/app/pages/dashboards/cb-tracker/dashboard.component.css","webpack:///./src/app/pages/dashboards/credit-cards/dashboard.component.css","webpack:///./src/app/pages/dashboards/data-by-network/dashboard.component.css","webpack:///./src/app/pages/dashboards/edw-billing-performance/dashboard.component.css","webpack:///./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.css","webpack:///./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.css","webpack:///./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.css","webpack:///./src/app/pages/dashboards/gateway-data/dashboard.component.css","webpack:///./src/app/pages/dashboards/gateway-status/dashboard.component.css","webpack:///./src/app/pages/dashboards/iso-data/dashboard.component.css","webpack:///./src/app/pages/dashboards/main/dashboard.component.css","webpack:///./src/app/pages/dashboards/pandl/dashboard.component.css","webpack:///./src/app/pages/dashboards/rev-split-values/dashboard.component.css","webpack:///./src/app/pages/dashboards/revenue-analysis/dashboard.component.css","webpack:///./src/app/pages/dashboards/revenue-by-subid/dashboard.component.css","webpack:///./src/app/pages/dashboards/revenue-daily/dashboard.component.css","webpack:///./src/app/pages/dashboards/spend-analysis/dashboard.component.css","webpack:///./src/app/pages/dashboards/sub-ids/dashboard.component.css","webpack:///./src/app/shared/layout/layout.component.css"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class SettingsService {\n\n  private baseURL = 'api/settings';  // URL to web api\n\n  constructor(private http: Http) { }\n\n  getReportColumns( type, name ): Promise<any> {\n    var url  = '/columns';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { type: type, name: name } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getSubids( query ): Promise<any> {\n    var url  = '/subids';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getPendingSubIDs( query ): Promise<any> {\n    var url  = '/pendingSubIDs';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  isMappingRunning( query ): Promise<any> {\n    var url  = '/isMappingRunning';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  verifyRemapPassword( password ): Promise<any> {\n    var url  = '/verify_remap_password';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { password: password } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }  \n\n  remapBack( daysback, orArray ): Promise<any> {\n    var url  = '/remap';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { daysback: daysback, orArray: orArray } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getOffers( ): Promise<any> {\n    var url  = '/offers';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: {} } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getSetting( query ): Promise<any> {\n    var url  = '/setting';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getDomains( ): Promise<any> {\n    var url  = '/setting_domains';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {} ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getAudiences( ): Promise<any> {\n    var url  = '/setting_audiences';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {} ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getChannels( ): Promise<any> {\n    var query = { type : 'setting_channels' }\n    return this.getSetting( query )\n  }\n\n  getSubChannels( ): Promise<any> {\n    var query = { type : 'setting_sub_channels' }\n    return this.getSetting( query )\n  }\n\n  getBillingStatementUsers( ): Promise<any> {\n    var url  = '/billing_statements_users';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {} ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getBillingStatementCompanies( ): Promise<any> {\n    var url  = '/billing_statements_companies';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {} ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }  \n\n  getNetworks( ): Promise<any> {\n    var query = { type : 'setting_networks' }\n    return this.getSetting( query )\n  }\n\n  getSpendNetworks( ): Promise<any> {\n    var query = { type : 'setting_spend_networks' }\n    return this.getSetting( query )\n  }\n\n  getGateways( query ): Promise<any> {\n    var url  = '/gateways';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getGatewaySettings( group, query ): Promise<any> {\n    var url  = '/gateways-settings';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query, group : group } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getGatewayskErrors(): Promise<any> {\n    return this.getErrors( { network_type : 'gateway'} );\n  }\n\n  getNetworkErrors(): Promise<any> {\n    return this.getErrors( { network_type : 'network' } );\n  }\n\n  getISOsErrors(): Promise<any> {\n    return this.getErrors( { network_type : 'iso'} );\n  }\n\n  getErrors( query ): Promise<any> {\n    var url  = '/errors';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  saveSubid( subid ): Promise<any> {\n    var url  = '/save-subid';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { subid: subid } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/settings.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n//import {DailyStats} from '../data/daily-stats';\n\n@Injectable()\nexport class StatsService {\n\n  private baseURL = 'api/stats';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getTotal( fromDate, toDate ): Promise<any> {\n    var url  = '/total';\n    var query = { revenue: { '$gte': 0 } };\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getExpenseSummary( fromDate, toDate ): Promise<any> {\n    var url  = '/totalExpense';\n    var query = { spend: { '$gte': 0 } };\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getTotalByNetwork( type, fromDate, toDate ): Promise<any> {\n    var url  = '/total/bynetwork';\n    var query = { network_type : type };\n    return this.post(fromDate, toDate, query, url);\n    //return this.http\n    //  .post(this.baseURL + sURL, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ), {headers: this.headers})\n    //  .toPromise()\n    //  .then(response => response.json() as any)\n    //  .catch(this.handleError);\n  }\n\n  getTotalByDay( fromDate, toDate, query ): Promise<any> {\n    var url  = '/total/byday';\n    return this.post(fromDate, toDate, query, url);\n    //return this.http\n    //  .post(this.baseURL + sURL, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ), {headers: this.headers})\n    //  .toPromise()\n    //  .then(response => response.json() as any)\n    //  .catch(this.handleError);\n  }\n\n  getTotalByDayType( fromDate, toDate, query ): Promise<any> {\n    var url  = '/total/bydaytype';\n    return this.post(fromDate, toDate, query, url);\n    //return this.http\n    //  .post(this.baseURL + sURL, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ), {headers: this.headers})\n    //  .toPromise()\n    //  .then(response => response.json() as any)\n    //  .catch(this.handleError);\n  }\n\n  getTotalBySubid( fromDate, toDate, query ): Promise<any> {\n    var url  = '/total/bysubid';\n    return this.post(fromDate, toDate, query, url);\n    //return this.http\n    //  .post(this.baseURL + sURL, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ), {headers: this.headers})\n    //  .toPromise()\n    //  .then(response => response.json() as any)\n    //  .catch(this.handleError);\n  }\n\n  getDataDailyRevenue( fromDate, toDate, query, aggregate, showBadDebt ): Promise<any> {\n    var url  = '/data/daily-revenue?aggregate='+aggregate+'&showBadDebt='+showBadDebt;\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getDayxreport( fromDate, toDate, query ): Promise<any> {\n    var url  = '/data/day-x-report';\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getSubChannelDayReport( fromDate, toDate, query ): Promise<any> {\n    var url  = '/data/day-sub-channel-report';\n    return this.post(fromDate, toDate, query, url);\n  }  \n\n  getDataDailyRevenueDetails( fromDate, toDate, query, group, showBadDebt, sort ): Promise<any> {\n    var url  = '/data/daily-revenue-details';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query, group : group, showBadDebt : showBadDebt, sort: sort } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getDataByNetwork( fromDate, toDate, query ): Promise<any> {\n    var url  = '/data/bynetwork';\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/stats.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class NetworksService {\n\n  private baseURL = 'api/networks';  // URL to web api\n\n  constructor(private http: Http) { }\n\n  networksWithdelay( ): Promise<any> {\n    return this.withdelay( { network_type : 'network'} );\n  }\n\n  isosWithdelay( ): Promise<any> {\n    return this.withdelay( { network_type : 'iso'} );\n  }\n\n  gatewaysWithdelay( ): Promise<any> {\n    return this.withdelay( { network_type : 'gateway'} );\n  }\n\n  withdelay( query ): Promise<any> {\n    var url  = '/withdelay';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/networks.service.ts\n **/","/**\n  * @license Angular Material v2.0.0-beta.1\n  * Copyright (c) 2016 Google, Inc. https://material.angular.io/\n  * License: MIT\n  */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/Subject'), require('rxjs/Observable'), require('rxjs/add/observable/fromEvent'), require('@angular/common'), require('@angular/platform-browser'), require('@angular/forms'), require('@angular/http'), require('rxjs/add/observable/forkJoin'), require('rxjs/add/observable/of'), require('rxjs/add/operator/map'), require('rxjs/add/operator/filter'), require('rxjs/add/operator/do'), require('rxjs/add/operator/share'), require('rxjs/add/operator/finally'), require('rxjs/add/operator/catch'), require('rxjs/add/operator/first')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core', 'rxjs/Subject', 'rxjs/Observable', 'rxjs/add/observable/fromEvent', '@angular/common', '@angular/platform-browser', '@angular/forms', '@angular/http', 'rxjs/add/observable/forkJoin', 'rxjs/add/observable/of', 'rxjs/add/operator/map', 'rxjs/add/operator/filter', 'rxjs/add/operator/do', 'rxjs/add/operator/share', 'rxjs/add/operator/finally', 'rxjs/add/operator/catch', 'rxjs/add/operator/first'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}),global.ng.core,global.Rx,global.Rx,global.Rx.Observable,global.ng.common,global.ng.platformBrowser,global.ng.forms,global.ng.http,global.Rx.Observable,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype));\n}(this, (function (exports,_angular_core,rxjs_Subject,rxjs_Observable,rxjs_add_observable_fromEvent,_angular_common,_angular_platformBrowser,_angular_forms,_angular_http,rxjs_add_observable_forkJoin,rxjs_add_observable_of,rxjs_add_operator_map,rxjs_add_operator_filter,rxjs_add_operator_do,rxjs_add_operator_share,rxjs_add_operator_finally,rxjs_add_operator_catch,rxjs_add_operator_first) { 'use strict';\n\nvar __decorate$2 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$2 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MATERIAL_COMPATIBILITY_MODE = new _angular_core.OpaqueToken('md-compatibiility-mode');\n/** Selector that matches all elements that may have style collisions with material1. */\nvar MAT_ELEMENTS_SELECTOR = \"\\n  mat-autocomplete,\\n  mat-card,\\n  mat-card-actions,\\n  mat-card-content,\\n  mat-card-footer,\\n  mat-card-header,\\n  mat-card-subtitle,\\n  mat-card-title,\\n  mat-card-title-group,\\n  mat-checkbox,\\n  mat-chip,\\n  mat-dialog-container,\\n  mat-divider,\\n  mat-grid-list,\\n  mat-grid-tile,\\n  mat-grid-tile-footer,\\n  mat-grid-tile-header,\\n  mat-hint,\\n  mat-icon,\\n  mat-ink-bar,\\n  mat-input,\\n  mat-list,\\n  mat-list-item,\\n  mat-menu,\\n  mat-nav-list,\\n  mat-option,\\n  mat-placeholder,\\n  mat-progress-bar,\\n  mat-progress-circle,\\n  mat-radio-button,\\n  mat-radio-group,\\n  mat-select,\\n  mat-sidenav,\\n  mat-slider,\\n  mat-spinner,\\n  mat-tab,\\n  mat-toolbar\\n\";\n/** Directive that enforces that the `mat-` prefix cannot be used. */\nvar MatPrefixEnforcer = (function () {\n    function MatPrefixEnforcer(isCompatibilityMode) {\n        if (!isCompatibilityMode) {\n            throw Error('The \"mat-\" prefix cannot be used out of ng-material v1 compatibility mode.');\n        }\n    }\n    MatPrefixEnforcer = __decorate$2([\n        _angular_core.Directive({ selector: MAT_ELEMENTS_SELECTOR }),\n        __param(0, _angular_core.Inject(MATERIAL_COMPATIBILITY_MODE)), \n        __metadata$2('design:paramtypes', [Boolean])\n    ], MatPrefixEnforcer);\n    return MatPrefixEnforcer;\n}());\n/**\n * Module that enforces the default \"compatibility mode\" settings. When this module is loaded\n * without NoConflictStyleCompatibilityMode also being imported, it will throw an error if\n * there are any uses of the `mat-` prefix.\n *\n * Because the point of this directive is to *not* be used, it will be tree-shaken away by\n * optimizers when not in compatibility mode.\n */\nvar DefaultStyleCompatibilityModeModule = (function () {\n    function DefaultStyleCompatibilityModeModule() {\n    }\n    DefaultStyleCompatibilityModeModule.forRoot = function () {\n        return {\n            ngModule: DefaultStyleCompatibilityModeModule,\n            providers: [],\n        };\n    };\n    DefaultStyleCompatibilityModeModule = __decorate$2([\n        _angular_core.NgModule({\n            declarations: [MatPrefixEnforcer],\n            exports: [MatPrefixEnforcer],\n            providers: [{\n                    provide: MATERIAL_COMPATIBILITY_MODE, useValue: false,\n                }]\n        }), \n        __metadata$2('design:paramtypes', [])\n    ], DefaultStyleCompatibilityModeModule);\n    return DefaultStyleCompatibilityModeModule;\n}());\n\nvar __decorate$1 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$1 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Shared directive to count lines inside a text area, such as a list item.\n * Line elements can be extracted with a @ContentChildren(MdLine) query, then\n * counted by checking the query list's length.\n */\nvar MdLine = (function () {\n    function MdLine() {\n    }\n    MdLine = __decorate$1([\n        _angular_core.Directive({ selector: '[md-line], [mat-line]' }), \n        __metadata$1('design:paramtypes', [])\n    ], MdLine);\n    return MdLine;\n}());\n/**\n * Helper that takes a query list of lines and sets the correct class on the host.\n * @docs-private\n */\nvar MdLineSetter = (function () {\n    function MdLineSetter(_lines, _renderer, _element) {\n        var _this = this;\n        this._lines = _lines;\n        this._renderer = _renderer;\n        this._element = _element;\n        this._setLineClass(this._lines.length);\n        this._lines.changes.subscribe(function () {\n            _this._setLineClass(_this._lines.length);\n        });\n    }\n    MdLineSetter.prototype._setLineClass = function (count) {\n        this._resetClasses();\n        if (count === 2 || count === 3) {\n            this._setClass(\"md-\" + count + \"-line\", true);\n        }\n        else if (count > 3) {\n            this._setClass(\"md-multi-line\", true);\n        }\n    };\n    MdLineSetter.prototype._resetClasses = function () {\n        this._setClass('md-2-line', false);\n        this._setClass('md-3-line', false);\n        this._setClass('md-multi-line', false);\n    };\n    MdLineSetter.prototype._setClass = function (className, bool) {\n        this._renderer.setElementClass(this._element.nativeElement, className, bool);\n    };\n    return MdLineSetter;\n}());\nvar MdLineModule = (function () {\n    function MdLineModule() {\n    }\n    MdLineModule = __decorate$1([\n        _angular_core.NgModule({\n            imports: [DefaultStyleCompatibilityModeModule],\n            exports: [MdLine, DefaultStyleCompatibilityModeModule],\n            declarations: [MdLine],\n        }), \n        __metadata$1('design:paramtypes', [])\n    ], MdLineModule);\n    return MdLineModule;\n}());\n\nvar __decorate$3 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$3 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive to listen for changes of direction of part of the DOM.\n *\n * Applications should use this directive instead of the native attribute so that Material\n * components can listen on changes of direction.\n */\nvar Dir = (function () {\n    function Dir() {\n        /** Layout direction of the element. */\n        this._dir = 'ltr';\n        /** Event emitted when the direction changes. */\n        this.dirChange = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(Dir.prototype, \"dir\", {\n        /** @docs-private */\n        get: function () {\n            return this._dir;\n        },\n        set: function (v) {\n            var old = this._dir;\n            this._dir = v;\n            if (old != this._dir) {\n                this.dirChange.emit();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Dir.prototype, \"value\", {\n        /** Current layout direction of the element. */\n        get: function () { return this.dir; },\n        set: function (v) { this.dir = v; },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$3([\n        _angular_core.Input('dir'), \n        __metadata$3('design:type', String)\n    ], Dir.prototype, \"_dir\", void 0);\n    __decorate$3([\n        _angular_core.Output(), \n        __metadata$3('design:type', Object)\n    ], Dir.prototype, \"dirChange\", void 0);\n    __decorate$3([\n        _angular_core.HostBinding('attr.dir'), \n        __metadata$3('design:type', String)\n    ], Dir.prototype, \"dir\", null);\n    Dir = __decorate$3([\n        _angular_core.Directive({\n            selector: '[dir]',\n            // TODO(hansl): maybe `$implicit` isn't the best option here, but for now that's the best we got.\n            exportAs: '$implicit'\n        }), \n        __metadata$3('design:paramtypes', [])\n    ], Dir);\n    return Dir;\n}());\nvar RtlModule = (function () {\n    function RtlModule() {\n    }\n    RtlModule.forRoot = function () {\n        return {\n            ngModule: RtlModule,\n            providers: []\n        };\n    };\n    RtlModule = __decorate$3([\n        _angular_core.NgModule({\n            exports: [Dir],\n            declarations: [Dir]\n        }), \n        __metadata$3('design:paramtypes', [])\n    ], RtlModule);\n    return RtlModule;\n}());\n\nvar __decorate$4 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$4 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\nvar ObserveContent = (function () {\n    function ObserveContent(_elementRef) {\n        this._elementRef = _elementRef;\n        /** Event emitted for each change in the element's content. */\n        this.event = new _angular_core.EventEmitter();\n    }\n    ObserveContent.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        this._observer = new MutationObserver(function (mutations) { return mutations.forEach(function () { return _this.event.emit(); }); });\n        this._observer.observe(this._elementRef.nativeElement, {\n            characterData: true,\n            childList: true,\n            subtree: true\n        });\n    };\n    ObserveContent.prototype.ngOnDestroy = function () {\n        if (this._observer) {\n            this._observer.disconnect();\n        }\n    };\n    __decorate$4([\n        _angular_core.Output('cdkObserveContent'), \n        __metadata$4('design:type', Object)\n    ], ObserveContent.prototype, \"event\", void 0);\n    ObserveContent = __decorate$4([\n        _angular_core.Directive({\n            selector: '[cdkObserveContent]'\n        }), \n        __metadata$4('design:paramtypes', [_angular_core.ElementRef])\n    ], ObserveContent);\n    return ObserveContent;\n}());\nvar ObserveContentModule = (function () {\n    function ObserveContentModule() {\n    }\n    ObserveContentModule.forRoot = function () {\n        return {\n            ngModule: ObserveContentModule,\n            providers: []\n        };\n    };\n    ObserveContentModule = __decorate$4([\n        _angular_core.NgModule({\n            exports: [ObserveContent],\n            declarations: [ObserveContent]\n        }), \n        __metadata$4('design:paramtypes', [])\n    ], ObserveContentModule);\n    return ObserveContentModule;\n}());\n\n/** @docs-private */\nvar ForegroundRippleState;\n(function (ForegroundRippleState) {\n    ForegroundRippleState[ForegroundRippleState[\"NEW\"] = 0] = \"NEW\";\n    ForegroundRippleState[ForegroundRippleState[\"EXPANDING\"] = 1] = \"EXPANDING\";\n    ForegroundRippleState[ForegroundRippleState[\"FADING_OUT\"] = 2] = \"FADING_OUT\";\n})(ForegroundRippleState || (ForegroundRippleState = {}));\n/**\n * Wrapper for a foreground ripple DOM element and its animation state.\n * @docs-private\n */\nvar ForegroundRipple = (function () {\n    function ForegroundRipple(rippleElement) {\n        this.rippleElement = rippleElement;\n        this.state = ForegroundRippleState.NEW;\n    }\n    return ForegroundRipple;\n}());\nvar RIPPLE_SPEED_PX_PER_SECOND = 1000;\nvar MIN_RIPPLE_FILL_TIME_SECONDS = 0.1;\nvar MAX_RIPPLE_FILL_TIME_SECONDS = 0.3;\n/**\n * Returns the distance from the point (x, y) to the furthest corner of a rectangle.\n */\nvar distanceToFurthestCorner = function (x, y, rect) {\n    var distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));\n    var distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));\n    return Math.sqrt(distX * distX + distY * distY);\n};\n/**\n * Helper service that performs DOM manipulations. Not intended to be used outside this module.\n * The constructor takes a reference to the ripple directive's host element and a map of DOM\n * event handlers to be installed on the element that triggers ripple animations.\n * This will eventually become a custom renderer once Angular support exists.\n * @docs-private\n */\nvar RippleRenderer = (function () {\n    function RippleRenderer(_elementRef, _eventHandlers, _ngZone) {\n        this._eventHandlers = _eventHandlers;\n        this._ngZone = _ngZone;\n        this._rippleElement = _elementRef.nativeElement;\n        // The background div is created in createBackgroundIfNeeded when the ripple becomes enabled.\n        // This avoids creating unneeded divs when the ripple is always disabled.\n        this._backgroundDiv = null;\n    }\n    /** Creates the div for the ripple background, if it doesn't already exist. */\n    RippleRenderer.prototype.createBackgroundIfNeeded = function () {\n        if (!this._backgroundDiv) {\n            this._backgroundDiv = document.createElement('div');\n            this._backgroundDiv.classList.add('md-ripple-background');\n            this._rippleElement.appendChild(this._backgroundDiv);\n        }\n    };\n    /**\n     * Installs event handlers on the given trigger element, and removes event handlers from the\n     * previous trigger if needed.\n     *\n     * @param newTrigger New trigger to which to attach the ripple handlers.\n     */\n    RippleRenderer.prototype.setTriggerElement = function (newTrigger) {\n        var _this = this;\n        if (this._triggerElement !== newTrigger) {\n            if (this._triggerElement) {\n                this._eventHandlers.forEach(function (eventHandler, eventName) {\n                    _this._triggerElement.removeEventListener(eventName, eventHandler);\n                });\n            }\n            this._triggerElement = newTrigger;\n            if (this._triggerElement) {\n                this._eventHandlers.forEach(function (eventHandler, eventName) {\n                    _this._triggerElement.addEventListener(eventName, eventHandler);\n                });\n            }\n        }\n    };\n    /** Installs event handlers on the host element of the md-ripple directive. */\n    RippleRenderer.prototype.setTriggerElementToHost = function () {\n        this.setTriggerElement(this._rippleElement);\n    };\n    /** Removes event handlers from the current trigger element if needed. */\n    RippleRenderer.prototype.clearTriggerElement = function () {\n        this.setTriggerElement(null);\n    };\n    /**\n     * Creates a foreground ripple and sets its animation to expand and fade in from the position\n     * given by rippleOriginLeft and rippleOriginTop (or from the center of the <md-ripple>\n     * bounding rect if centered is true).\n     *\n     * @param rippleOriginLeft Left origin of the ripple.\n     * @param rippleOriginTop Top origin of the ripple.\n     * @param color Ripple color.\n     * @param centered Whether the ripple should be centered.\n     * @param radius Radius of the ripple.\n     * @param speedFactor Speed at which the ripple expands towards the edges.\n     * @param transitionEndCallback Callback to be triggered when the ripple transition is done.\n     */\n    RippleRenderer.prototype.createForegroundRipple = function (rippleOriginLeft, rippleOriginTop, color, centered, radius, speedFactor, transitionEndCallback) {\n        var _this = this;\n        var parentRect = this._rippleElement.getBoundingClientRect();\n        // Create a foreground ripple div with the size and position of the fully expanded ripple.\n        // When the div is created, it's given a transform style that causes the ripple to be displayed\n        // small and centered on the event location (or the center of the bounding rect if the centered\n        // argument is true). Removing that transform causes the ripple to animate to its natural size.\n        var startX = centered ? (parentRect.left + parentRect.width / 2) : rippleOriginLeft;\n        var startY = centered ? (parentRect.top + parentRect.height / 2) : rippleOriginTop;\n        var offsetX = startX - parentRect.left;\n        var offsetY = startY - parentRect.top;\n        var maxRadius = radius > 0 ? radius : distanceToFurthestCorner(startX, startY, parentRect);\n        var rippleDiv = document.createElement('div');\n        this._rippleElement.appendChild(rippleDiv);\n        rippleDiv.classList.add('md-ripple-foreground');\n        rippleDiv.style.left = (offsetX - maxRadius) + \"px\";\n        rippleDiv.style.top = (offsetY - maxRadius) + \"px\";\n        rippleDiv.style.width = 2 * maxRadius + \"px\";\n        rippleDiv.style.height = rippleDiv.style.width;\n        // If color input is not set, this will default to the background color defined in CSS.\n        rippleDiv.style.backgroundColor = color;\n        // Start the ripple tiny.\n        rippleDiv.style.transform = \"scale(0.001)\";\n        var fadeInSeconds = (1 / (speedFactor || 1)) * Math.max(MIN_RIPPLE_FILL_TIME_SECONDS, Math.min(MAX_RIPPLE_FILL_TIME_SECONDS, maxRadius / RIPPLE_SPEED_PX_PER_SECOND));\n        rippleDiv.style.transitionDuration = fadeInSeconds + \"s\";\n        // https://timtaubert.de/blog/2012/09/css-transitions-for-dynamically-created-dom-elements/\n        // Store the opacity to prevent this line as being seen as a no-op by optimizers.\n        this._opacity = window.getComputedStyle(rippleDiv).opacity;\n        rippleDiv.classList.add('md-ripple-fade-in');\n        // Clearing the transform property causes the ripple to animate to its full size.\n        rippleDiv.style.transform = '';\n        var ripple = new ForegroundRipple(rippleDiv);\n        ripple.state = ForegroundRippleState.EXPANDING;\n        rippleDiv.addEventListener('transitionend', function (event) { return transitionEndCallback(ripple, event); });\n        // Ensure that ripples are always removed, even when transitionend doesn't fire.\n        // Run this outside the Angular zone because there's nothing that Angular cares about.\n        // If it were to run inside the Angular zone, every test that used ripples would have to be\n        // either async or fakeAsync.\n        this._ngZone.runOutsideAngular(function () {\n            // The ripple lasts a time equal to the sum of fade-in, transform,\n            // and fade-out (3 * fade-in time).\n            var rippleDuration = fadeInSeconds * 3 * 1000;\n            setTimeout(function () { return _this.removeRippleFromDom(ripple.rippleElement); }, rippleDuration);\n        });\n    };\n    /**\n     * Fades out a foreground ripple after it has fully expanded and faded in.\n     * @param ripple Ripple to be faded out.\n     */\n    RippleRenderer.prototype.fadeOutForegroundRipple = function (ripple) {\n        ripple.classList.remove('md-ripple-fade-in');\n        ripple.classList.add('md-ripple-fade-out');\n    };\n    /**\n     * Removes a foreground ripple from the DOM after it has faded out.\n     * @param ripple Ripple to be removed from the DOM.\n     */\n    RippleRenderer.prototype.removeRippleFromDom = function (ripple) {\n        if (ripple && ripple.parentElement) {\n            ripple.parentElement.removeChild(ripple);\n        }\n    };\n    /**\n     * Fades in the ripple background.\n     * @param color New background color for the ripple.\n     */\n    RippleRenderer.prototype.fadeInRippleBackground = function (color) {\n        this._backgroundDiv.classList.add('md-ripple-active');\n        // If color is not set, this will default to the background color defined in CSS.\n        this._backgroundDiv.style.backgroundColor = color;\n    };\n    /** Fades out the ripple background. */\n    RippleRenderer.prototype.fadeOutRippleBackground = function () {\n        if (this._backgroundDiv) {\n            this._backgroundDiv.classList.remove('md-ripple-active');\n        }\n    };\n    return RippleRenderer;\n}());\n\nvar __decorate$6 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$6 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\nvar ViewportRuler = (function () {\n    function ViewportRuler() {\n    }\n    // TODO(jelbourn): cache the document's bounding rect and only update it when the window\n    // is resized (debounced).\n    /** Gets a ClientRect for the viewport's bounds. */\n    ViewportRuler.prototype.getViewportRect = function () {\n        // Use the document element's bounding rect rather than the window scroll properties\n        // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n        // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n        // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n        // can disagree when the page is pinch-zoomed (on devices that support touch).\n        // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n        // We use the documentElement instead of the body because, by default (without a css reset)\n        // browsers typically give the document body an 8px margin, which is not included in\n        // getBoundingClientRect().\n        var documentRect = document.documentElement.getBoundingClientRect();\n        var scrollPosition = this.getViewportScrollPosition(documentRect);\n        var height = window.innerHeight;\n        var width = window.innerWidth;\n        return {\n            top: scrollPosition.top,\n            left: scrollPosition.left,\n            bottom: scrollPosition.top + height,\n            right: scrollPosition.left + width,\n            height: height,\n            width: width,\n        };\n    };\n    /**\n     * Gets the (top, left) scroll position of the viewport.\n     * @param documentRect\n     */\n    ViewportRuler.prototype.getViewportScrollPosition = function (documentRect) {\n        if (documentRect === void 0) { documentRect = document.documentElement.getBoundingClientRect(); }\n        // The top-left-corner of the viewport is determined by the scroll position of the document\n        // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n        // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n        // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n        // `document.documentElement` works consistently, where the `top` and `left` values will\n        // equal negative the scroll position.\n        var top = -documentRect.top || document.body.scrollTop || window.scrollY || 0;\n        var left = -documentRect.left || document.body.scrollLeft || window.scrollX || 0;\n        return { top: top, left: left };\n    };\n    ViewportRuler = __decorate$6([\n        _angular_core.Injectable(), \n        __metadata$6('design:paramtypes', [])\n    ], ViewportRuler);\n    return ViewportRuler;\n}());\n\nvar __decorate$5 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$5 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdRipple = (function () {\n    function MdRipple(_elementRef, _ngZone, _ruler) {\n        var _this = this;\n        /**\n         * If set, the radius in pixels of foreground ripples when fully expanded. If unset, the radius\n         * will be the distance from the center of the ripple to the furthest corner of the host element's\n         * bounding rectangle.\n         */\n        this.maxRadius = 0;\n        /**\n         * If set, the normal duration of ripple animations is divided by this value. For example,\n         * setting it to 0.5 will cause the animations to take twice as long.\n         */\n        this.speedFactor = 1;\n        // These event handlers are attached to the element that triggers the ripple animations.\n        var eventHandlers = new Map();\n        eventHandlers.set('mousedown', function (event) { return _this._mouseDown(event); });\n        eventHandlers.set('click', function (event) { return _this._click(event); });\n        eventHandlers.set('mouseleave', function (event) { return _this._mouseLeave(event); });\n        this._rippleRenderer = new RippleRenderer(_elementRef, eventHandlers, _ngZone);\n        this._ruler = _ruler;\n    }\n    Object.defineProperty(MdRipple.prototype, \"_triggerDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.trigger; },\n        set: function (value) { this.trigger = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_centeredDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.centered; },\n        set: function (value) { this.centered = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_disabledDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.disabled; },\n        set: function (value) { this.disabled = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_maxRadiusDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.maxRadius; },\n        set: function (value) { this.maxRadius = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_speedFactorDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.speedFactor; },\n        set: function (value) { this.speedFactor = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_colorDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.color; },\n        set: function (value) { this.color = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_backgroundColorDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.backgroundColor; },\n        set: function (value) { this.backgroundColor = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_focusedDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.focused; },\n        set: function (value) { this.focused = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdRipple.prototype, \"_unboundedDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.unbounded; },\n        set: function (value) { this.unbounded = value; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    MdRipple.prototype.ngOnInit = function () {\n        // If no trigger element was explicity set, use the host element\n        if (!this.trigger) {\n            this._rippleRenderer.setTriggerElementToHost();\n        }\n        if (!this.disabled) {\n            this._rippleRenderer.createBackgroundIfNeeded();\n        }\n    };\n    MdRipple.prototype.ngOnDestroy = function () {\n        // Remove event listeners on the trigger element.\n        this._rippleRenderer.clearTriggerElement();\n    };\n    MdRipple.prototype.ngOnChanges = function (changes) {\n        // If the trigger element changed (or is being initially set), add event listeners to it.\n        var changedInputs = Object.keys(changes);\n        if (changedInputs.indexOf('trigger') !== -1) {\n            this._rippleRenderer.setTriggerElement(this.trigger);\n        }\n        if (!this.disabled) {\n            this._rippleRenderer.createBackgroundIfNeeded();\n        }\n    };\n    /**\n     * Responds to the start of a ripple animation trigger by fading the background in.\n     */\n    MdRipple.prototype.start = function () {\n        this._rippleRenderer.createBackgroundIfNeeded();\n        this._rippleRenderer.fadeInRippleBackground(this.backgroundColor);\n    };\n    /**\n     * Responds to the end of a ripple animation trigger by fading the background out, and creating a\n     * foreground ripple that expands from the event location (or from the center of the element if\n     * the \"centered\" property is set or forceCenter is true).\n     */\n    MdRipple.prototype.end = function (left, top, forceCenter) {\n        var _this = this;\n        if (forceCenter === void 0) { forceCenter = true; }\n        this._rippleRenderer.createForegroundRipple(left, top, this.color, this.centered || forceCenter, this.maxRadius, this.speedFactor, function (ripple, e) { return _this._rippleTransitionEnded(ripple, e); });\n        this._rippleRenderer.fadeOutRippleBackground();\n    };\n    MdRipple.prototype._rippleTransitionEnded = function (ripple, event) {\n        if (event.propertyName === 'opacity') {\n            // If the ripple finished expanding, start fading it out. If it finished fading out,\n            // remove it from the DOM.\n            switch (ripple.state) {\n                case ForegroundRippleState.EXPANDING:\n                    this._rippleRenderer.fadeOutForegroundRipple(ripple.rippleElement);\n                    ripple.state = ForegroundRippleState.FADING_OUT;\n                    break;\n                case ForegroundRippleState.FADING_OUT:\n                    this._rippleRenderer.removeRippleFromDom(ripple.rippleElement);\n                    break;\n            }\n        }\n    };\n    /**\n     * Called when the trigger element receives a mousedown event. Starts the ripple animation by\n     * fading in the background.\n     */\n    MdRipple.prototype._mouseDown = function (event) {\n        if (!this.disabled && event.button === 0) {\n            this.start();\n        }\n    };\n    /**\n     * Called when the trigger element receives a click event. Creates a foreground ripple and\n     * runs its animation.\n     */\n    MdRipple.prototype._click = function (event) {\n        if (!this.disabled && event.button === 0) {\n            // If screen and page positions are all 0, this was probably triggered by a keypress.\n            // In that case, use the center of the bounding rect as the ripple origin.\n            // FIXME: This fails on IE11, which still sets pageX/Y and screenX/Y on keyboard clicks.\n            var isKeyEvent = (event.screenX === 0 && event.screenY === 0 && event.pageX === 0 && event.pageY === 0);\n            this.end(event.pageX - this._ruler.getViewportScrollPosition().left, event.pageY - this._ruler.getViewportScrollPosition().top, isKeyEvent);\n        }\n    };\n    /**\n     * Called when the trigger element receives a mouseleave event. Fades out the background.\n     */\n    MdRipple.prototype._mouseLeave = function (event) {\n        // We can always fade out the background here; It's a no-op if it was already inactive.\n        this._rippleRenderer.fadeOutRippleBackground();\n    };\n    __decorate$5([\n        _angular_core.Input('mdRippleTrigger'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"trigger\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-trigger'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_triggerDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleCentered'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"centered\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-centered'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_centeredDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleDisabled'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"disabled\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-disabled'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_disabledDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleMaxRadius'), \n        __metadata$5('design:type', Number)\n    ], MdRipple.prototype, \"maxRadius\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-max-radius'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_maxRadiusDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleSpeedFactor'), \n        __metadata$5('design:type', Number)\n    ], MdRipple.prototype, \"speedFactor\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-speed-factor'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_speedFactorDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleColor'), \n        __metadata$5('design:type', String)\n    ], MdRipple.prototype, \"color\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-color'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_colorDeprecated\", null);\n    __decorate$5([\n        _angular_core.Input('mdRippleBackgroundColor'), \n        __metadata$5('design:type', String)\n    ], MdRipple.prototype, \"backgroundColor\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-background-color'), \n        __metadata$5('design:type', Object)\n    ], MdRipple.prototype, \"_backgroundColorDeprecated\", null);\n    __decorate$5([\n        _angular_core.HostBinding('class.md-ripple-focused'),\n        _angular_core.Input('mdRippleFocused'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"focused\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-focused'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"_focusedDeprecated\", null);\n    __decorate$5([\n        _angular_core.HostBinding('class.md-ripple-unbounded'),\n        _angular_core.Input('mdRippleUnbounded'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"unbounded\", void 0);\n    __decorate$5([\n        _angular_core.Input('md-ripple-unbounded'), \n        __metadata$5('design:type', Boolean)\n    ], MdRipple.prototype, \"_unboundedDeprecated\", null);\n    MdRipple = __decorate$5([\n        _angular_core.Directive({\n            selector: '[md-ripple], [mat-ripple]',\n        }), \n        __metadata$5('design:paramtypes', [_angular_core.ElementRef, _angular_core.NgZone, ViewportRuler])\n    ], MdRipple);\n    return MdRipple;\n}());\nvar MdRippleModule = (function () {\n    function MdRippleModule() {\n    }\n    MdRippleModule.forRoot = function () {\n        return {\n            ngModule: MdRippleModule,\n            providers: [ViewportRuler]\n        };\n    };\n    MdRippleModule = __decorate$5([\n        _angular_core.NgModule({\n            imports: [DefaultStyleCompatibilityModeModule],\n            exports: [MdRipple, DefaultStyleCompatibilityModeModule],\n            declarations: [MdRipple],\n        }), \n        __metadata$5('design:paramtypes', [])\n    ], MdRippleModule);\n    return MdRippleModule;\n}());\n\n// TODO(kara): Revisit why error messages are not being properly set.\nvar __extends$3 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Wrapper around Error that sets the error message.\n * @docs-private\n */\nvar MdError = (function (_super) {\n    __extends$3(MdError, _super);\n    function MdError(value) {\n        _super.call(this);\n        this.message = value;\n    }\n    return MdError;\n}(Error));\n\nvar __extends$2 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Exception thrown when attempting to attach a null portal to a host.\n * @docs-private\n */\nvar NullPortalError = (function (_super) {\n    __extends$2(NullPortalError, _super);\n    function NullPortalError() {\n        _super.call(this, 'Must provide a portal to attach');\n    }\n    return NullPortalError;\n}(MdError));\n/**\n * Exception thrown when attempting to attach a portal to a host that is already attached.\n * @docs-private\n */\nvar PortalAlreadyAttachedError = (function (_super) {\n    __extends$2(PortalAlreadyAttachedError, _super);\n    function PortalAlreadyAttachedError() {\n        _super.call(this, 'Host already has a portal attached');\n    }\n    return PortalAlreadyAttachedError;\n}(MdError));\n/**\n * Exception thrown when attempting to attach a portal to an already-disposed host.\n * @docs-private\n */\nvar PortalHostAlreadyDisposedError = (function (_super) {\n    __extends$2(PortalHostAlreadyDisposedError, _super);\n    function PortalHostAlreadyDisposedError() {\n        _super.call(this, 'This PortalHost has already been disposed');\n    }\n    return PortalHostAlreadyDisposedError;\n}(MdError));\n/**\n * Exception thrown when attempting to attach an unknown portal type.\n * @docs-private\n */\nvar UnknownPortalTypeError = (function (_super) {\n    __extends$2(UnknownPortalTypeError, _super);\n    function UnknownPortalTypeError() {\n        _super.call(this, 'Attempting to attach an unknown Portal type. ' +\n            'BasePortalHost accepts either a ComponentPortal or a TemplatePortal.');\n    }\n    return UnknownPortalTypeError;\n}(MdError));\n/**\n * Exception thrown when attempting to attach a portal to a null host.\n * @docs-private\n */\nvar NullPortalHostError = (function (_super) {\n    __extends$2(NullPortalHostError, _super);\n    function NullPortalHostError() {\n        _super.call(this, 'Attempting to attach a portal to a null PortalHost');\n    }\n    return NullPortalHostError;\n}(MdError));\n/**\n * Exception thrown when attempting to detach a portal that is not attached.\n * @docs-private\n */\nvar NoPortalAttachedError = (function (_super) {\n    __extends$2(NoPortalAttachedError, _super);\n    function NoPortalAttachedError() {\n        _super.call(this, 'Attempting to detach a portal that is not attached to a host');\n    }\n    return NoPortalAttachedError;\n}(MdError));\n\nvar __extends$1 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalHost`.\n */\nvar Portal = (function () {\n    function Portal() {\n    }\n    /** Attach this portal to a host. */\n    Portal.prototype.attach = function (host) {\n        if (host == null) {\n            throw new NullPortalHostError();\n        }\n        if (host.hasAttached()) {\n            throw new PortalAlreadyAttachedError();\n        }\n        this._attachedHost = host;\n        return host.attach(this);\n    };\n    /** Detach this portal from its host */\n    Portal.prototype.detach = function () {\n        var host = this._attachedHost;\n        if (host == null) {\n            throw new NoPortalAttachedError();\n        }\n        this._attachedHost = null;\n        return host.detach();\n    };\n    Object.defineProperty(Portal.prototype, \"isAttached\", {\n        /** Whether this portal is attached to a host. */\n        get: function () {\n            return this._attachedHost != null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets the PortalHost reference without performing `attach()`. This is used directly by\n     * the PortalHost when it is performing an `attach()` or `detach()`.\n     */\n    Portal.prototype.setAttachedHost = function (host) {\n        this._attachedHost = host;\n    };\n    return Portal;\n}());\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nvar ComponentPortal = (function (_super) {\n    __extends$1(ComponentPortal, _super);\n    function ComponentPortal(component, viewContainerRef, injector) {\n        if (viewContainerRef === void 0) { viewContainerRef = null; }\n        if (injector === void 0) { injector = null; }\n        _super.call(this);\n        this.component = component;\n        this.viewContainerRef = viewContainerRef;\n        this.injector = injector;\n    }\n    return ComponentPortal;\n}(Portal));\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nvar TemplatePortal = (function (_super) {\n    __extends$1(TemplatePortal, _super);\n    function TemplatePortal(template, viewContainerRef) {\n        _super.call(this);\n        /**\n         * Additional locals for the instantiated embedded view.\n         * These locals can be seen as \"exports\" for the template, such as how ngFor has\n         * index / event / odd.\n         * See https://angular.io/docs/ts/latest/api/core/EmbeddedViewRef-class.html\n         */\n        this.locals = new Map();\n        this.templateRef = template;\n        this.viewContainerRef = viewContainerRef;\n    }\n    Object.defineProperty(TemplatePortal.prototype, \"origin\", {\n        get: function () {\n            return this.templateRef.elementRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TemplatePortal.prototype.attach = function (host, locals) {\n        this.locals = locals == null ? new Map() : locals;\n        return _super.prototype.attach.call(this, host);\n    };\n    TemplatePortal.prototype.detach = function () {\n        this.locals = new Map();\n        return _super.prototype.detach.call(this);\n    };\n    return TemplatePortal;\n}(Portal));\n/**\n * Partial implementation of PortalHost that only deals with attaching either a\n * ComponentPortal or a TemplatePortal.\n */\nvar BasePortalHost = (function () {\n    function BasePortalHost() {\n        /** Whether this host has already been permanently disposed. */\n        this._isDisposed = false;\n    }\n    /** Whether this host has an attached portal. */\n    BasePortalHost.prototype.hasAttached = function () {\n        return this._attachedPortal != null;\n    };\n    BasePortalHost.prototype.attach = function (portal) {\n        if (portal == null) {\n            throw new NullPortalError();\n        }\n        if (this.hasAttached()) {\n            throw new PortalAlreadyAttachedError();\n        }\n        if (this._isDisposed) {\n            throw new PortalHostAlreadyDisposedError();\n        }\n        if (portal instanceof ComponentPortal) {\n            this._attachedPortal = portal;\n            return this.attachComponentPortal(portal);\n        }\n        else if (portal instanceof TemplatePortal) {\n            this._attachedPortal = portal;\n            return this.attachTemplatePortal(portal);\n        }\n        throw new UnknownPortalTypeError();\n    };\n    BasePortalHost.prototype.detach = function () {\n        if (this._attachedPortal) {\n            this._attachedPortal.setAttachedHost(null);\n        }\n        this._attachedPortal = null;\n        if (this._disposeFn != null) {\n            this._disposeFn();\n            this._disposeFn = null;\n        }\n    };\n    BasePortalHost.prototype.dispose = function () {\n        if (this.hasAttached()) {\n            this.detach();\n        }\n        this._isDisposed = true;\n    };\n    BasePortalHost.prototype.setDisposeFn = function (fn) {\n        this._disposeFn = fn;\n    };\n    return BasePortalHost;\n}());\n\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$7 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$7 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n *\n * Usage:\n * <template portal #greeting>\n *   <p> Hello {{name}} </p>\n * </template>\n */\nvar TemplatePortalDirective = (function (_super) {\n    __extends(TemplatePortalDirective, _super);\n    function TemplatePortalDirective(templateRef, viewContainerRef) {\n        _super.call(this, templateRef, viewContainerRef);\n    }\n    TemplatePortalDirective = __decorate$7([\n        _angular_core.Directive({\n            selector: '[cdk-portal], [portal]',\n            exportAs: 'cdkPortal',\n        }), \n        __metadata$7('design:paramtypes', [_angular_core.TemplateRef, _angular_core.ViewContainerRef])\n    ], TemplatePortalDirective);\n    return TemplatePortalDirective;\n}(TemplatePortal));\n/**\n * Directive version of a PortalHost. Because the directive *is* a PortalHost, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * <template [cdkPortalHost]=\"greeting\"></template>\n */\nvar PortalHostDirective = (function (_super) {\n    __extends(PortalHostDirective, _super);\n    function PortalHostDirective(_componentFactoryResolver, _viewContainerRef) {\n        _super.call(this);\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._viewContainerRef = _viewContainerRef;\n    }\n    Object.defineProperty(PortalHostDirective.prototype, \"_deprecatedPortal\", {\n        /** @deprecated */\n        get: function () { return this.portal; },\n        set: function (v) { this.portal = v; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(PortalHostDirective.prototype, \"portal\", {\n        /** Portal associated with the Portal host. */\n        get: function () {\n            return this._portal;\n        },\n        set: function (p) {\n            if (p) {\n                this._replaceAttachedPortal(p);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    PortalHostDirective.prototype.ngOnDestroy = function () {\n        this.dispose();\n    };\n    /**\n     * Attach the given ComponentPortal to this PortalHost using the ComponentFactoryResolver.\n     *\n     * @param portal Portal to be attached to the portal host.\n     */\n    PortalHostDirective.prototype.attachComponentPortal = function (portal) {\n        portal.setAttachedHost(this);\n        // If the portal specifies an origin, use that as the logical location of the component\n        // in the application tree. Otherwise use the location of this PortalHost.\n        var viewContainerRef = portal.viewContainerRef != null ?\n            portal.viewContainerRef :\n            this._viewContainerRef;\n        var componentFactory = this._componentFactoryResolver.resolveComponentFactory(portal.component);\n        var ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.parentInjector);\n        this.setDisposeFn(function () { return ref.destroy(); });\n        return ref;\n    };\n    /**\n     * Attach the given TemplatePortal to this PortlHost as an embedded View.\n     * @param portal Portal to be attached.\n     */\n    PortalHostDirective.prototype.attachTemplatePortal = function (portal) {\n        var _this = this;\n        portal.setAttachedHost(this);\n        this._viewContainerRef.createEmbeddedView(portal.templateRef);\n        this.setDisposeFn(function () { return _this._viewContainerRef.clear(); });\n        // TODO(jelbourn): return locals from view\n        return new Map();\n    };\n    /** Detaches the currently attached Portal (if there is one) and attaches the given Portal. */\n    PortalHostDirective.prototype._replaceAttachedPortal = function (p) {\n        if (this.hasAttached()) {\n            this.detach();\n        }\n        if (p) {\n            this.attach(p);\n            this._portal = p;\n        }\n    };\n    __decorate$7([\n        _angular_core.Input('portalHost'), \n        __metadata$7('design:type', Object)\n    ], PortalHostDirective.prototype, \"_deprecatedPortal\", null);\n    PortalHostDirective = __decorate$7([\n        _angular_core.Directive({\n            selector: '[cdkPortalHost], [portalHost]',\n            inputs: ['portal: cdkPortalHost']\n        }), \n        __metadata$7('design:paramtypes', [_angular_core.ComponentFactoryResolver, _angular_core.ViewContainerRef])\n    ], PortalHostDirective);\n    return PortalHostDirective;\n}(BasePortalHost));\nvar PortalModule = (function () {\n    function PortalModule() {\n    }\n    PortalModule.forRoot = function () {\n        return {\n            ngModule: PortalModule,\n            providers: []\n        };\n    };\n    PortalModule = __decorate$7([\n        _angular_core.NgModule({\n            exports: [TemplatePortalDirective, PortalHostDirective],\n            declarations: [TemplatePortalDirective, PortalHostDirective],\n        }), \n        __metadata$7('design:paramtypes', [])\n    ], PortalModule);\n    return PortalModule;\n}());\n\n/**\n * OverlayState is a bag of values for either the initial configuration or current state of an\n * overlay.\n */\nvar OverlayState = (function () {\n    function OverlayState() {\n        /** Whether the overlay has a backdrop. */\n        this.hasBackdrop = false;\n        /** Custom class to add to the backdrop **/\n        this.backdropClass = 'cdk-overlay-dark-backdrop';\n        /** The direction of the text in the overlay panel. */\n        this.direction = 'ltr';\n    }\n    return OverlayState;\n}());\n\nvar __extends$4 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * A PortalHost for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n *\n * This is the only part of the portal core that directly touches the DOM.\n */\nvar DomPortalHost = (function (_super) {\n    __extends$4(DomPortalHost, _super);\n    function DomPortalHost(_hostDomElement, _componentFactoryResolver, _appRef, _defaultInjector) {\n        _super.call(this);\n        this._hostDomElement = _hostDomElement;\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._appRef = _appRef;\n        this._defaultInjector = _defaultInjector;\n    }\n    /**\n     * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.\n     * @param portal Portal to be attached\n     */\n    DomPortalHost.prototype.attachComponentPortal = function (portal) {\n        var _this = this;\n        var componentFactory = this._componentFactoryResolver.resolveComponentFactory(portal.component);\n        var componentRef;\n        // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n        // for the component (in terms of Angular's component tree, not rendering).\n        // When the ViewContainerRef is missing, we use the factory to create the component directly\n        // and then manually attach the ChangeDetector for that component to the application (which\n        // happens automatically when using a ViewContainer).\n        if (portal.viewContainerRef) {\n            componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector);\n            this.setDisposeFn(function () { return componentRef.destroy(); });\n        }\n        else {\n            componentRef = componentFactory.create(portal.injector || this._defaultInjector);\n            // ApplicationRef's attachView and detachView methods are in Angular ^2.3.0 but not before.\n            // The `else` clause here can be removed once 2.3.0 is released.\n            if (this._appRef['attachView']) {\n                this._appRef.attachView(componentRef.hostView);\n                this.setDisposeFn(function () {\n                    _this._appRef.detachView(componentRef.hostView);\n                    componentRef.destroy();\n                });\n            }\n            else {\n                // When creating a component outside of a ViewContainer, we need to manually register\n                // its ChangeDetector with the application. This API is unfortunately not published\n                // in Angular < 2.3.0. The change detector must also be deregistered when the component\n                // is destroyed to prevent memory leaks.\n                var changeDetectorRef_1 = componentRef.changeDetectorRef;\n                this._appRef.registerChangeDetector(changeDetectorRef_1);\n                this.setDisposeFn(function () {\n                    _this._appRef.unregisterChangeDetector(changeDetectorRef_1);\n                    // Normally the ViewContainer will remove the component's nodes from the DOM.\n                    // Without a ViewContainer, we need to manually remove the nodes.\n                    var componentRootNode = _this._getComponentRootNode(componentRef);\n                    if (componentRootNode.parentNode) {\n                        componentRootNode.parentNode.removeChild(componentRootNode);\n                    }\n                    componentRef.destroy();\n                });\n            }\n        }\n        // At this point the component has been instantiated, so we move it to the location in the DOM\n        // where we want it to be rendered.\n        this._hostDomElement.appendChild(this._getComponentRootNode(componentRef));\n        return componentRef;\n    };\n    /**\n     * Attaches a template portal to the DOM as an embedded view.\n     * @param portal Portal to be attached.\n     */\n    DomPortalHost.prototype.attachTemplatePortal = function (portal) {\n        var _this = this;\n        var viewContainer = portal.viewContainerRef;\n        var viewRef = viewContainer.createEmbeddedView(portal.templateRef);\n        viewRef.rootNodes.forEach(function (rootNode) { return _this._hostDomElement.appendChild(rootNode); });\n        this.setDisposeFn((function () {\n            var index = viewContainer.indexOf(viewRef);\n            if (index != -1) {\n                viewContainer.remove(index);\n            }\n        }));\n        // TODO(jelbourn): Return locals from view.\n        return new Map();\n    };\n    /**\n     * Clears out a portal from the DOM.\n     */\n    DomPortalHost.prototype.dispose = function () {\n        _super.prototype.dispose.call(this);\n        if (this._hostDomElement.parentNode != null) {\n            this._hostDomElement.parentNode.removeChild(this._hostDomElement);\n        }\n    };\n    /** Gets the root HTMLElement for an instantiated component. */\n    DomPortalHost.prototype._getComponentRootNode = function (componentRef) {\n        return componentRef.hostView.rootNodes[0];\n    };\n    return DomPortalHost;\n}(BasePortalHost));\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nvar OverlayRef = (function () {\n    function OverlayRef(_portalHost, _pane, _state, _ngZone) {\n        this._portalHost = _portalHost;\n        this._pane = _pane;\n        this._state = _state;\n        this._ngZone = _ngZone;\n        this._backdropElement = null;\n        this._backdropClick = new rxjs_Subject.Subject();\n    }\n    Object.defineProperty(OverlayRef.prototype, \"overlayElement\", {\n        /** The overlay's HTML element */\n        get: function () {\n            return this._pane;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Attaches the overlay to a portal instance and adds the backdrop.\n     * @param portal Portal instance to which to attach the overlay.\n     * @returns The portal attachment result.\n     */\n    OverlayRef.prototype.attach = function (portal) {\n        if (this._state.hasBackdrop) {\n            this._attachBackdrop();\n        }\n        var attachResult = this._portalHost.attach(portal);\n        this.updateSize();\n        this.updateDirection();\n        this.updatePosition();\n        return attachResult;\n    };\n    /**\n     * Detaches an overlay from a portal.\n     * @returns Resolves when the overlay has been detached.\n     */\n    OverlayRef.prototype.detach = function () {\n        this._detachBackdrop();\n        return this._portalHost.detach();\n    };\n    /**\n     * Cleans up the overlay from the DOM.\n     */\n    OverlayRef.prototype.dispose = function () {\n        if (this._state.positionStrategy) {\n            this._state.positionStrategy.dispose();\n        }\n        this._detachBackdrop();\n        this._portalHost.dispose();\n    };\n    /**\n     * Checks whether the overlay has been attached.\n     */\n    OverlayRef.prototype.hasAttached = function () {\n        return this._portalHost.hasAttached();\n    };\n    /**\n     * Returns an observable that emits when the backdrop has been clicked.\n     */\n    OverlayRef.prototype.backdropClick = function () {\n        return this._backdropClick.asObservable();\n    };\n    /**\n     * Gets the current state config of the overlay.\n     */\n    OverlayRef.prototype.getState = function () {\n        return this._state;\n    };\n    /** Updates the position of the overlay based on the position strategy. */\n    OverlayRef.prototype.updatePosition = function () {\n        if (this._state.positionStrategy) {\n            this._state.positionStrategy.apply(this._pane);\n        }\n    };\n    /** Updates the text direction of the overlay panel. **/\n    OverlayRef.prototype.updateDirection = function () {\n        this._pane.setAttribute('dir', this._state.direction);\n    };\n    /** Updates the size of the overlay based on the overlay config. */\n    OverlayRef.prototype.updateSize = function () {\n        if (this._state.width || this._state.width === 0) {\n            this._pane.style.width = formatCssUnit(this._state.width);\n        }\n        if (this._state.height || this._state.height === 0) {\n            this._pane.style.height = formatCssUnit(this._state.height);\n        }\n        if (this._state.minWidth || this._state.minWidth === 0) {\n            this._pane.style.minWidth = formatCssUnit(this._state.minWidth);\n        }\n        if (this._state.minHeight || this._state.minHeight === 0) {\n            this._pane.style.minHeight = formatCssUnit(this._state.minHeight);\n        }\n    };\n    /** Attaches a backdrop for this overlay. */\n    OverlayRef.prototype._attachBackdrop = function () {\n        var _this = this;\n        this._backdropElement = document.createElement('div');\n        this._backdropElement.classList.add('cdk-overlay-backdrop');\n        this._backdropElement.classList.add(this._state.backdropClass);\n        // Insert the backdrop before the pane in the DOM order,\n        // in order to handle stacked overlays properly.\n        this._pane.parentElement.insertBefore(this._backdropElement, this._pane);\n        // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n        // action desired when such a click occurs (usually closing the overlay).\n        this._backdropElement.addEventListener('click', function () { return _this._backdropClick.next(null); });\n        // Add class to fade-in the backdrop after one frame.\n        requestAnimationFrame(function () {\n            if (_this._backdropElement) {\n                _this._backdropElement.classList.add('cdk-overlay-backdrop-showing');\n            }\n        });\n    };\n    /** Detaches the backdrop (if any) associated with the overlay. */\n    OverlayRef.prototype._detachBackdrop = function () {\n        var _this = this;\n        var backdropToDetach = this._backdropElement;\n        if (backdropToDetach) {\n            var finishDetach_1 = function () {\n                // It may not be attached to anything in certain cases (e.g. unit tests).\n                if (backdropToDetach && backdropToDetach.parentNode) {\n                    backdropToDetach.parentNode.removeChild(backdropToDetach);\n                }\n                // It is possible that a new portal has been attached to this overlay since we started\n                // removing the backdrop. If that is the case, only clear the backdrop reference if it\n                // is still the same instance that we started to remove.\n                if (_this._backdropElement == backdropToDetach) {\n                    _this._backdropElement = null;\n                }\n            };\n            backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n            backdropToDetach.classList.remove(this._state.backdropClass);\n            backdropToDetach.addEventListener('transitionend', finishDetach_1);\n            // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n            // In this case we make it unclickable and we try to remove it after a delay.\n            backdropToDetach.style.pointerEvents = 'none';\n            // Run this outside the Angular zone because there's nothing that Angular cares about.\n            // If it were to run inside the Angular zone, every test that used Overlay would have to be\n            // either async or fakeAsync.\n            this._ngZone.runOutsideAngular(function () {\n                setTimeout(finishDetach_1, 500);\n            });\n        }\n    };\n    return OverlayRef;\n}());\nfunction formatCssUnit(value) {\n    return typeof value === 'string' ? value : value + \"px\";\n}\n\nvar __decorate$11 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$11 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$2 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/** The points of the origin element and the overlay element to connect. */\nvar ConnectionPositionPair = (function () {\n    function ConnectionPositionPair(origin, overlay) {\n        this.originX = origin.originX;\n        this.originY = origin.originY;\n        this.overlayX = overlay.overlayX;\n        this.overlayY = overlay.overlayY;\n    }\n    return ConnectionPositionPair;\n}());\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n *       -----------                    -----------\n *       | outside |                    | clipped |\n *       |  view   |              --------------------------\n *       |         |              |     |         |        |\n *       ----------               |     -----------        |\n *  --------------------------    |                        |\n *  |                        |    |      Scrollable        |\n *  |                        |    |                        |\n *  |                        |     --------------------------\n *  |      Scrollable        |\n *  |                        |\n *  --------------------------\n */\nvar ScrollableViewProperties = (function () {\n    function ScrollableViewProperties() {\n    }\n    return ScrollableViewProperties;\n}());\n/** The change event emitted by the strategy when a fallback position is used. */\nvar ConnectedOverlayPositionChange = (function () {\n    function ConnectedOverlayPositionChange(connectionPair, scrollableViewProperties) {\n        this.connectionPair = connectionPair;\n        this.scrollableViewProperties = scrollableViewProperties;\n    }\n    ConnectedOverlayPositionChange = __decorate$11([\n        __param$2(1, _angular_core.Optional()), \n        __metadata$11('design:paramtypes', [ConnectionPositionPair, ScrollableViewProperties])\n    ], ConnectedOverlayPositionChange);\n    return ConnectedOverlayPositionChange;\n}());\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nvar ConnectedPositionStrategy = (function () {\n    function ConnectedPositionStrategy(_connectedTo, _originPos, _overlayPos, _viewportRuler) {\n        this._connectedTo = _connectedTo;\n        this._originPos = _originPos;\n        this._overlayPos = _overlayPos;\n        this._viewportRuler = _viewportRuler;\n        this._dir = 'ltr';\n        /** The offset in pixels for the overlay connection point on the x-axis */\n        this._offsetX = 0;\n        /** The offset in pixels for the overlay connection point on the y-axis */\n        this._offsetY = 0;\n        /** The Scrollable containers used to check scrollable view properties on position change. */\n        this.scrollables = [];\n        /** Ordered list of preferred positions, from most to least desirable. */\n        this._preferredPositions = [];\n        this._onPositionChange = new rxjs_Subject.Subject();\n        this._origin = this._connectedTo.nativeElement;\n        this.withFallbackPosition(_originPos, _overlayPos);\n    }\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"_isRtl\", {\n        /** Whether the we're dealing with an RTL context */\n        get: function () {\n            return this._dir === 'rtl';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"onPositionChange\", {\n        /** Emits an event when the connection point changes. */\n        get: function () {\n            return this._onPositionChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"positions\", {\n        /** Ordered list of preferred positions, from most to least desirable. */\n        get: function () {\n            return this._preferredPositions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * To be used to for any cleanup after the element gets destroyed.\n     */\n    ConnectedPositionStrategy.prototype.dispose = function () { };\n    /**\n     * Updates the position of the overlay element, using whichever preferred position relative\n     * to the origin fits on-screen.\n     * @docs-private\n     *\n     * @param element Element to which to apply the CSS styles.\n     * @returns Resolves when the styles have been applied.\n     */\n    ConnectedPositionStrategy.prototype.apply = function (element) {\n        // We need the bounding rects for the origin and the overlay to determine how to position\n        // the overlay relative to the origin.\n        var originRect = this._origin.getBoundingClientRect();\n        var overlayRect = element.getBoundingClientRect();\n        // We use the viewport rect to determine whether a position would go off-screen.\n        var viewportRect = this._viewportRuler.getViewportRect();\n        // Fallback point if none of the fallbacks fit into the viewport.\n        var fallbackPoint = null;\n        // We want to place the overlay in the first of the preferred positions such that the\n        // overlay fits on-screen.\n        for (var _i = 0, _a = this._preferredPositions; _i < _a.length; _i++) {\n            var pos = _a[_i];\n            // Get the (x, y) point of connection on the origin, and then use that to get the\n            // (top, left) coordinate for the overlay at `pos`.\n            var originPoint = this._getOriginConnectionPoint(originRect, pos);\n            var overlayPoint = this._getOverlayPoint(originPoint, overlayRect, viewportRect, pos);\n            // If the overlay in the calculated position fits on-screen, put it there and we're done.\n            if (overlayPoint.fitsInViewport) {\n                this._setElementPosition(element, overlayPoint);\n                // Notify that the position has been changed along with its change properties.\n                var scrollableViewProperties = this.getScrollableViewProperties(element);\n                var positionChange = new ConnectedOverlayPositionChange(pos, scrollableViewProperties);\n                this._onPositionChange.next(positionChange);\n                return Promise.resolve(null);\n            }\n            else if (!fallbackPoint || fallbackPoint.visibleArea < overlayPoint.visibleArea) {\n                fallbackPoint = overlayPoint;\n            }\n        }\n        // If none of the preferred positions were in the viewport, take the one\n        // with the largest visible area.\n        this._setElementPosition(element, fallbackPoint);\n        return Promise.resolve(null);\n    };\n    /**\n     * Sets the list of Scrollable containers that host the origin element so that\n     * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n     * Scrollable must be an ancestor element of the strategy's origin element.\n     */\n    ConnectedPositionStrategy.prototype.withScrollableContainers = function (scrollables) {\n        this.scrollables = scrollables;\n    };\n    /**\n     * Adds a new preferred fallback position.\n     * @param originPos\n     * @param overlayPos\n     */\n    ConnectedPositionStrategy.prototype.withFallbackPosition = function (originPos, overlayPos) {\n        this._preferredPositions.push(new ConnectionPositionPair(originPos, overlayPos));\n        return this;\n    };\n    /**\n     * Sets the layout direction so the overlay's position can be adjusted to match.\n     * @param dir New layout direction.\n     */\n    ConnectedPositionStrategy.prototype.withDirection = function (dir) {\n        this._dir = dir;\n        return this;\n    };\n    /**\n     * Sets an offset for the overlay's connection point on the x-axis\n     * @param offset New offset in the X axis.\n     */\n    ConnectedPositionStrategy.prototype.withOffsetX = function (offset) {\n        this._offsetX = offset;\n        return this;\n    };\n    /**\n     * Sets an offset for the overlay's connection point on the y-axis\n     * @param  offset New offset in the Y axis.\n     */\n    ConnectedPositionStrategy.prototype.withOffsetY = function (offset) {\n        this._offsetY = offset;\n        return this;\n    };\n    /**\n     * Gets the horizontal (x) \"start\" dimension based on whether the overlay is in an RTL context.\n     * @param rect\n     */\n    ConnectedPositionStrategy.prototype._getStartX = function (rect) {\n        return this._isRtl ? rect.right : rect.left;\n    };\n    /**\n     * Gets the horizontal (x) \"end\" dimension based on whether the overlay is in an RTL context.\n     * @param rect\n     */\n    ConnectedPositionStrategy.prototype._getEndX = function (rect) {\n        return this._isRtl ? rect.left : rect.right;\n    };\n    /**\n     * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n     * @param originRect\n     * @param pos\n     */\n    ConnectedPositionStrategy.prototype._getOriginConnectionPoint = function (originRect, pos) {\n        var originStartX = this._getStartX(originRect);\n        var originEndX = this._getEndX(originRect);\n        var x;\n        if (pos.originX == 'center') {\n            x = originStartX + (originRect.width / 2);\n        }\n        else {\n            x = pos.originX == 'start' ? originStartX : originEndX;\n        }\n        var y;\n        if (pos.originY == 'center') {\n            y = originRect.top + (originRect.height / 2);\n        }\n        else {\n            y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n        }\n        return { x: x, y: y };\n    };\n    /**\n     * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n     * origin point to which the overlay should be connected, as well as how much of the element\n     * would be inside the viewport at that position.\n     */\n    ConnectedPositionStrategy.prototype._getOverlayPoint = function (originPoint, overlayRect, viewportRect, pos) {\n        // Calculate the (overlayStartX, overlayStartY), the start of the potential overlay position\n        // relative to the origin point.\n        var overlayStartX;\n        if (pos.overlayX == 'center') {\n            overlayStartX = -overlayRect.width / 2;\n        }\n        else if (pos.overlayX === 'start') {\n            overlayStartX = this._isRtl ? -overlayRect.width : 0;\n        }\n        else {\n            overlayStartX = this._isRtl ? 0 : -overlayRect.width;\n        }\n        var overlayStartY;\n        if (pos.overlayY == 'center') {\n            overlayStartY = -overlayRect.height / 2;\n        }\n        else {\n            overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n        }\n        // The (x, y) coordinates of the overlay.\n        var x = originPoint.x + overlayStartX + this._offsetX;\n        var y = originPoint.y + overlayStartY + this._offsetY;\n        // How much the overlay would overflow at this position, on each side.\n        var leftOverflow = viewportRect.left - x;\n        var rightOverflow = (x + overlayRect.width) - viewportRect.right;\n        var topOverflow = viewportRect.top - y;\n        var bottomOverflow = (y + overlayRect.height) - viewportRect.bottom;\n        // Visible parts of the element on each axis.\n        var visibleWidth = this._subtractOverflows(overlayRect.width, leftOverflow, rightOverflow);\n        var visibleHeight = this._subtractOverflows(overlayRect.height, topOverflow, bottomOverflow);\n        // The area of the element that's within the viewport.\n        var visibleArea = visibleWidth * visibleHeight;\n        var fitsInViewport = (overlayRect.width * overlayRect.height) === visibleArea;\n        return { x: x, y: y, fitsInViewport: fitsInViewport, visibleArea: visibleArea };\n    };\n    /**\n     * Gets the view properties of the trigger and overlay, including whether they are clipped\n     * or completely outside the view of any of the strategy's scrollables.\n     */\n    ConnectedPositionStrategy.prototype.getScrollableViewProperties = function (overlay) {\n        var _this = this;\n        var originBounds = this._getElementBounds(this._origin);\n        var overlayBounds = this._getElementBounds(overlay);\n        var scrollContainerBounds = this.scrollables.map(function (scrollable) {\n            return _this._getElementBounds(scrollable.getElementRef().nativeElement);\n        });\n        return {\n            isOriginClipped: this.isElementClipped(originBounds, scrollContainerBounds),\n            isOriginOutsideView: this.isElementOutsideView(originBounds, scrollContainerBounds),\n            isOverlayClipped: this.isElementClipped(overlayBounds, scrollContainerBounds),\n            isOverlayOutsideView: this.isElementOutsideView(overlayBounds, scrollContainerBounds),\n        };\n    };\n    /** Whether the element is completely out of the view of any of the containers. */\n    ConnectedPositionStrategy.prototype.isElementOutsideView = function (elementBounds, containersBounds) {\n        return containersBounds.some(function (containerBounds) {\n            var outsideAbove = elementBounds.bottom < containerBounds.top;\n            var outsideBelow = elementBounds.top > containerBounds.bottom;\n            var outsideLeft = elementBounds.right < containerBounds.left;\n            var outsideRight = elementBounds.left > containerBounds.right;\n            return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n        });\n    };\n    /** Whether the element is clipped by any of the containers. */\n    ConnectedPositionStrategy.prototype.isElementClipped = function (elementBounds, containersBounds) {\n        return containersBounds.some(function (containerBounds) {\n            var clippedAbove = elementBounds.top < containerBounds.top;\n            var clippedBelow = elementBounds.bottom > containerBounds.bottom;\n            var clippedLeft = elementBounds.left < containerBounds.left;\n            var clippedRight = elementBounds.right > containerBounds.right;\n            return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n        });\n    };\n    /**\n     * Physically positions the overlay element to the given coordinate.\n     * @param element\n     * @param overlayPoint\n     */\n    ConnectedPositionStrategy.prototype._setElementPosition = function (element, overlayPoint) {\n        element.style.left = overlayPoint.x + 'px';\n        element.style.top = overlayPoint.y + 'px';\n    };\n    /** Returns the bounding positions of the provided element with respect to the viewport. */\n    ConnectedPositionStrategy.prototype._getElementBounds = function (element) {\n        var boundingClientRect = element.getBoundingClientRect();\n        return {\n            top: boundingClientRect.top,\n            right: boundingClientRect.left + boundingClientRect.width,\n            bottom: boundingClientRect.top + boundingClientRect.height,\n            left: boundingClientRect.left\n        };\n    };\n    /**\n     * Subtracts the amount that an element is overflowing on an axis from it's length.\n     */\n    ConnectedPositionStrategy.prototype._subtractOverflows = function (length) {\n        var overflows = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            overflows[_i - 1] = arguments[_i];\n        }\n        return overflows.reduce(function (currentValue, currentOverflow) {\n            return currentValue - Math.max(currentOverflow, 0);\n        }, length);\n    };\n    return ConnectedPositionStrategy;\n}());\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nvar GlobalPositionStrategy = (function () {\n    function GlobalPositionStrategy() {\n        this._cssPosition = 'static';\n        this._topOffset = '';\n        this._bottomOffset = '';\n        this._leftOffset = '';\n        this._rightOffset = '';\n        this._alignItems = '';\n        this._justifyContent = '';\n        this._width = '';\n        this._height = '';\n    }\n    /**\n     * Sets the top position of the overlay. Clears any previously set vertical position.\n     * @param value New top offset.\n     */\n    GlobalPositionStrategy.prototype.top = function (value) {\n        this._bottomOffset = '';\n        this._topOffset = value;\n        this._alignItems = 'flex-start';\n        return this;\n    };\n    /**\n     * Sets the left position of the overlay. Clears any previously set horizontal position.\n     * @param value New left offset.\n     */\n    GlobalPositionStrategy.prototype.left = function (value) {\n        this._rightOffset = '';\n        this._leftOffset = value;\n        this._justifyContent = 'flex-start';\n        return this;\n    };\n    /**\n     * Sets the bottom position of the overlay. Clears any previously set vertical position.\n     * @param value New bottom offset.\n     */\n    GlobalPositionStrategy.prototype.bottom = function (value) {\n        this._topOffset = '';\n        this._bottomOffset = value;\n        this._alignItems = 'flex-end';\n        return this;\n    };\n    /**\n     * Sets the right position of the overlay. Clears any previously set horizontal position.\n     * @param value New right offset.\n     */\n    GlobalPositionStrategy.prototype.right = function (value) {\n        this._leftOffset = '';\n        this._rightOffset = value;\n        this._justifyContent = 'flex-end';\n        return this;\n    };\n    /**\n     * Sets the overlay width and clears any previously set width.\n     * @param value New width for the overlay\n     */\n    GlobalPositionStrategy.prototype.width = function (value) {\n        this._width = value;\n        // When the width is 100%, we should reset the `left` and the offset,\n        // in order to ensure that the element is flush against the viewport edge.\n        if (value === '100%') {\n            this.left('0px');\n        }\n        return this;\n    };\n    /**\n     * Sets the overlay height and clears any previously set height.\n     * @param value New height for the overlay\n     */\n    GlobalPositionStrategy.prototype.height = function (value) {\n        this._height = value;\n        // When the height is 100%, we should reset the `top` and the offset,\n        // in order to ensure that the element is flush against the viewport edge.\n        if (value === '100%') {\n            this.top('0px');\n        }\n        return this;\n    };\n    /**\n     * Centers the overlay horizontally with an optional offset.\n     * Clears any previously set horizontal position.\n     *\n     * @param offset Overlay offset from the horizontal center.\n     */\n    GlobalPositionStrategy.prototype.centerHorizontally = function (offset) {\n        if (offset === void 0) { offset = ''; }\n        this.left(offset);\n        this._justifyContent = 'center';\n        return this;\n    };\n    /**\n     * Centers the overlay vertically with an optional offset.\n     * Clears any previously set vertical position.\n     *\n     * @param offset Overlay offset from the vertical center.\n     */\n    GlobalPositionStrategy.prototype.centerVertically = function (offset) {\n        if (offset === void 0) { offset = ''; }\n        this.top(offset);\n        this._alignItems = 'center';\n        return this;\n    };\n    /**\n     * Apply the position to the element.\n     * @docs-private\n     *\n     * @param element Element to which to apply the CSS.\n     * @returns Resolved when the styles have been applied.\n     */\n    GlobalPositionStrategy.prototype.apply = function (element) {\n        if (!this._wrapper) {\n            this._wrapper = document.createElement('div');\n            this._wrapper.classList.add('cdk-global-overlay-wrapper');\n            element.parentNode.insertBefore(this._wrapper, element);\n            this._wrapper.appendChild(element);\n        }\n        var styles = element.style;\n        var parentStyles = element.parentNode.style;\n        styles.position = this._cssPosition;\n        styles.marginTop = this._topOffset;\n        styles.marginLeft = this._leftOffset;\n        styles.marginBottom = this._bottomOffset;\n        styles.marginRight = this._rightOffset;\n        styles.width = this._width;\n        styles.height = this._height;\n        parentStyles.justifyContent = this._justifyContent;\n        parentStyles.alignItems = this._alignItems;\n        return Promise.resolve(null);\n    };\n    /**\n     * Removes the wrapper element from the DOM.\n     */\n    GlobalPositionStrategy.prototype.dispose = function () {\n        if (this._wrapper && this._wrapper.parentNode) {\n            this._wrapper.parentNode.removeChild(this._wrapper);\n            this._wrapper = null;\n        }\n    };\n    return GlobalPositionStrategy;\n}());\n\nvar __decorate$10 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$10 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Builder for overlay position strategy. */\nvar OverlayPositionBuilder = (function () {\n    function OverlayPositionBuilder(_viewportRuler) {\n        this._viewportRuler = _viewportRuler;\n    }\n    /**\n     * Creates a global position strategy.\n     */\n    OverlayPositionBuilder.prototype.global = function () {\n        return new GlobalPositionStrategy();\n    };\n    /**\n     * Creates a relative position strategy.\n     * @param elementRef\n     * @param originPos\n     * @param overlayPos\n     */\n    OverlayPositionBuilder.prototype.connectedTo = function (elementRef, originPos, overlayPos) {\n        return new ConnectedPositionStrategy(elementRef, originPos, overlayPos, this._viewportRuler);\n    };\n    OverlayPositionBuilder = __decorate$10([\n        _angular_core.Injectable(), \n        __metadata$10('design:paramtypes', [ViewportRuler])\n    ], OverlayPositionBuilder);\n    return OverlayPositionBuilder;\n}());\n\n/**\n * The OverlayContainer is the container in which all overlays will load.\n * It should be provided in the root component to ensure it is properly shared.\n */\nvar OverlayContainer = (function () {\n    function OverlayContainer() {\n    }\n    /**\n     * This method returns the overlay container element.  It will lazily\n     * create the element the first time  it is called to facilitate using\n     * the container in non-browser environments.\n     * @returns the container element\n     */\n    OverlayContainer.prototype.getContainerElement = function () {\n        if (!this._containerElement) {\n            this._createContainer();\n        }\n        return this._containerElement;\n    };\n    /**\n     * Create the overlay container element, which is simply a div\n     * with the 'cdk-overlay-container' class on the document body.\n     */\n    OverlayContainer.prototype._createContainer = function () {\n        var container = document.createElement('div');\n        container.classList.add('cdk-overlay-container');\n        document.body.appendChild(container);\n        this._containerElement = container;\n    };\n    return OverlayContainer;\n}());\n\nvar __decorate$12 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$12 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\nvar ScrollDispatcher = (function () {\n    function ScrollDispatcher() {\n        var _this = this;\n        /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n        this._scrolled = new rxjs_Subject.Subject();\n        /**\n         * Map of all the scrollable references that are registered with the service and their\n         * scroll event subscriptions.\n         */\n        this.scrollableReferences = new Map();\n        // By default, notify a scroll event when the document is scrolled or the window is resized.\n        rxjs_Observable.Observable.fromEvent(window.document, 'scroll').subscribe(function () { return _this._notify(); });\n        rxjs_Observable.Observable.fromEvent(window, 'resize').subscribe(function () { return _this._notify(); });\n    }\n    /**\n     * Registers a Scrollable with the service and listens for its scrolled events. When the\n     * scrollable is scrolled, the service emits the event in its scrolled observable.\n     *\n     * @param scrollable Scrollable instance to be registered.\n     */\n    ScrollDispatcher.prototype.register = function (scrollable) {\n        var _this = this;\n        var scrollSubscription = scrollable.elementScrolled().subscribe(function () { return _this._notify(); });\n        this.scrollableReferences.set(scrollable, scrollSubscription);\n    };\n    /**\n     * Deregisters a Scrollable reference and unsubscribes from its scroll event observable.\n     *\n     * @param scrollable Scrollable instance to be deregistered.\n     */\n    ScrollDispatcher.prototype.deregister = function (scrollable) {\n        this.scrollableReferences.get(scrollable).unsubscribe();\n        this.scrollableReferences.delete(scrollable);\n    };\n    /**\n     * Returns an observable that emits an event whenever any of the registered Scrollable\n     * references (or window, document, or body) fire a scrolled event.\n     */\n    ScrollDispatcher.prototype.scrolled = function () {\n        // TODO: Add an event limiter that includes throttle with the leading and trailing events.\n        return this._scrolled.asObservable();\n    };\n    /** Returns all registered Scrollables that contain the provided element. */\n    ScrollDispatcher.prototype.getScrollContainers = function (elementRef) {\n        var _this = this;\n        var scrollingContainers = [];\n        this.scrollableReferences.forEach(function (subscription, scrollable) {\n            if (_this.scrollableContainsElement(scrollable, elementRef)) {\n                scrollingContainers.push(scrollable);\n            }\n        });\n        return scrollingContainers;\n    };\n    /** Returns true if the element is contained within the provided Scrollable. */\n    ScrollDispatcher.prototype.scrollableContainsElement = function (scrollable, elementRef) {\n        var element = elementRef.nativeElement;\n        var scrollableElement = scrollable.getElementRef().nativeElement;\n        // Traverse through the element parents until we reach null, checking if any of the elements\n        // are the scrollable's element.\n        do {\n            if (element == scrollableElement) {\n                return true;\n            }\n        } while (element = element.parentElement);\n    };\n    /** Sends a notification that a scroll event has been fired. */\n    ScrollDispatcher.prototype._notify = function () {\n        this._scrolled.next();\n    };\n    ScrollDispatcher = __decorate$12([\n        _angular_core.Injectable(), \n        __metadata$12('design:paramtypes', [])\n    ], ScrollDispatcher);\n    return ScrollDispatcher;\n}());\n\nvar __decorate$9 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$9 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Next overlay unique ID. */\nvar nextUniqueId = 0;\n/** The default state for newly created overlays. */\nvar defaultState = new OverlayState();\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalHost, so any kind of Portal can be loaded into one.\n */\nvar Overlay = (function () {\n    function Overlay(_overlayContainer, _componentFactoryResolver, _positionBuilder, _appRef, _injector, _ngZone) {\n        this._overlayContainer = _overlayContainer;\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._positionBuilder = _positionBuilder;\n        this._appRef = _appRef;\n        this._injector = _injector;\n        this._ngZone = _ngZone;\n    }\n    /**\n     * Creates an overlay.\n     * @param state State to apply to the overlay.\n     * @returns Reference to the created overlay.\n     */\n    Overlay.prototype.create = function (state$$1) {\n        if (state$$1 === void 0) { state$$1 = defaultState; }\n        return this._createOverlayRef(this._createPaneElement(), state$$1);\n    };\n    /**\n     * Returns a position builder that can be used, via fluent API,\n     * to construct and configure a position strategy.\n     */\n    Overlay.prototype.position = function () {\n        return this._positionBuilder;\n    };\n    /**\n     * Creates the DOM element for an overlay and appends it to the overlay container.\n     * @returns Newly-created pane element\n     */\n    Overlay.prototype._createPaneElement = function () {\n        var pane = document.createElement('div');\n        pane.id = \"cdk-overlay-\" + nextUniqueId++;\n        pane.classList.add('cdk-overlay-pane');\n        this._overlayContainer.getContainerElement().appendChild(pane);\n        return pane;\n    };\n    /**\n     * Create a DomPortalHost into which the overlay content can be loaded.\n     * @param pane The DOM element to turn into a portal host.\n     * @returns A portal host for the given DOM element.\n     */\n    Overlay.prototype._createPortalHost = function (pane) {\n        return new DomPortalHost(pane, this._componentFactoryResolver, this._appRef, this._injector);\n    };\n    /**\n     * Creates an OverlayRef for an overlay in the given DOM element.\n     * @param pane DOM element for the overlay\n     * @param state\n     */\n    Overlay.prototype._createOverlayRef = function (pane, state$$1) {\n        return new OverlayRef(this._createPortalHost(pane), pane, state$$1, this._ngZone);\n    };\n    Overlay = __decorate$9([\n        _angular_core.Injectable(), \n        __metadata$9('design:paramtypes', [OverlayContainer, _angular_core.ComponentFactoryResolver, OverlayPositionBuilder, _angular_core.ApplicationRef, _angular_core.Injector, _angular_core.NgZone])\n    ], Overlay);\n    return Overlay;\n}());\n/** Providers for Overlay and its related injectables. */\nvar OVERLAY_PROVIDERS = [\n    ViewportRuler,\n    OverlayPositionBuilder,\n    Overlay,\n    OverlayContainer,\n    ScrollDispatcher,\n];\n\nvar __decorate$13 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$13 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\nvar Scrollable = (function () {\n    function Scrollable(_elementRef, _scroll) {\n        this._elementRef = _elementRef;\n        this._scroll = _scroll;\n    }\n    Scrollable.prototype.ngOnInit = function () {\n        this._scroll.register(this);\n    };\n    Scrollable.prototype.ngOnDestroy = function () {\n        this._scroll.deregister(this);\n    };\n    /**\n     * Returns observable that emits when a scroll event is fired on the host element.\n     */\n    Scrollable.prototype.elementScrolled = function () {\n        return rxjs_Observable.Observable.fromEvent(this._elementRef.nativeElement, 'scroll');\n    };\n    Scrollable.prototype.getElementRef = function () {\n        return this._elementRef;\n    };\n    Scrollable = __decorate$13([\n        _angular_core.Directive({\n            selector: '[cdk-scrollable]'\n        }), \n        __metadata$13('design:paramtypes', [_angular_core.ElementRef, ScrollDispatcher])\n    ], Scrollable);\n    return Scrollable;\n}());\n\nvar __decorate$8 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$8 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$1 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nvar defaultPositionList = [\n    new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),\n    new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }),\n];\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nvar OverlayOrigin = (function () {\n    function OverlayOrigin(elementRef) {\n        this.elementRef = elementRef;\n    }\n    OverlayOrigin = __decorate$8([\n        _angular_core.Directive({\n            selector: '[cdk-overlay-origin], [overlay-origin]',\n            exportAs: 'cdkOverlayOrigin',\n        }), \n        __metadata$8('design:paramtypes', [_angular_core.ElementRef])\n    ], OverlayOrigin);\n    return OverlayOrigin;\n}());\n/**\n * Directive to facilitate declarative creation of an Overlay using a ConnectedPositionStrategy.\n */\nvar ConnectedOverlayDirective = (function () {\n    // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n    function ConnectedOverlayDirective(_overlay, templateRef, viewContainerRef, _dir) {\n        this._overlay = _overlay;\n        this._dir = _dir;\n        this._open = false;\n        this._hasBackdrop = false;\n        this._offsetX = 0;\n        this._offsetY = 0;\n        /** Event emitted when the backdrop is clicked. */\n        this.backdropClick = new _angular_core.EventEmitter();\n        /** Event emitted when the position has changed. */\n        this.positionChange = new _angular_core.EventEmitter();\n        /** Event emitted when the overlay has been attached. */\n        this.attach = new _angular_core.EventEmitter();\n        /** Event emitted when the overlay has been detached. */\n        this.detach = new _angular_core.EventEmitter();\n        this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n    }\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"offsetX\", {\n        /** The offset in pixels for the overlay connection point on the x-axis */\n        get: function () {\n            return this._offsetX;\n        },\n        set: function (offsetX) {\n            this._offsetX = offsetX;\n            if (this._position) {\n                this._position.withOffsetX(offsetX);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"offsetY\", {\n        /** The offset in pixels for the overlay connection point on the y-axis */\n        get: function () {\n            return this._offsetY;\n        },\n        set: function (offsetY) {\n            this._offsetY = offsetY;\n            if (this._position) {\n                this._position.withOffsetY(offsetY);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"hasBackdrop\", {\n        /** Whether or not the overlay should attach a backdrop. */\n        get: function () {\n            return this._hasBackdrop;\n        },\n        // TODO: move the boolean coercion logic to a shared function in core\n        set: function (value) {\n            this._hasBackdrop = value != null && \"\" + value !== 'false';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"open\", {\n        get: function () {\n            return this._open;\n        },\n        set: function (value) {\n            value ? this._attachOverlay() : this._detachOverlay();\n            this._open = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"overlayRef\", {\n        /** The associated overlay reference. */\n        get: function () {\n            return this._overlayRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"dir\", {\n        /** The element's layout direction. */\n        get: function () {\n            return this._dir ? this._dir.value : 'ltr';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ConnectedOverlayDirective.prototype.ngOnDestroy = function () {\n        this._destroyOverlay();\n    };\n    /** Creates an overlay */\n    ConnectedOverlayDirective.prototype._createOverlay = function () {\n        if (!this.positions || !this.positions.length) {\n            this.positions = defaultPositionList;\n        }\n        this._overlayRef = this._overlay.create(this._buildConfig());\n    };\n    /** Builds the overlay config based on the directive's inputs */\n    ConnectedOverlayDirective.prototype._buildConfig = function () {\n        var overlayConfig = new OverlayState();\n        if (this.width || this.width === 0) {\n            overlayConfig.width = this.width;\n        }\n        if (this.height || this.height === 0) {\n            overlayConfig.height = this.height;\n        }\n        if (this.minWidth || this.minWidth === 0) {\n            overlayConfig.minWidth = this.minWidth;\n        }\n        if (this.minHeight || this.minHeight === 0) {\n            overlayConfig.minHeight = this.minHeight;\n        }\n        overlayConfig.hasBackdrop = this.hasBackdrop;\n        if (this.backdropClass) {\n            overlayConfig.backdropClass = this.backdropClass;\n        }\n        this._position = this._createPositionStrategy();\n        overlayConfig.positionStrategy = this._position;\n        overlayConfig.direction = this.dir;\n        return overlayConfig;\n    };\n    /** Returns the position strategy of the overlay to be set on the overlay config */\n    ConnectedOverlayDirective.prototype._createPositionStrategy = function () {\n        var pos = this.positions[0];\n        var originPoint = { originX: pos.originX, originY: pos.originY };\n        var overlayPoint = { overlayX: pos.overlayX, overlayY: pos.overlayY };\n        var strategy = this._overlay.position()\n            .connectedTo(this.origin.elementRef, originPoint, overlayPoint)\n            .withDirection(this.dir)\n            .withOffsetX(this.offsetX)\n            .withOffsetY(this.offsetY);\n        this._handlePositionChanges(strategy);\n        return strategy;\n    };\n    ConnectedOverlayDirective.prototype._handlePositionChanges = function (strategy) {\n        var _this = this;\n        for (var i = 1; i < this.positions.length; i++) {\n            strategy.withFallbackPosition({ originX: this.positions[i].originX, originY: this.positions[i].originY }, { overlayX: this.positions[i].overlayX, overlayY: this.positions[i].overlayY });\n        }\n        this._positionSubscription =\n            strategy.onPositionChange.subscribe(function (pos) { return _this.positionChange.emit(pos); });\n    };\n    /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n    ConnectedOverlayDirective.prototype._attachOverlay = function () {\n        var _this = this;\n        if (!this._overlayRef) {\n            this._createOverlay();\n        }\n        if (!this._overlayRef.hasAttached()) {\n            this._overlayRef.attach(this._templatePortal);\n            this.attach.emit();\n        }\n        if (this.hasBackdrop) {\n            this._backdropSubscription = this._overlayRef.backdropClick().subscribe(function () {\n                _this.backdropClick.emit();\n            });\n        }\n    };\n    /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n    ConnectedOverlayDirective.prototype._detachOverlay = function () {\n        if (this._overlayRef) {\n            this._overlayRef.detach();\n            this.detach.emit();\n        }\n        if (this._backdropSubscription) {\n            this._backdropSubscription.unsubscribe();\n            this._backdropSubscription = null;\n        }\n    };\n    /** Destroys the overlay created by this directive. */\n    ConnectedOverlayDirective.prototype._destroyOverlay = function () {\n        if (this._overlayRef) {\n            this._overlayRef.dispose();\n        }\n        if (this._backdropSubscription) {\n            this._backdropSubscription.unsubscribe();\n        }\n        if (this._positionSubscription) {\n            this._positionSubscription.unsubscribe();\n        }\n    };\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', OverlayOrigin)\n    ], ConnectedOverlayDirective.prototype, \"origin\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Array)\n    ], ConnectedOverlayDirective.prototype, \"positions\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Number)\n    ], ConnectedOverlayDirective.prototype, \"offsetX\", null);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"offsetY\", null);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"width\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"height\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"minWidth\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"minHeight\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', String)\n    ], ConnectedOverlayDirective.prototype, \"backdropClass\", void 0);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"hasBackdrop\", null);\n    __decorate$8([\n        _angular_core.Input(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"open\", null);\n    __decorate$8([\n        _angular_core.Output(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"backdropClick\", void 0);\n    __decorate$8([\n        _angular_core.Output(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"positionChange\", void 0);\n    __decorate$8([\n        _angular_core.Output(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"attach\", void 0);\n    __decorate$8([\n        _angular_core.Output(), \n        __metadata$8('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"detach\", void 0);\n    ConnectedOverlayDirective = __decorate$8([\n        _angular_core.Directive({\n            selector: '[cdk-connected-overlay], [connected-overlay]',\n            exportAs: 'cdkConnectedOverlay'\n        }),\n        __param$1(3, _angular_core.Optional()), \n        __metadata$8('design:paramtypes', [Overlay, _angular_core.TemplateRef, _angular_core.ViewContainerRef, Dir])\n    ], ConnectedOverlayDirective);\n    return ConnectedOverlayDirective;\n}());\nvar OverlayModule = (function () {\n    function OverlayModule() {\n    }\n    OverlayModule.forRoot = function () {\n        return {\n            ngModule: OverlayModule,\n            providers: OVERLAY_PROVIDERS,\n        };\n    };\n    OverlayModule = __decorate$8([\n        _angular_core.NgModule({\n            imports: [PortalModule],\n            exports: [ConnectedOverlayDirective, OverlayOrigin, Scrollable],\n            declarations: [ConnectedOverlayDirective, OverlayOrigin, Scrollable],\n        }), \n        __metadata$8('design:paramtypes', [])\n    ], OverlayModule);\n    return OverlayModule;\n}());\n\nvar __decorate$17 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$17 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// Whether the current platform supports the V8 Break Iterator. The V8 check\n// is necessary to detect all Blink based browsers.\nvar hasV8BreakIterator = typeof (window) !== 'undefined' ?\n    (window.Intl && window.Intl.v8BreakIterator) :\n    (typeof (Intl) !== 'undefined' && Intl.v8BreakIterator);\n/**\n * Service to detect the current platform by comparing the userAgent strings and\n * checking browser-specific global properties.\n * @docs-private\n */\nvar Platform = (function () {\n    function Platform() {\n        /** Layout Engines */\n        this.EDGE = /(edge)/i.test(navigator.userAgent);\n        this.TRIDENT = /(msie|trident)/i.test(navigator.userAgent);\n        // EdgeHTML and Trident mock Blink specific things and need to excluded from this check.\n        this.BLINK = !!(window.chrome || hasV8BreakIterator) && !!CSS && !this.EDGE && !this.TRIDENT;\n        // Webkit is part of the userAgent in EdgeHTML Blink and Trident, so we need to\n        // ensure that Webkit runs standalone and is not use as another engines base.\n        this.WEBKIT = /AppleWebKit/i.test(navigator.userAgent) && !this.BLINK && !this.EDGE && !this.TRIDENT;\n        /** Browsers and Platform Types */\n        this.IOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n        // It's difficult to detect the plain Gecko engine, because most of the browsers identify\n        // them self as Gecko-like browsers and modify the userAgent's according to that.\n        // Since we only cover one explicit Firefox case, we can simply check for Firefox\n        // instead of having an unstable check for Gecko.\n        this.FIREFOX = /(firefox|minefield)/i.test(navigator.userAgent);\n        // Trident on mobile adds the android platform to the userAgent to trick detections.\n        this.ANDROID = /android/i.test(navigator.userAgent) && !this.TRIDENT;\n    }\n    Platform = __decorate$17([\n        _angular_core.Injectable(), \n        __metadata$17('design:paramtypes', [])\n    ], Platform);\n    return Platform;\n}());\n\nvar __decorate$16 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$16 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * The InteractivityChecker leans heavily on the ally.js accessibility utilities.\n * Methods like `isTabbable` are only covering specific edge-cases for the browsers which are\n * supported.\n */\n/**\n * Utility for checking the interactivity of an element, such as whether is is focusable or\n * tabbable.\n */\nvar InteractivityChecker = (function () {\n    function InteractivityChecker(_platform) {\n        this._platform = _platform;\n    }\n    /**\n     * Gets whether an element is disabled.\n     *\n     * @param element Element to be checked.\n     * @returns Whether the element is disabled.\n     */\n    InteractivityChecker.prototype.isDisabled = function (element) {\n        // This does not capture some cases, such as a non-form control with a disabled attribute or\n        // a form control inside of a disabled form, but should capture the most common cases.\n        return element.hasAttribute('disabled');\n    };\n    /**\n     * Gets whether an element is visible for the purposes of interactivity.\n     *\n     * This will capture states like `display: none` and `visibility: hidden`, but not things like\n     * being clipped by an `overflow: hidden` parent or being outside the viewport.\n     *\n     * @returns Whether the element is visible.\n     */\n    InteractivityChecker.prototype.isVisible = function (element) {\n        return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';\n    };\n    /**\n     * Gets whether an element can be reached via Tab key.\n     * Assumes that the element has already been checked with isFocusable.\n     *\n     * @param element Element to be checked.\n     * @returns Whether the element is tabbable.\n     */\n    InteractivityChecker.prototype.isTabbable = function (element) {\n        var frameElement = getWindow(element).frameElement;\n        if (frameElement) {\n            var frameType = frameElement && frameElement.nodeName.toLowerCase();\n            // Frame elements inherit their tabindex onto all child elements.\n            if (getTabIndexValue(frameElement) === -1) {\n                return false;\n            }\n            // Webkit and Blink consider anything inside of an <object> element as non-tabbable.\n            if ((this._platform.BLINK || this._platform.WEBKIT) && frameType === 'object') {\n                return false;\n            }\n            // Webkit and Blink disable tabbing to an element inside of an invisible frame.\n            if ((this._platform.BLINK || this._platform.WEBKIT) && !this.isVisible(frameElement)) {\n                return false;\n            }\n        }\n        var nodeName = element.nodeName.toLowerCase();\n        var tabIndexValue = getTabIndexValue(element);\n        if (element.hasAttribute('contenteditable')) {\n            return tabIndexValue !== -1;\n        }\n        if (nodeName === 'iframe') {\n            // The frames may be tabbable depending on content, but it's not possibly to reliably\n            // investigate the content of the frames.\n            return false;\n        }\n        if (nodeName === 'audio') {\n            if (!element.hasAttribute('controls')) {\n                // By default an <audio> element without the controls enabled is not tabbable.\n                return false;\n            }\n            else if (this._platform.BLINK) {\n                // In Blink <audio controls> elements are always tabbable.\n                return true;\n            }\n        }\n        if (nodeName === 'video') {\n            if (!element.hasAttribute('controls') && this._platform.TRIDENT) {\n                // In Trident a <video> element without the controls enabled is not tabbable.\n                return false;\n            }\n            else if (this._platform.BLINK || this._platform.FIREFOX) {\n                // In Chrome and Firefox <video controls> elements are always tabbable.\n                return true;\n            }\n        }\n        if (nodeName === 'object' && (this._platform.BLINK || this._platform.WEBKIT)) {\n            // In all Blink and WebKit based browsers <object> elements are never tabbable.\n            return false;\n        }\n        // In iOS the browser only considers some specific elements as tabbable.\n        if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {\n            return false;\n        }\n        return element.tabIndex >= 0;\n    };\n    /**\n     * Gets whether an element can be focused by the user.\n     *\n     * @param element Element to be checked.\n     * @returns Whether the element is focusable.\n     */\n    InteractivityChecker.prototype.isFocusable = function (element) {\n        // Perform checks in order of left to most expensive.\n        // Again, naive approach that does not capture many edge cases and browser quirks.\n        return isPotentiallyFocusable(element) && !this.isDisabled(element) && this.isVisible(element);\n    };\n    InteractivityChecker = __decorate$16([\n        _angular_core.Injectable(), \n        __metadata$16('design:paramtypes', [Platform])\n    ], InteractivityChecker);\n    return InteractivityChecker;\n}());\n/** Checks whether the specified element has any geometry / rectangles. */\nfunction hasGeometry(element) {\n    // Use logic from jQuery to check for an invisible element.\n    // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n    return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n}\n/** Gets whether an element's  */\nfunction isNativeFormElement(element) {\n    var nodeName = element.nodeName.toLowerCase();\n    return nodeName === 'input' ||\n        nodeName === 'select' ||\n        nodeName === 'button' ||\n        nodeName === 'textarea';\n}\n/** Gets whether an element is an <input type=\"hidden\">. */\nfunction isHiddenInput(element) {\n    return isInputElement(element) && element.type == 'hidden';\n}\n/** Gets whether an element is an anchor that has an href attribute. */\nfunction isAnchorWithHref(element) {\n    return isAnchorElement(element) && element.hasAttribute('href');\n}\n/** Gets whether an element is an input element. */\nfunction isInputElement(element) {\n    return element.nodeName == 'input';\n}\n/** Gets whether an element is an anchor element. */\nfunction isAnchorElement(element) {\n    return element.nodeName.toLowerCase() == 'a';\n}\n/** Gets whether an element has a valid tabindex. */\nfunction hasValidTabIndex(element) {\n    if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n        return false;\n    }\n    var tabIndex = element.getAttribute('tabindex');\n    // IE11 parses tabindex=\"\" as the value \"-32768\"\n    if (tabIndex == '-32768') {\n        return false;\n    }\n    return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n}\n/**\n * Returns the parsed tabindex from the element attributes instead of returning the\n * evaluated tabindex from the browsers defaults.\n */\nfunction getTabIndexValue(element) {\n    if (!hasValidTabIndex(element)) {\n        return null;\n    }\n    // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054\n    var tabIndex = parseInt(element.getAttribute('tabindex'), 10);\n    return isNaN(tabIndex) ? -1 : tabIndex;\n}\n/** Checks whether the specified element is potentially tabbable on iOS */\nfunction isPotentiallyTabbableIOS(element) {\n    var nodeName = element.nodeName.toLowerCase();\n    var inputType = nodeName === 'input' && element.type;\n    return inputType === 'text'\n        || inputType === 'password'\n        || nodeName === 'select'\n        || nodeName === 'textarea';\n}\n/**\n * Gets whether an element is potentially focusable without taking current visible/disabled state\n * into account.\n */\nfunction isPotentiallyFocusable(element) {\n    // Inputs are potentially focusable *unless* they're type=\"hidden\".\n    if (isHiddenInput(element)) {\n        return false;\n    }\n    return isNativeFormElement(element) ||\n        isAnchorWithHref(element) ||\n        element.hasAttribute('contenteditable') ||\n        hasValidTabIndex(element);\n}\n/** Gets the parent window of a DOM node with regards of being inside of an iframe. */\nfunction getWindow(node) {\n    return node.ownerDocument.defaultView || window;\n}\n\n/** Coerces a data-bound value (typically a string) to a boolean. */\nfunction coerceBooleanProperty(value) {\n    return value != null && \"\" + value !== 'false';\n}\n\nvar __decorate$15 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$15 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive for trapping focus within a region.\n *\n * NOTE: This directive currently uses a very simple (naive) approach to focus trapping.\n * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n * Things like tabIndex > 0, flex `order`, and shadow roots can cause to two to misalign.\n * This will be replaced with a more intelligent solution before the library is considered stable.\n */\nvar FocusTrap = (function () {\n    function FocusTrap(_checker, _ngZone) {\n        this._checker = _checker;\n        this._ngZone = _ngZone;\n        this._disabled = false;\n    }\n    Object.defineProperty(FocusTrap.prototype, \"disabled\", {\n        /** Whether the focus trap is active. */\n        get: function () { return this._disabled; },\n        set: function (val) { this._disabled = coerceBooleanProperty(val); },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Waits for microtask queue to empty, then focuses the first tabbable element within the focus\n     * trap region.\n     */\n    FocusTrap.prototype.focusFirstTabbableElementWhenReady = function () {\n        var _this = this;\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            _this.focusFirstTabbableElement();\n        });\n    };\n    /**\n     * Waits for microtask queue to empty, then focuses the last tabbable element within the focus\n     * trap region.\n     */\n    FocusTrap.prototype.focusLastTabbableElementWhenReady = function () {\n        var _this = this;\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            _this.focusLastTabbableElement();\n        });\n    };\n    /**\n     * Focuses the first tabbable element within the focus trap region.\n     */\n    FocusTrap.prototype.focusFirstTabbableElement = function () {\n        var rootElement = this.trappedContent.nativeElement;\n        var redirectToElement = rootElement.querySelector('[cdk-focus-start]') ||\n            this._getFirstTabbableElement(rootElement);\n        if (redirectToElement) {\n            redirectToElement.focus();\n        }\n    };\n    /**\n     * Focuses the last tabbable element within the focus trap region.\n     */\n    FocusTrap.prototype.focusLastTabbableElement = function () {\n        var rootElement = this.trappedContent.nativeElement;\n        var focusTargets = rootElement.querySelectorAll('[cdk-focus-end]');\n        var redirectToElement = null;\n        if (focusTargets.length) {\n            redirectToElement = focusTargets[focusTargets.length - 1];\n        }\n        else {\n            redirectToElement = this._getLastTabbableElement(rootElement);\n        }\n        if (redirectToElement) {\n            redirectToElement.focus();\n        }\n    };\n    /** Get the first tabbable element from a DOM subtree (inclusive). */\n    FocusTrap.prototype._getFirstTabbableElement = function (root) {\n        if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n            return root;\n        }\n        // Iterate in DOM order.\n        var childCount = root.children.length;\n        for (var i = 0; i < childCount; i++) {\n            var tabbableChild = this._getFirstTabbableElement(root.children[i]);\n            if (tabbableChild) {\n                return tabbableChild;\n            }\n        }\n        return null;\n    };\n    /** Get the last tabbable element from a DOM subtree (inclusive). */\n    FocusTrap.prototype._getLastTabbableElement = function (root) {\n        if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n            return root;\n        }\n        // Iterate in reverse DOM order.\n        for (var i = root.children.length - 1; i >= 0; i--) {\n            var tabbableChild = this._getLastTabbableElement(root.children[i]);\n            if (tabbableChild) {\n                return tabbableChild;\n            }\n        }\n        return null;\n    };\n    __decorate$15([\n        _angular_core.ViewChild('trappedContent'), \n        __metadata$15('design:type', _angular_core.ElementRef)\n    ], FocusTrap.prototype, \"trappedContent\", void 0);\n    __decorate$15([\n        _angular_core.Input(), \n        __metadata$15('design:type', Boolean)\n    ], FocusTrap.prototype, \"disabled\", null);\n    FocusTrap = __decorate$15([\n        _angular_core.Component({selector: 'cdk-focus-trap, focus-trap',\n            template: \"<div *ngIf=\\\"!disabled\\\" tabindex=\\\"0\\\" (focus)=\\\"focusLastTabbableElement()\\\"></div><div #trappedContent class=\\\"cdk-focus-trap-content\\\"><ng-content></ng-content></div><div *ngIf=\\\"!disabled\\\" tabindex=\\\"0\\\" (focus)=\\\"focusFirstTabbableElement()\\\"></div>\",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$15('design:paramtypes', [InteractivityChecker, _angular_core.NgZone])\n    ], FocusTrap);\n    return FocusTrap;\n}());\n\nvar __decorate$18 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$18 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$3 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LIVE_ANNOUNCER_ELEMENT_TOKEN = new _angular_core.OpaqueToken('liveAnnouncerElement');\nvar LiveAnnouncer = (function () {\n    function LiveAnnouncer(elementToken) {\n        // We inject the live element as `any` because the constructor signature cannot reference\n        // browser globals (HTMLElement) on non-browser environments, since having a class decorator\n        // causes TypeScript to preserve the constructor signature types.\n        this._liveElement = elementToken || this._createLiveElement();\n    }\n    /**\n     * Announces a message to screenreaders.\n     * @param message Message to be announced to the screenreader\n     * @param politeness The politeness of the announcer element\n     */\n    LiveAnnouncer.prototype.announce = function (message, politeness) {\n        var _this = this;\n        if (politeness === void 0) { politeness = 'polite'; }\n        this._liveElement.textContent = '';\n        // TODO: ensure changing the politeness works on all environments we support.\n        this._liveElement.setAttribute('aria-live', politeness);\n        // This 100ms timeout is necessary for some browser + screen-reader combinations:\n        // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n        // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n        //   second time without clearing and then using a non-zero delay.\n        // (using JAWS 17 at time of this writing).\n        setTimeout(function () { return _this._liveElement.textContent = message; }, 100);\n    };\n    /** Removes the aria-live element from the DOM. */\n    LiveAnnouncer.prototype._removeLiveElement = function () {\n        if (this._liveElement && this._liveElement.parentNode) {\n            this._liveElement.parentNode.removeChild(this._liveElement);\n        }\n    };\n    LiveAnnouncer.prototype._createLiveElement = function () {\n        var liveEl = document.createElement('div');\n        liveEl.classList.add('cdk-visually-hidden');\n        liveEl.setAttribute('aria-atomic', 'true');\n        liveEl.setAttribute('aria-live', 'polite');\n        document.body.appendChild(liveEl);\n        return liveEl;\n    };\n    LiveAnnouncer = __decorate$18([\n        _angular_core.Injectable(),\n        __param$3(0, _angular_core.Optional()),\n        __param$3(0, _angular_core.Inject(LIVE_ANNOUNCER_ELEMENT_TOKEN)), \n        __metadata$18('design:paramtypes', [Object])\n    ], LiveAnnouncer);\n    return LiveAnnouncer;\n}());\n\nvar supportedInputTypes;\n/** @returns The input types supported by this browser. */\nfunction getSupportedInputTypes() {\n    if (!supportedInputTypes) {\n        var featureTestInput_1 = document.createElement('input');\n        supportedInputTypes = new Set([\n            'button',\n            'checkbox',\n            'color',\n            'date',\n            'datetime-local',\n            'email',\n            'file',\n            'hidden',\n            'image',\n            'month',\n            'number',\n            'password',\n            'radio',\n            'range',\n            'reset',\n            'search',\n            'submit',\n            'tel',\n            'text',\n            'time',\n            'url',\n            'week',\n        ].filter(function (value) {\n            featureTestInput_1.setAttribute('type', value);\n            return featureTestInput_1.type === value;\n        }));\n    }\n    return supportedInputTypes;\n}\n\nvar __decorate$19 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$19 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar PlatformModule = (function () {\n    function PlatformModule() {\n    }\n    PlatformModule.forRoot = function () {\n        return {\n            ngModule: PlatformModule,\n            providers: [Platform],\n        };\n    };\n    PlatformModule = __decorate$19([\n        _angular_core.NgModule({}), \n        __metadata$19('design:paramtypes', [])\n    ], PlatformModule);\n    return PlatformModule;\n}());\n\nvar __decorate$14 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$14 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar A11Y_PROVIDERS = [LiveAnnouncer, InteractivityChecker];\nvar A11yModule = (function () {\n    function A11yModule() {\n    }\n    A11yModule.forRoot = function () {\n        return {\n            ngModule: A11yModule,\n            providers: [\n                PlatformModule.forRoot().providers,\n                A11Y_PROVIDERS,\n            ],\n        };\n    };\n    A11yModule = __decorate$14([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, PlatformModule],\n            declarations: [FocusTrap],\n            exports: [FocusTrap],\n        }), \n        __metadata$14('design:paramtypes', [])\n    ], A11yModule);\n    return A11yModule;\n}());\n\nvar __decorate$20 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$20 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// \"Polyfill\" for `Node.replaceWith()`.\n// cf. https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith\nfunction _replaceWith(toReplaceEl, otherEl) {\n    toReplaceEl.parentElement.replaceChild(otherEl, toReplaceEl);\n}\n/** @docs-private */\nvar DomProjectionHost = (function () {\n    function DomProjectionHost(ref) {\n        this.ref = ref;\n    }\n    DomProjectionHost = __decorate$20([\n        _angular_core.Directive({\n            selector: 'cdk-dom-projection-host'\n        }), \n        __metadata$20('design:paramtypes', [_angular_core.ElementRef])\n    ], DomProjectionHost);\n    return DomProjectionHost;\n}());\n/** @docs-private */\nvar DomProjection = (function () {\n    function DomProjection() {\n    }\n    /**\n     * Project an element into a host element.\n     * Replace a host element by another element. This also replaces the children of the element\n     * by the children of the host.\n     *\n     * It should be used like this:\n     *\n     * ```\n     *   @Component({\n     *     template: `<div>\n     *       <cdk-dom-projection-host>\n     *         <div>other</div>\n     *         <ng-content></ng-content>\n     *       </cdk-dom-projection-host>\n     *     </div>`\n     *   })\n     *   class Cmpt {\n     *     constructor(private _projector: DomProjection, private _el: ElementRef) {}\n     *     ngOnInit() { this._projector.project(this._el, this._projector); }\n     *   }\n     * ```\n     *\n     * This component will move the content of the element it's applied to in the outer div. Because\n     * `project()` also move the children of the host inside the projected element, the element will\n     * contain the `<div>other</div>` HTML as well as its own children.\n     *\n     * Note: without `<ng-content></ng-content>` the projection will project an empty element.\n     *\n     * @param ref ElementRef to be projected.\n     * @param host Projection host into which to project the `ElementRef`.\n     */\n    DomProjection.prototype.project = function (ref, host) {\n        var projectedEl = ref.nativeElement;\n        var hostEl = host.ref.nativeElement;\n        var childNodes = projectedEl.childNodes;\n        var child = childNodes[0];\n        // We hoist all of the projected element's children out into the projected elements position\n        // because we *only* want to move the projected element and not its children.\n        _replaceWith(projectedEl, child);\n        var l = childNodes.length;\n        while (l--) {\n            child.parentNode.insertBefore(childNodes[0], child.nextSibling);\n            child = child.nextSibling; // nextSibling is now the childNodes[0].\n        }\n        // Insert all host children under the projectedEl, then replace host by component.\n        l = hostEl.childNodes.length;\n        while (l--) {\n            projectedEl.appendChild(hostEl.childNodes[0]);\n        }\n        _replaceWith(hostEl, projectedEl);\n        // At this point the host is replaced by the component. Nothing else to be done.\n    };\n    DomProjection = __decorate$20([\n        _angular_core.Injectable(), \n        __metadata$20('design:paramtypes', [])\n    ], DomProjection);\n    return DomProjection;\n}());\n/** @docs-private */\nvar ProjectionModule = (function () {\n    function ProjectionModule() {\n    }\n    ProjectionModule.forRoot = function () {\n        return {\n            ngModule: ProjectionModule,\n            providers: [DomProjection]\n        };\n    };\n    ProjectionModule = __decorate$20([\n        _angular_core.NgModule({\n            exports: [DomProjectionHost],\n            declarations: [DomProjectionHost],\n        }), \n        __metadata$20('design:paramtypes', [])\n    ], ProjectionModule);\n    return ProjectionModule;\n}());\n\nvar __extends$5 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$21 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$21 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/* Adjusts configuration of our gesture library, Hammer. */\nvar GestureConfig = (function (_super) {\n    __extends$5(GestureConfig, _super);\n    function GestureConfig() {\n        _super.call(this);\n        this._hammer = typeof window !== 'undefined' ? window.Hammer : null;\n        /* List of new event names to add to the gesture support list */\n        this.events = this._hammer ? [\n            'longpress',\n            'slide',\n            'slidestart',\n            'slideend',\n            'slideright',\n            'slideleft'\n        ] : [];\n        if (!this._hammer && _angular_core.isDevMode()) {\n            console.warn('Could not find HammerJS. Certain Angular Material ' +\n                'components may not work correctly.');\n        }\n    }\n    /**\n     * Builds Hammer instance manually to add custom recognizers that match the Material Design spec.\n     *\n     * Our gesture names come from the Material Design gestures spec:\n     * https://www.google.com/design/spec/patterns/gestures.html#gestures-touch-mechanics\n     *\n     * More information on default recognizers can be found in Hammer docs:\n     * http://hammerjs.github.io/recognizer-pan/\n     * http://hammerjs.github.io/recognizer-press/\n     *\n     * @param element Element to which to assign the new HammerJS gestures.\n     * @returns Newly-created HammerJS instance.\n     */\n    GestureConfig.prototype.buildHammer = function (element) {\n        var mc = new this._hammer(element);\n        // Default Hammer Recognizers.\n        var pan = new this._hammer.Pan();\n        var swipe = new this._hammer.Swipe();\n        var press = new this._hammer.Press();\n        // Notice that a HammerJS recognizer can only depend on one other recognizer once.\n        // Otherwise the previous `recognizeWith` will be dropped.\n        // TODO: Confirm threshold numbers with Material Design UX Team\n        var slide = this._createRecognizer(pan, { event: 'slide', threshold: 0 }, swipe);\n        var longpress = this._createRecognizer(press, { event: 'longpress', time: 500 });\n        // Overwrite the default `pan` event to use the swipe event.\n        pan.recognizeWith(swipe);\n        // Add customized gestures to Hammer manager\n        mc.add([swipe, press, pan, slide, longpress]);\n        return mc;\n    };\n    /** Creates a new recognizer, without affecting the default recognizers of HammerJS */\n    GestureConfig.prototype._createRecognizer = function (base, options) {\n        var inheritances = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            inheritances[_i - 2] = arguments[_i];\n        }\n        var recognizer = new base.constructor(options);\n        inheritances.push(base);\n        inheritances.forEach(function (item) { return recognizer.recognizeWith(item); });\n        return recognizer;\n    };\n    GestureConfig = __decorate$21([\n        _angular_core.Injectable(), \n        __metadata$21('design:paramtypes', [])\n    ], GestureConfig);\n    return GestureConfig;\n}(_angular_platformBrowser.HammerGestureConfig));\n\n/**\n * Stripped-down HammerJS annotations to be used within Material, which are necessary,\n * because HammerJS is an optional dependency. For the full annotations see:\n * https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/hammerjs\n */\n\n/**\n * Screenreaders will often fire fake mousedown events when a focusable element\n * is activated using the keyboard. We can typically distinguish between these faked\n * mousedown events and real mousedown events using the \"buttons\" property. While\n * real mousedowns will indicate the mouse button that was pressed (e.g. \"1\" for\n * the left mouse button), faked mousedowns will usually set the property value to 0.\n */\nfunction isFakeMousedownFromScreenReader(event) {\n    return event.buttons === 0;\n}\n\nvar __decorate$22 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$22 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nvar UniqueSelectionDispatcher = (function () {\n    function UniqueSelectionDispatcher() {\n        this._listeners = [];\n    }\n    /**\n     * Notify other items that selection for the given name has been set.\n     * @param id ID of the item.\n     * @param name Name of the item.\n     */\n    UniqueSelectionDispatcher.prototype.notify = function (id, name) {\n        for (var _i = 0, _a = this._listeners; _i < _a.length; _i++) {\n            var listener = _a[_i];\n            listener(id, name);\n        }\n    };\n    /** Listen for future changes to item selection. */\n    UniqueSelectionDispatcher.prototype.listen = function (listener) {\n        this._listeners.push(listener);\n    };\n    UniqueSelectionDispatcher = __decorate$22([\n        _angular_core.Injectable(), \n        __metadata$22('design:paramtypes', [])\n    ], UniqueSelectionDispatcher);\n    return UniqueSelectionDispatcher;\n}());\n\n/**\n * Applies a CSS transform to an element, including browser-prefixed properties.\n * @param element\n * @param transformValue\n */\nfunction applyCssTransform(element, transformValue) {\n    // It's important to trim the result, because the browser will ignore the set operation\n    // if the string contains only whitespace.\n    var value = transformValue.trim();\n    element.style.transform = value;\n    element.style.webkitTransform = value;\n}\n\n// Due to a bug in the ChromeDriver, Angular 2 keyboard events are not triggered by `sendKeys`\n// during E2E tests when using dot notation such as `(keydown.rightArrow)`. To get around this,\n// we are temporarily using a single (keydown) handler.\n// See: https://github.com/angular/angular/issues/9419\nvar UP_ARROW = 38;\nvar DOWN_ARROW = 40;\nvar RIGHT_ARROW = 39;\nvar LEFT_ARROW = 37;\nvar PAGE_UP = 33;\nvar PAGE_DOWN = 34;\nvar HOME = 36;\nvar END = 35;\nvar ENTER = 13;\nvar SPACE = 32;\nvar TAB = 9;\nvar ESCAPE = 27;\nvar BACKSPACE = 8;\nvar DELETE = 46;\n\n/** @docs-private */\nvar AnimationCurves = (function () {\n    function AnimationCurves() {\n    }\n    AnimationCurves.STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n    AnimationCurves.DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n    AnimationCurves.ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n    AnimationCurves.SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n    return AnimationCurves;\n}());\n/** @docs-private */\nvar AnimationDurations = (function () {\n    function AnimationDurations() {\n    }\n    AnimationDurations.COMPLEX = '375ms';\n    AnimationDurations.ENTERING = '225ms';\n    AnimationDurations.EXITING = '195ms';\n    return AnimationDurations;\n}());\n\n/** Coerces a data-bound value (typically a string) to a number. */\nfunction coerceNumberProperty(value, fallbackValue) {\n    if (fallbackValue === void 0) { fallbackValue = 0; }\n    // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n    // and other non-number values as NaN, where Number just uses 0) but it considers the string\n    // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n    return isNaN(parseFloat(value)) || isNaN(Number(value)) ? fallbackValue : Number(value);\n}\n\nvar __decorate$23 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$23 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Selector that matches all elements that may have style collisions with material1. */\nvar MD_ELEMENTS_SELECTOR = \"\\n  md-autocomplete,\\n  md-card,\\n  md-card-actions,\\n  md-card-content,\\n  md-card-footer,\\n  md-card-header,\\n  md-card-subtitle,\\n  md-card-title,\\n  md-card-title-group,\\n  md-checkbox,\\n  md-chip,\\n  md-dialog-container,\\n  md-divider,\\n  md-grid-list,\\n  md-grid-tile,\\n  md-grid-tile-footer,\\n  md-grid-tile-header,\\n  md-hint,\\n  md-icon,\\n  md-ink-bar,\\n  md-input,\\n  md-list,\\n  md-list-item,\\n  md-menu,\\n  md-nav-list,\\n  md-option,\\n  md-placeholder,\\n  md-progress-bar,\\n  md-progress-circle,\\n  md-radio-button,\\n  md-radio-group,\\n  md-select,\\n  md-sidenav,\\n  md-slider,\\n  md-spinner,\\n  md-tab,\\n  md-toolbar\\n\";\n/** Directive that enforces that the `md-` prefix cannot be used. */\nvar MdPrefixEnforcer = (function () {\n    function MdPrefixEnforcer() {\n        throw Error('The \"md-\" prefix cannot be used in ng-material v1 compatibility mode.');\n    }\n    MdPrefixEnforcer = __decorate$23([\n        _angular_core.Directive({ selector: MD_ELEMENTS_SELECTOR }), \n        __metadata$23('design:paramtypes', [])\n    ], MdPrefixEnforcer);\n    return MdPrefixEnforcer;\n}());\nvar NoConflictStyleCompatibilityMode = (function () {\n    function NoConflictStyleCompatibilityMode() {\n    }\n    NoConflictStyleCompatibilityMode.forRoot = function () {\n        return {\n            ngModule: NoConflictStyleCompatibilityMode,\n            providers: [],\n        };\n    };\n    NoConflictStyleCompatibilityMode = __decorate$23([\n        _angular_core.NgModule({\n            declarations: [MdPrefixEnforcer],\n            exports: [MdPrefixEnforcer],\n            providers: [{\n                    provide: MATERIAL_COMPATIBILITY_MODE, useValue: true,\n                }],\n        }), \n        __metadata$23('design:paramtypes', [])\n    ], NoConflictStyleCompatibilityMode);\n    return NoConflictStyleCompatibilityMode;\n}());\n\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdCoreModule = (function () {\n    function MdCoreModule() {\n    }\n    MdCoreModule.forRoot = function () {\n        return {\n            ngModule: MdCoreModule,\n            providers: [A11Y_PROVIDERS, OVERLAY_PROVIDERS],\n        };\n    };\n    MdCoreModule = __decorate([\n        _angular_core.NgModule({\n            imports: [\n                MdLineModule,\n                RtlModule,\n                MdRippleModule,\n                ObserveContentModule,\n                PortalModule,\n                OverlayModule,\n                A11yModule,\n            ],\n            exports: [\n                MdLineModule,\n                RtlModule,\n                MdRippleModule,\n                ObserveContentModule,\n                PortalModule,\n                OverlayModule,\n                A11yModule,\n            ],\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdCoreModule);\n    return MdCoreModule;\n}());\n\nvar __decorate$25 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$25 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$4 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Provider Expression that allows md-button-toggle-group to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nvar MD_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdButtonToggleGroup; }),\n    multi: true\n};\nvar _uniqueIdCounter = 0;\n/** Change event object emitted by MdButtonToggle. */\nvar MdButtonToggleChange = (function () {\n    function MdButtonToggleChange() {\n    }\n    return MdButtonToggleChange;\n}());\n/** Exclusive selection button toggle group that behaves like a radio-button group. */\nvar MdButtonToggleGroup = (function () {\n    function MdButtonToggleGroup() {\n        /** The value for the button toggle group. Should match currently selected button toggle. */\n        this._value = null;\n        /** The HTML name attribute applied to toggles in this group. */\n        this._name = \"md-radio-group-\" + _uniqueIdCounter++;\n        /** Disables all toggles in the group. */\n        this._disabled = null;\n        /** Whether the button toggle group should be vertical. */\n        this._vertical = false;\n        /** The currently selected button toggle, should match the value. */\n        this._selected = null;\n        /** Whether the button toggle group is initialized or not. */\n        this._isInitialized = false;\n        /**\n         * The method to be called in order to update ngModel.\n         * Now `ngModel` binding is not supported in multiple selection mode.\n         */\n        this._controlValueAccessorChangeFn = function (value) { };\n        /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n        this.onTouched = function () { };\n        /** Event emitted when the group's value changes. */\n        this._change = new _angular_core.EventEmitter();\n        /** Child button toggle buttons. */\n        this._buttonToggles = null;\n    }\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"change\", {\n        get: function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdButtonToggleGroup.prototype.ngAfterViewInit = function () {\n        this._isInitialized = true;\n    };\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"name\", {\n        /** `name` attribute for the underlying `input` element. */\n        get: function () {\n            return this._name;\n        },\n        set: function (value) {\n            this._name = value;\n            this._updateButtonToggleNames();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"disabled\", {\n        /** Whether the toggle group is disabled. */\n        get: function () {\n            return this._disabled;\n        },\n        set: function (value) {\n            this._disabled = coerceBooleanProperty(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"vertical\", {\n        /** Whether the toggle group is vertical. */\n        get: function () {\n            return this._vertical;\n        },\n        set: function (value) {\n            this._vertical = coerceBooleanProperty(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"value\", {\n        /** Value of the toggle group. */\n        get: function () {\n            return this._value;\n        },\n        set: function (newValue) {\n            if (this._value != newValue) {\n                this._value = newValue;\n                this._updateSelectedButtonToggleFromValue();\n                // Only emit a change event if the view is completely initialized.\n                // We don't want to emit a change event for the initial values.\n                if (this._isInitialized) {\n                    this._emitChangeEvent();\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggleGroup.prototype, \"selected\", {\n        /** Whether the toggle group is selected. */\n        get: function () {\n            return this._selected;\n        },\n        set: function (selected) {\n            this._selected = selected;\n            this.value = selected ? selected.value : null;\n            if (selected && !selected.checked) {\n                selected.checked = true;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdButtonToggleGroup.prototype._updateButtonToggleNames = function () {\n        var _this = this;\n        if (this._buttonToggles) {\n            this._buttonToggles.forEach(function (toggle) {\n                toggle.name = _this._name;\n            });\n        }\n    };\n    // TODO: Refactor into shared code with radio.\n    MdButtonToggleGroup.prototype._updateSelectedButtonToggleFromValue = function () {\n        var _this = this;\n        var isAlreadySelected = this._selected != null && this._selected.value == this._value;\n        if (this._buttonToggles != null && !isAlreadySelected) {\n            var matchingButtonToggle = this._buttonToggles.filter(function (buttonToggle) { return buttonToggle.value == _this._value; })[0];\n            if (matchingButtonToggle) {\n                this.selected = matchingButtonToggle;\n            }\n            else if (this.value == null) {\n                this.selected = null;\n                this._buttonToggles.forEach(function (buttonToggle) {\n                    buttonToggle.checked = false;\n                });\n            }\n        }\n    };\n    /** Dispatch change event with current selection and group value. */\n    MdButtonToggleGroup.prototype._emitChangeEvent = function () {\n        var event = new MdButtonToggleChange();\n        event.source = this._selected;\n        event.value = this._value;\n        this._controlValueAccessorChangeFn(event.value);\n        this._change.emit(event);\n    };\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value Value to be set to the model.\n     */\n    MdButtonToggleGroup.prototype.writeValue = function (value) {\n        this.value = value;\n    };\n    /**\n     * Registers a callback that will be triggered when the value has changed.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn On change callback function.\n     */\n    MdButtonToggleGroup.prototype.registerOnChange = function (fn) {\n        this._controlValueAccessorChangeFn = fn;\n    };\n    /**\n     * Registers a callback that will be triggered when the control has been touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn On touch callback function.\n     */\n    MdButtonToggleGroup.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    __decorate$25([\n        _angular_core.Output(), \n        __metadata$25('design:type', rxjs_Observable.Observable)\n    ], MdButtonToggleGroup.prototype, \"change\", null);\n    __decorate$25([\n        _angular_core.ContentChildren(_angular_core.forwardRef(function () { return MdButtonToggle; })), \n        __metadata$25('design:type', _angular_core.QueryList)\n    ], MdButtonToggleGroup.prototype, \"_buttonToggles\", void 0);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', String)\n    ], MdButtonToggleGroup.prototype, \"name\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggleGroup.prototype, \"disabled\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggleGroup.prototype, \"vertical\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Object)\n    ], MdButtonToggleGroup.prototype, \"value\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Object)\n    ], MdButtonToggleGroup.prototype, \"selected\", null);\n    MdButtonToggleGroup = __decorate$25([\n        _angular_core.Directive({\n            selector: 'md-button-toggle-group:not([multiple])',\n            providers: [MD_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR],\n            host: {\n                'role': 'radiogroup',\n                '[class.md-button-toggle-vertical]': 'vertical'\n            },\n            exportAs: 'mdButtonToggleGroup',\n        }), \n        __metadata$25('design:paramtypes', [])\n    ], MdButtonToggleGroup);\n    return MdButtonToggleGroup;\n}());\n/** Multiple selection button-toggle group. `ngModel` is not supported in this mode. */\nvar MdButtonToggleGroupMultiple = (function () {\n    function MdButtonToggleGroupMultiple() {\n        /** Disables all toggles in the group. */\n        this._disabled = null;\n        /** Whether the button toggle group should be vertical. */\n        this._vertical = false;\n    }\n    Object.defineProperty(MdButtonToggleGroupMultiple.prototype, \"disabled\", {\n        /** Whether the toggle group is disabled. */\n        get: function () {\n            return this._disabled;\n        },\n        set: function (value) {\n            this._disabled = (value != null && value !== false) ? true : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggleGroupMultiple.prototype, \"vertical\", {\n        /** Whether the toggle group is vertical. */\n        get: function () {\n            return this._vertical;\n        },\n        set: function (value) {\n            this._vertical = coerceBooleanProperty(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggleGroupMultiple.prototype, \"disabled\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggleGroupMultiple.prototype, \"vertical\", null);\n    MdButtonToggleGroupMultiple = __decorate$25([\n        _angular_core.Directive({\n            selector: 'md-button-toggle-group[multiple]',\n            exportAs: 'mdButtonToggleGroup',\n            host: {\n                '[class.md-button-toggle-vertical]': 'vertical'\n            }\n        }), \n        __metadata$25('design:paramtypes', [])\n    ], MdButtonToggleGroupMultiple);\n    return MdButtonToggleGroupMultiple;\n}());\n/** Single button inside of a toggle group. */\nvar MdButtonToggle = (function () {\n    function MdButtonToggle(toggleGroup, toggleGroupMultiple, buttonToggleDispatcher, _renderer) {\n        var _this = this;\n        this.buttonToggleDispatcher = buttonToggleDispatcher;\n        this._renderer = _renderer;\n        /** Whether or not this button toggle is checked. */\n        this._checked = false;\n        /** Whether or not this button toggle is disabled. */\n        this._disabled = null;\n        /** Value assigned to this button toggle. */\n        this._value = null;\n        /** Whether or not the button toggle is a single selection. */\n        this._isSingleSelector = null;\n        /** Event emitted when the group value changes. */\n        this._change = new _angular_core.EventEmitter();\n        this.buttonToggleGroup = toggleGroup;\n        this.buttonToggleGroupMultiple = toggleGroupMultiple;\n        if (this.buttonToggleGroup) {\n            buttonToggleDispatcher.listen(function (id, name) {\n                if (id != _this.id && name == _this.name) {\n                    _this.checked = false;\n                }\n            });\n            this._type = 'radio';\n            this.name = this.buttonToggleGroup.name;\n            this._isSingleSelector = true;\n        }\n        else {\n            // Even if there is no group at all, treat the button toggle as a checkbox so it can be\n            // toggled on or off.\n            this._type = 'checkbox';\n            this._isSingleSelector = false;\n        }\n    }\n    Object.defineProperty(MdButtonToggle.prototype, \"change\", {\n        get: function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdButtonToggle.prototype.ngOnInit = function () {\n        if (this.id == null) {\n            this.id = \"md-button-toggle-\" + _uniqueIdCounter++;\n        }\n        if (this.buttonToggleGroup && this._value == this.buttonToggleGroup.value) {\n            this._checked = true;\n        }\n    };\n    Object.defineProperty(MdButtonToggle.prototype, \"inputId\", {\n        /** Unique ID for the underlying `input` element. */\n        get: function () {\n            return this.id + \"-input\";\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggle.prototype, \"checked\", {\n        /** Whether the button is checked. */\n        get: function () {\n            return this._checked;\n        },\n        set: function (newCheckedState) {\n            if (this._isSingleSelector) {\n                if (newCheckedState) {\n                    // Notify all button toggles with the same name (in the same group) to un-check.\n                    this.buttonToggleDispatcher.notify(this.id, this.name);\n                }\n            }\n            this._checked = newCheckedState;\n            if (newCheckedState && this._isSingleSelector && this.buttonToggleGroup.value != this.value) {\n                this.buttonToggleGroup.selected = this;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButtonToggle.prototype, \"value\", {\n        /** MdButtonToggleGroup reads this to assign its own value. */\n        get: function () {\n            return this._value;\n        },\n        set: function (value) {\n            if (this._value != value) {\n                if (this.buttonToggleGroup != null && this.checked) {\n                    this.buttonToggleGroup.value = value;\n                }\n                this._value = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Dispatch change event with current value. */\n    MdButtonToggle.prototype._emitChangeEvent = function () {\n        var event = new MdButtonToggleChange();\n        event.source = this;\n        event.value = this._value;\n        this._change.emit(event);\n    };\n    Object.defineProperty(MdButtonToggle.prototype, \"disabled\", {\n        /** Whether the button is disabled. */\n        get: function () {\n            return this._disabled || (this.buttonToggleGroup != null && this.buttonToggleGroup.disabled) ||\n                (this.buttonToggleGroupMultiple != null && this.buttonToggleGroupMultiple.disabled);\n        },\n        set: function (value) {\n            this._disabled = (value != null && value !== false) ? true : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Toggle the state of the current button toggle. */\n    MdButtonToggle.prototype._toggle = function () {\n        this.checked = !this.checked;\n    };\n    /** Checks the button toggle due to an interaction with the underlying native input. */\n    MdButtonToggle.prototype._onInputChange = function (event) {\n        event.stopPropagation();\n        if (this._isSingleSelector) {\n            // Propagate the change one-way via the group, which will in turn mark this\n            // button toggle as checked.\n            this.checked = true;\n            this.buttonToggleGroup.selected = this;\n            this.buttonToggleGroup.onTouched();\n        }\n        else {\n            this._toggle();\n        }\n        // Emit a change event when the native input does.\n        this._emitChangeEvent();\n    };\n    MdButtonToggle.prototype._onInputClick = function (event) {\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `slide-toggle` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    };\n    /** Focuses the button. */\n    MdButtonToggle.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');\n    };\n    __decorate$25([\n        _angular_core.HostBinding(),\n        _angular_core.Input(), \n        __metadata$25('design:type', String)\n    ], MdButtonToggle.prototype, \"id\", void 0);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', String)\n    ], MdButtonToggle.prototype, \"name\", void 0);\n    __decorate$25([\n        _angular_core.Output(), \n        __metadata$25('design:type', rxjs_Observable.Observable)\n    ], MdButtonToggle.prototype, \"change\", null);\n    __decorate$25([\n        _angular_core.ViewChild('input'), \n        __metadata$25('design:type', _angular_core.ElementRef)\n    ], MdButtonToggle.prototype, \"_inputElement\", void 0);\n    __decorate$25([\n        _angular_core.HostBinding('class.md-button-toggle-checked'),\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggle.prototype, \"checked\", null);\n    __decorate$25([\n        _angular_core.Input(), \n        __metadata$25('design:type', Object)\n    ], MdButtonToggle.prototype, \"value\", null);\n    __decorate$25([\n        _angular_core.HostBinding('class.md-button-toggle-disabled'),\n        _angular_core.Input(), \n        __metadata$25('design:type', Boolean)\n    ], MdButtonToggle.prototype, \"disabled\", null);\n    MdButtonToggle = __decorate$25([\n        _angular_core.Component({selector: 'md-button-toggle',\n            template: \"<label [attr.for]=\\\"inputId\\\" class=\\\"md-button-toggle-label\\\"><input #input class=\\\"md-button-toggle-input cdk-visually-hidden\\\" [type]=\\\"_type\\\" [id]=\\\"inputId\\\" [checked]=\\\"checked\\\" [disabled]=\\\"disabled\\\" [name]=\\\"name\\\" (change)=\\\"_onInputChange($event)\\\" (click)=\\\"_onInputClick($event)\\\"><div class=\\\"md-button-toggle-label-content\\\"><ng-content></ng-content></div></label>\",\n            styles: [\"md-button-toggle-group{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);position:relative;display:inline-flex;flex-direction:row;border-radius:2px;cursor:pointer;white-space:nowrap}.md-button-toggle-vertical{flex-direction:column}.md-button-toggle-vertical .md-button-toggle-label-content{display:block}.md-button-toggle-disabled .md-button-toggle-label-content{cursor:default}md-button-toggle{white-space:nowrap}.md-button-toggle-label-content{display:inline-block;line-height:36px;padding:0 16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-button-toggle-label-content>*{vertical-align:middle}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }),\n        __param$4(0, _angular_core.Optional()),\n        __param$4(1, _angular_core.Optional()), \n        __metadata$25('design:paramtypes', [MdButtonToggleGroup, MdButtonToggleGroupMultiple, UniqueSelectionDispatcher, _angular_core.Renderer])\n    ], MdButtonToggle);\n    return MdButtonToggle;\n}());\nvar MdButtonToggleModule = (function () {\n    function MdButtonToggleModule() {\n    }\n    MdButtonToggleModule.forRoot = function () {\n        return {\n            ngModule: MdButtonToggleModule,\n            providers: [UniqueSelectionDispatcher]\n        };\n    };\n    MdButtonToggleModule = __decorate$25([\n        _angular_core.NgModule({\n            imports: [_angular_forms.FormsModule, DefaultStyleCompatibilityModeModule],\n            exports: [\n                MdButtonToggleGroup,\n                MdButtonToggleGroupMultiple,\n                MdButtonToggle,\n                DefaultStyleCompatibilityModeModule,\n            ],\n            declarations: [MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle],\n        }), \n        __metadata$25('design:paramtypes', [])\n    ], MdButtonToggleModule);\n    return MdButtonToggleModule;\n}());\n\nvar __extends$6 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$26 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$26 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// TODO(jelbourn): Make the `isMouseDown` stuff done with one global listener.\n// TODO(kara): Convert attribute selectors to classes when attr maps become available\n/**\n * Material design button.\n */\nvar MdButton = (function () {\n    function MdButton(_elementRef, _renderer) {\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        /** Whether the button has focus from the keyboard (not the mouse). Used for class binding. */\n        this._isKeyboardFocused = false;\n        /** Whether a mousedown has occurred on this element in the last 100ms. */\n        this._isMouseDown = false;\n        /** Whether the ripple effect on click should be disabled. */\n        this._disableRipple = false;\n        this._disabled = null;\n    }\n    Object.defineProperty(MdButton.prototype, \"disableRipple\", {\n        /** Whether the ripple effect for this button is disabled. */\n        get: function () { return this._disableRipple; },\n        set: function (v) { this._disableRipple = coerceBooleanProperty(v); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButton.prototype, \"disabled\", {\n        /** Whether the button is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value) ? true : null; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdButton.prototype, \"color\", {\n        /** The color of the button. Can be `primary`, `accent`, or `warn`. */\n        get: function () { return this._color; },\n        set: function (value) { this._updateColor(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdButton.prototype._setMousedown = function () {\n        var _this = this;\n        // We only *show* the focus style when focus has come to the button via the keyboard.\n        // The Material Design spec is silent on this topic, and without doing this, the\n        // button continues to look :active after clicking.\n        // @see http://marcysutton.com/button-focus-hell/\n        this._isMouseDown = true;\n        setTimeout(function () { _this._isMouseDown = false; }, 100);\n    };\n    MdButton.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    MdButton.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this._renderer.setElementClass(this._elementRef.nativeElement, \"md-\" + color, isAdd);\n        }\n    };\n    MdButton.prototype._setKeyboardFocus = function () {\n        this._isKeyboardFocused = !this._isMouseDown;\n    };\n    MdButton.prototype._removeKeyboardFocus = function () {\n        this._isKeyboardFocused = false;\n    };\n    /** Focuses the button. */\n    MdButton.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus');\n    };\n    MdButton.prototype._getHostElement = function () {\n        return this._elementRef.nativeElement;\n    };\n    MdButton.prototype._isRoundButton = function () {\n        var el = this._elementRef.nativeElement;\n        return el.hasAttribute('md-icon-button') ||\n            el.hasAttribute('md-fab') ||\n            el.hasAttribute('md-mini-fab');\n    };\n    MdButton.prototype._isRippleDisabled = function () {\n        return this.disableRipple || this.disabled;\n    };\n    __decorate$26([\n        _angular_core.Input(), \n        __metadata$26('design:type', Object)\n    ], MdButton.prototype, \"disableRipple\", null);\n    __decorate$26([\n        _angular_core.Input(), \n        __metadata$26('design:type', Object)\n    ], MdButton.prototype, \"disabled\", null);\n    __decorate$26([\n        _angular_core.Input(), \n        __metadata$26('design:type', String)\n    ], MdButton.prototype, \"color\", null);\n    MdButton = __decorate$26([\n        _angular_core.Component({selector: 'button[md-button], button[md-raised-button], button[md-icon-button], ' +\n                'button[md-fab], button[md-mini-fab]',\n            host: {\n                '[disabled]': 'disabled',\n                '[class.md-button-focus]': '_isKeyboardFocused',\n                '(mousedown)': '_setMousedown()',\n                '(focus)': '_setKeyboardFocus()',\n                '(blur)': '_removeKeyboardFocus()',\n            },\n            template: \"<span class=\\\"md-button-wrapper\\\"><ng-content></ng-content></span><div md-ripple *ngIf=\\\"!_isRippleDisabled()\\\" class=\\\"md-button-ripple\\\" [class.md-button-ripple-round]=\\\"_isRoundButton()\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\" [mdRippleColor]=\\\"_isRoundButton() ? 'rgba(255, 255, 255, 0.2)' : ''\\\" mdRippleBackgroundColor=\\\"rgba(0, 0, 0, 0)\\\"></div><div class=\\\"md-button-focus-overlay\\\" (touchstart)=\\\"$event.preventDefault()\\\"></div>\",\n            styles: [\".md-button-focus[md-button] .md-button-focus-overlay,.md-button-focus[md-fab] .md-button-focus-overlay,.md-button-focus[md-icon-button] .md-button-focus-overlay,.md-button-focus[md-mini-fab] .md-button-focus-overlay,.md-button-focus[md-raised-button] .md-button-focus-overlay,[md-button]:hover .md-button-focus-overlay,[md-icon-button]:hover .md-button-focus-overlay{opacity:1}[md-icon-button],[md-mini-fab]{width:40px;height:40px}[md-button],[md-fab],[md-icon-button],[md-mini-fab],[md-raised-button]{box-sizing:border-box;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;border:none;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500;color:currentColor;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled][md-button],[disabled][md-fab],[disabled][md-icon-button],[disabled][md-mini-fab],[disabled][md-raised-button]{cursor:default}[md-fab],[md-mini-fab],[md-raised-button]{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}[md-fab],[md-mini-fab]{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);flex-shrink:0;padding:0;min-width:0;border-radius:50%}[md-fab]:active,[md-mini-fab]:active,[md-raised-button]:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled][md-fab],[disabled][md-mini-fab],[disabled][md-raised-button]{box-shadow:none}[md-button][disabled]:hover .md-button-focus-overlay,[md-button][disabled]:hover.md-accent,[md-button][disabled]:hover.md-primary,[md-button][disabled]:hover.md-warn,[md-icon-button][disabled]:hover .md-button-focus-overlay,[md-icon-button][disabled]:hover.md-accent,[md-icon-button][disabled]:hover.md-primary,[md-icon-button][disabled]:hover.md-warn{background-color:transparent}[md-fab]{width:56px;height:56px}[md-fab]:active,[md-mini-fab]:active{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}[md-fab] i,[md-fab] md-icon{padding:16px 0;line-height:24px}[md-mini-fab] i,[md-mini-fab] md-icon{padding:8px 0;line-height:24px}[md-icon-button]{padding:0;min-width:0;flex-shrink:0;line-height:40px;border-radius:50%}[md-icon-button] i,[md-icon-button] md-icon{line-height:24px}[md-button] .md-button-wrapper>*,[md-icon-button] .md-button-wrapper>*,[md-raised-button] .md-button-wrapper>*{vertical-align:middle}.md-button-focus-overlay,.md-button-ripple{position:absolute;top:0;left:0;bottom:0;right:0}.md-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;pointer-events:none;opacity:0}.md-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.md-button-focus-overlay{background-color:rgba(255,255,255,.5)}[md-button],[md-fab],[md-icon-button],[md-mini-fab],[md-raised-button]{outline:solid 1px}}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$26('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdButton);\n    return MdButton;\n}());\n/**\n * Raised Material design button.\n */\nvar MdAnchor = (function (_super) {\n    __extends$6(MdAnchor, _super);\n    function MdAnchor(elementRef, renderer) {\n        _super.call(this, elementRef, renderer);\n    }\n    Object.defineProperty(MdAnchor.prototype, \"tabIndex\", {\n        /** @docs-private */\n        get: function () {\n            return this.disabled ? -1 : 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdAnchor.prototype, \"_isAriaDisabled\", {\n        get: function () {\n            return this.disabled ? 'true' : 'false';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdAnchor.prototype._haltDisabledEvents = function (event) {\n        // A disabled button shouldn't apply any actions\n        if (this.disabled) {\n            event.preventDefault();\n            event.stopImmediatePropagation();\n        }\n    };\n    __decorate$26([\n        _angular_core.HostBinding('tabIndex'), \n        __metadata$26('design:type', Number)\n    ], MdAnchor.prototype, \"tabIndex\", null);\n    MdAnchor = __decorate$26([\n        _angular_core.Component({selector: 'a[md-button], a[md-raised-button], a[md-icon-button], a[md-fab], a[md-mini-fab]',\n            inputs: ['color', 'disabled', 'disableRipple'],\n            host: {\n                '[attr.disabled]': 'disabled',\n                '[attr.aria-disabled]': '_isAriaDisabled',\n                '[class.md-button-focus]': '_isKeyboardFocused',\n                '(mousedown)': '_setMousedown()',\n                '(focus)': '_setKeyboardFocus()',\n                '(blur)': '_removeKeyboardFocus()',\n                '(click)': '_haltDisabledEvents($event)',\n            },\n            template: \"<span class=\\\"md-button-wrapper\\\"><ng-content></ng-content></span><div md-ripple *ngIf=\\\"!_isRippleDisabled()\\\" class=\\\"md-button-ripple\\\" [class.md-button-ripple-round]=\\\"_isRoundButton()\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\" [mdRippleColor]=\\\"_isRoundButton() ? 'rgba(255, 255, 255, 0.2)' : ''\\\" mdRippleBackgroundColor=\\\"rgba(0, 0, 0, 0)\\\"></div><div class=\\\"md-button-focus-overlay\\\" (touchstart)=\\\"$event.preventDefault()\\\"></div>\",\n            styles: [\".md-button-focus[md-button] .md-button-focus-overlay,.md-button-focus[md-fab] .md-button-focus-overlay,.md-button-focus[md-icon-button] .md-button-focus-overlay,.md-button-focus[md-mini-fab] .md-button-focus-overlay,.md-button-focus[md-raised-button] .md-button-focus-overlay,[md-button]:hover .md-button-focus-overlay,[md-icon-button]:hover .md-button-focus-overlay{opacity:1}[md-icon-button],[md-mini-fab]{width:40px;height:40px}[md-button],[md-fab],[md-icon-button],[md-mini-fab],[md-raised-button]{box-sizing:border-box;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;border:none;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500;color:currentColor;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled][md-button],[disabled][md-fab],[disabled][md-icon-button],[disabled][md-mini-fab],[disabled][md-raised-button]{cursor:default}[md-fab],[md-mini-fab],[md-raised-button]{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}[md-fab],[md-mini-fab]{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);flex-shrink:0;padding:0;min-width:0;border-radius:50%}[md-fab]:active,[md-mini-fab]:active,[md-raised-button]:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled][md-fab],[disabled][md-mini-fab],[disabled][md-raised-button]{box-shadow:none}[md-button][disabled]:hover .md-button-focus-overlay,[md-button][disabled]:hover.md-accent,[md-button][disabled]:hover.md-primary,[md-button][disabled]:hover.md-warn,[md-icon-button][disabled]:hover .md-button-focus-overlay,[md-icon-button][disabled]:hover.md-accent,[md-icon-button][disabled]:hover.md-primary,[md-icon-button][disabled]:hover.md-warn{background-color:transparent}[md-fab]{width:56px;height:56px}[md-fab]:active,[md-mini-fab]:active{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}[md-fab] i,[md-fab] md-icon{padding:16px 0;line-height:24px}[md-mini-fab] i,[md-mini-fab] md-icon{padding:8px 0;line-height:24px}[md-icon-button]{padding:0;min-width:0;flex-shrink:0;line-height:40px;border-radius:50%}[md-icon-button] i,[md-icon-button] md-icon{line-height:24px}[md-button] .md-button-wrapper>*,[md-icon-button] .md-button-wrapper>*,[md-raised-button] .md-button-wrapper>*{vertical-align:middle}.md-button-focus-overlay,.md-button-ripple{position:absolute;top:0;left:0;bottom:0;right:0}.md-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;pointer-events:none;opacity:0}.md-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.md-button-focus-overlay{background-color:rgba(255,255,255,.5)}[md-button],[md-fab],[md-icon-button],[md-mini-fab],[md-raised-button]{outline:solid 1px}}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$26('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdAnchor);\n    return MdAnchor;\n}(MdButton));\nvar MdButtonModule = (function () {\n    function MdButtonModule() {\n    }\n    MdButtonModule.forRoot = function () {\n        return {\n            ngModule: MdButtonModule,\n            providers: [ViewportRuler]\n        };\n    };\n    MdButtonModule = __decorate$26([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, MdRippleModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdButton, MdAnchor, DefaultStyleCompatibilityModeModule],\n            declarations: [MdButton, MdAnchor],\n        }), \n        __metadata$26('design:paramtypes', [])\n    ], MdButtonModule);\n    return MdButtonModule;\n}());\n\nvar __decorate$27 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$27 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Monotonically increasing integer used to auto-generate unique ids for checkbox components. */\nvar nextId = 0;\n/**\n * Provider Expression that allows md-checkbox to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nvar MD_CHECKBOX_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdCheckbox; }),\n    multi: true\n};\n/**\n * Represents the different states that require custom transitions between them.\n * @docs-private\n */\n\n(function (TransitionCheckState) {\n    /** The initial state of the component before any user interaction. */\n    TransitionCheckState[TransitionCheckState[\"Init\"] = 0] = \"Init\";\n    /** The state representing the component when it's becoming checked. */\n    TransitionCheckState[TransitionCheckState[\"Checked\"] = 1] = \"Checked\";\n    /** The state representing the component when it's becoming unchecked. */\n    TransitionCheckState[TransitionCheckState[\"Unchecked\"] = 2] = \"Unchecked\";\n    /** The state representing the component when it's becoming indeterminate. */\n    TransitionCheckState[TransitionCheckState[\"Indeterminate\"] = 3] = \"Indeterminate\";\n})(exports.TransitionCheckState || (exports.TransitionCheckState = {}));\n/** Change event object emitted by MdCheckbox. */\nvar MdCheckboxChange = (function () {\n    function MdCheckboxChange() {\n    }\n    return MdCheckboxChange;\n}());\n/**\n * A material design checkbox component. Supports all of the functionality of an HTML5 checkbox,\n * and exposes a similar API. A MdCheckbox can be either checked, unchecked, indeterminate, or\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\n * so there is no need to provide them yourself. However, if you want to omit a label and still\n * have the checkbox be accessible, you may supply an [aria-label] input.\n * See: https://www.google.com/design/spec/components/selection-controls.html\n */\nvar MdCheckbox = (function () {\n    function MdCheckbox(_renderer, _elementRef, _changeDetectorRef) {\n        this._renderer = _renderer;\n        this._elementRef = _elementRef;\n        this._changeDetectorRef = _changeDetectorRef;\n        /**\n         * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\n         * take precedence so this may be omitted.\n         */\n        this.ariaLabel = '';\n        /**\n         * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n         */\n        this.ariaLabelledby = null;\n        /** A unique id for the checkbox. If one is not supplied, it is auto-generated. */\n        this.id = \"md-checkbox-\" + ++nextId;\n        /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n        this.labelPosition = 'after';\n        this._disabled = false;\n        /** @docs-private */\n        this.tabindex = 0;\n        /** Name value will be applied to the input element if present */\n        this.name = null;\n        /** Event emitted when the checkbox's `checked` value changes. */\n        this.change = new _angular_core.EventEmitter();\n        /**\n         * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n         * @docs-private\n         */\n        this.onTouched = function () { };\n        this._currentAnimationClass = '';\n        this._currentCheckState = exports.TransitionCheckState.Init;\n        this._checked = false;\n        this._indeterminate = false;\n        this._controlValueAccessorChangeFn = function (value) { };\n        this._hasFocus = false;\n        this.color = 'accent';\n    }\n    Object.defineProperty(MdCheckbox.prototype, \"disableRipple\", {\n        /** Whether the ripple effect for this checkbox is disabled. */\n        get: function () { return this._disableRipple; },\n        set: function (value) { this._disableRipple = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"inputId\", {\n        /** ID of the native input element inside `<md-checkbox>` */\n        get: function () {\n            return \"input-\" + this.id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"required\", {\n        /** Whether the checkbox is required. */\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"align\", {\n        /**\n         * Whether or not the checkbox should appear before or after the label.\n         * @deprecated\n         */\n        get: function () {\n            // align refers to the checkbox relative to the label, while labelPosition refers to the\n            // label relative to the checkbox. As such, they are inverted.\n            return this.labelPosition == 'after' ? 'start' : 'end';\n        },\n        set: function (v) {\n            this.labelPosition = (v == 'start') ? 'after' : 'before';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"disabled\", {\n        /** Whether the checkbox is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"checked\", {\n        /**\n         * Whether the checkbox is checked. Note that setting `checked` will immediately set\n         * `indeterminate` to false.\n         */\n        get: function () {\n            return this._checked;\n        },\n        set: function (checked) {\n            if (checked != this.checked) {\n                this._indeterminate = false;\n                this._checked = checked;\n                this._transitionCheckState(this._checked ? exports.TransitionCheckState.Checked : exports.TransitionCheckState.Unchecked);\n                this._changeDetectorRef.markForCheck();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"indeterminate\", {\n        /**\n         * Whether the checkbox is indeterminate. This is also known as \"mixed\" mode and can be used to\n         * represent a checkbox with three states, e.g. a checkbox that represents a nested list of\n         * checkable items. Note that whenever `checked` is set, indeterminate is immediately set to\n         * false. This differs from the web platform in that indeterminate state on native\n         * checkboxes is only remove when the user manually checks the checkbox (rather than setting the\n         * `checked` property programmatically). However, we feel that this behavior is more accommodating\n         * to the way consumers would envision using this component.\n         */\n        get: function () {\n            return this._indeterminate;\n        },\n        set: function (indeterminate) {\n            this._indeterminate = indeterminate;\n            if (this._indeterminate) {\n                this._transitionCheckState(exports.TransitionCheckState.Indeterminate);\n            }\n            else {\n                this._transitionCheckState(this.checked ? exports.TransitionCheckState.Checked : exports.TransitionCheckState.Unchecked);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdCheckbox.prototype, \"color\", {\n        /** The color of the button. Can be `primary`, `accent`, or `warn`. */\n        get: function () { return this._color; },\n        set: function (value) { this._updateColor(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdCheckbox.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    MdCheckbox.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this._renderer.setElementClass(this._elementRef.nativeElement, \"md-\" + color, isAdd);\n        }\n    };\n    MdCheckbox.prototype._isRippleDisabled = function () {\n        return this.disableRipple || this.disabled;\n    };\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value Value to be set to the model.\n     */\n    MdCheckbox.prototype.writeValue = function (value) {\n        this.checked = !!value;\n    };\n    /**\n     * Registers a callback to be triggered when the value has changed.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Function to be called on change.\n     */\n    MdCheckbox.prototype.registerOnChange = function (fn) {\n        this._controlValueAccessorChangeFn = fn;\n    };\n    /**\n     * Registers a callback to be triggered when the control has been touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be triggered when the checkbox is touched.\n     */\n    MdCheckbox.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    /**\n     * Sets the checkbox's disabled state. Implemented as a part of ControlValueAccessor.\n     * @param isDisabled Whether the checkbox should be disabled.\n     */\n    MdCheckbox.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    MdCheckbox.prototype._transitionCheckState = function (newState) {\n        var oldState = this._currentCheckState;\n        var renderer = this._renderer;\n        var elementRef = this._elementRef;\n        if (oldState === newState) {\n            return;\n        }\n        if (this._currentAnimationClass.length > 0) {\n            renderer.setElementClass(elementRef.nativeElement, this._currentAnimationClass, false);\n        }\n        this._currentAnimationClass = this._getAnimationClassForCheckStateTransition(oldState, newState);\n        this._currentCheckState = newState;\n        if (this._currentAnimationClass.length > 0) {\n            renderer.setElementClass(elementRef.nativeElement, this._currentAnimationClass, true);\n        }\n    };\n    MdCheckbox.prototype._emitChangeEvent = function () {\n        var event = new MdCheckboxChange();\n        event.source = this;\n        event.checked = this.checked;\n        this._controlValueAccessorChangeFn(this.checked);\n        this.change.emit(event);\n    };\n    /** Informs the component when the input has focus so that we can style accordingly */\n    MdCheckbox.prototype._onInputFocus = function () {\n        this._hasFocus = true;\n    };\n    /** Informs the component when we lose focus in order to style accordingly */\n    MdCheckbox.prototype._onInputBlur = function () {\n        this._hasFocus = false;\n        this.onTouched();\n    };\n    /** Toggles the `checked` state of the checkbox. */\n    MdCheckbox.prototype.toggle = function () {\n        this.checked = !this.checked;\n    };\n    /**\n     * Event handler for checkbox input element.\n     * Toggles checked state if element is not disabled.\n     * @param event\n     */\n    MdCheckbox.prototype._onInteractionEvent = function (event) {\n        // We always have to stop propagation on the change event.\n        // Otherwise the change event, from the input element, will bubble up and\n        // emit its event object to the `change` output.\n        event.stopPropagation();\n        if (!this.disabled) {\n            this.toggle();\n            // Emit our custom change event if the native input emitted one.\n            // It is important to only emit it, if the native input triggered one, because\n            // we don't want to trigger a change event, when the `checked` variable changes for example.\n            this._emitChangeEvent();\n        }\n    };\n    /** Focuses the checkbox. */\n    MdCheckbox.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');\n        this._onInputFocus();\n    };\n    MdCheckbox.prototype._onInputClick = function (event) {\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `checkbox` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    };\n    MdCheckbox.prototype._getAnimationClassForCheckStateTransition = function (oldState, newState) {\n        var animSuffix;\n        switch (oldState) {\n            case exports.TransitionCheckState.Init:\n                // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\n                // [checked] bound to it.\n                if (newState === exports.TransitionCheckState.Checked) {\n                    animSuffix = 'unchecked-checked';\n                }\n                else {\n                    return '';\n                }\n                break;\n            case exports.TransitionCheckState.Unchecked:\n                animSuffix = newState === exports.TransitionCheckState.Checked ?\n                    'unchecked-checked' : 'unchecked-indeterminate';\n                break;\n            case exports.TransitionCheckState.Checked:\n                animSuffix = newState === exports.TransitionCheckState.Unchecked ?\n                    'checked-unchecked' : 'checked-indeterminate';\n                break;\n            case exports.TransitionCheckState.Indeterminate:\n                animSuffix = newState === exports.TransitionCheckState.Checked ?\n                    'indeterminate-checked' : 'indeterminate-unchecked';\n        }\n        return \"md-checkbox-anim-\" + animSuffix;\n    };\n    MdCheckbox.prototype._getHostElement = function () {\n        return this._elementRef.nativeElement;\n    };\n    __decorate$27([\n        _angular_core.Input('aria-label'), \n        __metadata$27('design:type', String)\n    ], MdCheckbox.prototype, \"ariaLabel\", void 0);\n    __decorate$27([\n        _angular_core.Input('aria-labelledby'), \n        __metadata$27('design:type', String)\n    ], MdCheckbox.prototype, \"ariaLabelledby\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], MdCheckbox.prototype, \"id\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], MdCheckbox.prototype, \"disableRipple\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], MdCheckbox.prototype, \"required\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], MdCheckbox.prototype, \"align\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], MdCheckbox.prototype, \"labelPosition\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], MdCheckbox.prototype, \"disabled\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Number)\n    ], MdCheckbox.prototype, \"tabindex\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], MdCheckbox.prototype, \"name\", void 0);\n    __decorate$27([\n        _angular_core.Output(), \n        __metadata$27('design:type', _angular_core.EventEmitter)\n    ], MdCheckbox.prototype, \"change\", void 0);\n    __decorate$27([\n        _angular_core.ViewChild('input'), \n        __metadata$27('design:type', _angular_core.ElementRef)\n    ], MdCheckbox.prototype, \"_inputElement\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], MdCheckbox.prototype, \"checked\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], MdCheckbox.prototype, \"indeterminate\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], MdCheckbox.prototype, \"color\", null);\n    MdCheckbox = __decorate$27([\n        _angular_core.Component({selector: 'md-checkbox, mat-checkbox',\n            template: \"<label class=\\\"md-checkbox-layout\\\"><div class=\\\"md-checkbox-inner-container\\\"><input #input class=\\\"md-checkbox-input cdk-visually-hidden\\\" type=\\\"checkbox\\\" [id]=\\\"inputId\\\" [required]=\\\"required\\\" [checked]=\\\"checked\\\" [disabled]=\\\"disabled\\\" [name]=\\\"name\\\" [tabIndex]=\\\"tabindex\\\" [indeterminate]=\\\"indeterminate\\\" [attr.aria-label]=\\\"ariaLabel\\\" [attr.aria-labelledby]=\\\"ariaLabelledby\\\" (focus)=\\\"_onInputFocus()\\\" (blur)=\\\"_onInputBlur()\\\" (change)=\\\"_onInteractionEvent($event)\\\" (click)=\\\"_onInputClick($event)\\\"><div md-ripple *ngIf=\\\"!_isRippleDisabled()\\\" class=\\\"md-checkbox-ripple\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\" [mdRippleCentered]=\\\"true\\\" [mdRippleSpeedFactor]=\\\"0.3\\\" mdRippleBackgroundColor=\\\"rgba(0, 0, 0, 0)\\\"></div><div class=\\\"md-checkbox-frame\\\"></div><div class=\\\"md-checkbox-background\\\"><svg version=\\\"1.1\\\" class=\\\"md-checkbox-checkmark\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" xml:space=\\\"preserve\\\"><path class=\\\"md-checkbox-checkmark-path\\\" fill=\\\"none\\\" stroke=\\\"white\\\" d=\\\"M4.1,12.7 9,17.6 20.3,6.3\\\"/></svg><div class=\\\"md-checkbox-mixedmark\\\"></div></div></div><span class=\\\"md-checkbox-label\\\"><ng-content></ng-content></span></label>\",\n            styles: [\".md-checkbox-frame,.md-checkbox-unchecked .md-checkbox-background{background-color:transparent}@keyframes md-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes md-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes md-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes md-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes md-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes md-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes md-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes md-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes md-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes md-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.md-checkbox-background,.md-checkbox-checkmark,.md-checkbox-frame{bottom:0;left:0;position:absolute;right:0;top:0}.md-checkbox-checkmark,.md-checkbox-mixedmark{width:calc(100% - 4px)}.md-checkbox-background,.md-checkbox-frame{border-radius:2px;box-sizing:border-box;pointer-events:none}md-checkbox{cursor:pointer;transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.md-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex}.md-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto 8px auto auto;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .md-checkbox-inner-container{margin-left:8px;margin-right:auto}.md-checkbox-layout .md-checkbox-label{line-height:24px}.md-checkbox-frame{border:2px solid;transition:border-color 90ms cubic-bezier(0,0,.2,.1);will-change:border-color}.md-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1);will-change:background-color,opacity}.md-checkbox-checkmark{width:100%}.md-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.67px}.md-checkbox-checked .md-checkbox-checkmark-path,.md-checkbox-indeterminate .md-checkbox-checkmark-path{stroke-dashoffset:0}.md-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.md-checkbox-label-before .md-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .md-checkbox-label-before .md-checkbox-inner-container{margin-left:auto;margin-right:8px}.md-checkbox-checked .md-checkbox-checkmark{opacity:1}.md-checkbox-checked .md-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.md-checkbox-indeterminate .md-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.md-checkbox-indeterminate .md-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.md-checkbox-disabled{cursor:default}.md-checkbox-anim-unchecked-checked .md-checkbox-background{animation:180ms linear 0s md-checkbox-fade-in-background}.md-checkbox-anim-unchecked-checked .md-checkbox-checkmark-path{animation:180ms linear 0s md-checkbox-unchecked-checked-checkmark-path}.md-checkbox-anim-unchecked-indeterminate .md-checkbox-background{animation:180ms linear 0s md-checkbox-fade-in-background}.md-checkbox-anim-unchecked-indeterminate .md-checkbox-mixedmark{animation:90ms linear 0s md-checkbox-unchecked-indeterminate-mixedmark}.md-checkbox-anim-checked-unchecked .md-checkbox-background{animation:180ms linear 0s md-checkbox-fade-out-background}.md-checkbox-anim-checked-unchecked .md-checkbox-checkmark-path{animation:90ms linear 0s md-checkbox-checked-unchecked-checkmark-path}.md-checkbox-anim-checked-indeterminate .md-checkbox-checkmark{animation:90ms linear 0s md-checkbox-checked-indeterminate-checkmark}.md-checkbox-anim-checked-indeterminate .md-checkbox-mixedmark{animation:90ms linear 0s md-checkbox-checked-indeterminate-mixedmark}.md-checkbox-anim-indeterminate-checked .md-checkbox-checkmark{animation:.5s linear 0s md-checkbox-indeterminate-checked-checkmark}.md-checkbox-anim-indeterminate-checked .md-checkbox-mixedmark{animation:.5s linear 0s md-checkbox-indeterminate-checked-mixedmark}.md-checkbox-anim-indeterminate-unchecked .md-checkbox-background{animation:180ms linear 0s md-checkbox-fade-out-background}.md-checkbox-anim-indeterminate-unchecked .md-checkbox-mixedmark{animation:.3s linear 0s md-checkbox-indeterminate-unchecked-mixedmark}.md-checkbox-input{bottom:0;left:50%}.md-checkbox-ripple{position:absolute;left:-15px;top:-15px;right:-15px;bottom:-15px;border-radius:50%;z-index:1;pointer-events:none}\"],\n            host: {\n                '[class.md-checkbox-indeterminate]': 'indeterminate',\n                '[class.md-checkbox-checked]': 'checked',\n                '[class.md-checkbox-disabled]': 'disabled',\n                '[class.md-checkbox-label-before]': 'labelPosition == \"before\"',\n                '[class.md-checkbox-focused]': '_hasFocus',\n            },\n            providers: [MD_CHECKBOX_CONTROL_VALUE_ACCESSOR],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush\n        }), \n        __metadata$27('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef, _angular_core.ChangeDetectorRef])\n    ], MdCheckbox);\n    return MdCheckbox;\n}());\nvar MdCheckboxModule = (function () {\n    function MdCheckboxModule() {\n    }\n    MdCheckboxModule.forRoot = function () {\n        return {\n            ngModule: MdCheckboxModule,\n            providers: [ViewportRuler]\n        };\n    };\n    MdCheckboxModule = __decorate$27([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, MdRippleModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdCheckbox, DefaultStyleCompatibilityModeModule],\n            declarations: [MdCheckbox],\n        }), \n        __metadata$27('design:paramtypes', [])\n    ], MdCheckboxModule);\n    return MdCheckboxModule;\n}());\n\nvar __decorate$28 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$28 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$5 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Provider Expression that allows md-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n * @docs-private\n */\nvar MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdRadioGroup; }),\n    multi: true\n};\nvar _uniqueIdCounter$1 = 0;\n/** Change event object emitted by MdRadio and MdRadioGroup. */\nvar MdRadioChange = (function () {\n    function MdRadioChange() {\n    }\n    return MdRadioChange;\n}());\n/**\n * A group of radio buttons. May contain one or more `<md-radio-button>` elements.\n */\nvar MdRadioGroup = (function () {\n    function MdRadioGroup() {\n        /**\n         * Selected value for group. Should equal the value of the selected radio button if there *is*\n         * a corresponding radio button with a matching value. If there is *not* such a corresponding\n         * radio button, this value persists to be applied in case a new radio button is added with a\n         * matching value.\n         */\n        this._value = null;\n        /** The HTML name attribute applied to radio buttons in this group. */\n        this._name = \"md-radio-group-\" + _uniqueIdCounter$1++;\n        /** Disables all individual radio buttons assigned to this group. */\n        this._disabled = false;\n        /** The currently selected radio button. Should match value. */\n        this._selected = null;\n        /** Whether the `value` has been set to its initial value. */\n        this._isInitialized = false;\n        /** The method to be called in order to update ngModel */\n        this._controlValueAccessorChangeFn = function (value) { };\n        /**\n         * onTouch function registered via registerOnTouch (ControlValueAccessor).\n         * @docs-private\n         */\n        this.onTouched = function () { };\n        /**\n         * Event emitted when the group value changes.\n         * Change events are only emitted when the value changes due to user interaction with\n         * a radio button (the same behavior as `<input type-\"radio\">`).\n         */\n        this.change = new _angular_core.EventEmitter();\n        /** Child radio buttons. */\n        this._radios = null;\n        /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n        this.labelPosition = 'after';\n    }\n    Object.defineProperty(MdRadioGroup.prototype, \"name\", {\n        /** Name of the radio button group. All radio buttons inside this group will use this name. */\n        get: function () { return this._name; },\n        set: function (value) {\n            this._name = value;\n            this._updateRadioButtonNames();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioGroup.prototype, \"align\", {\n        /**\n         * Alignment of the radio-buttons relative to their labels. Can be 'before' or 'after'.\n         * @deprecated\n         */\n        get: function () {\n            // align refers to the checkbox relative to the label, while labelPosition refers to the\n            // label relative to the checkbox. As such, they are inverted.\n            return this.labelPosition == 'after' ? 'start' : 'end';\n        },\n        set: function (v) {\n            this.labelPosition = (v == 'start') ? 'after' : 'before';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioGroup.prototype, \"disabled\", {\n        /** Whether the radio button is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) {\n            // The presence of *any* disabled value makes the component disabled, *except* for false.\n            this._disabled = (value != null && value !== false) ? true : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioGroup.prototype, \"value\", {\n        /** Value of the radio button. */\n        get: function () { return this._value; },\n        set: function (newValue) {\n            if (this._value != newValue) {\n                // Set this before proceeding to ensure no circular loop occurs with selection.\n                this._value = newValue;\n                this._updateSelectedRadioFromValue();\n                this._checkSelectedRadioButton();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdRadioGroup.prototype._checkSelectedRadioButton = function () {\n        if (this.selected && !this._selected.checked) {\n            this._selected.checked = true;\n        }\n    };\n    Object.defineProperty(MdRadioGroup.prototype, \"selected\", {\n        /** Whether the radio button is selected. */\n        get: function () { return this._selected; },\n        set: function (selected) {\n            this._selected = selected;\n            this.value = selected ? selected.value : null;\n            this._checkSelectedRadioButton();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Initialize properties once content children are available.\n     * This allows us to propagate relevant attributes to associated buttons.\n     */\n    MdRadioGroup.prototype.ngAfterContentInit = function () {\n        // Mark this component as initialized in AfterContentInit because the initial value can\n        // possibly be set by NgModel on MdRadioGroup, and it is possible that the OnInit of the\n        // NgModel occurs *after* the OnInit of the MdRadioGroup.\n        this._isInitialized = true;\n    };\n    /**\n     * Mark this group as being \"touched\" (for ngModel). Meant to be called by the contained\n     * radio buttons upon their blur.\n     */\n    MdRadioGroup.prototype._touch = function () {\n        if (this.onTouched) {\n            this.onTouched();\n        }\n    };\n    MdRadioGroup.prototype._updateRadioButtonNames = function () {\n        var _this = this;\n        if (this._radios) {\n            this._radios.forEach(function (radio) {\n                radio.name = _this.name;\n            });\n        }\n    };\n    /** Updates the `selected` radio button from the internal _value state. */\n    MdRadioGroup.prototype._updateSelectedRadioFromValue = function () {\n        var _this = this;\n        // If the value already matches the selected radio, do nothing.\n        var isAlreadySelected = this._selected != null && this._selected.value == this._value;\n        if (this._radios != null && !isAlreadySelected) {\n            this._selected = null;\n            this._radios.forEach(function (radio) {\n                radio.checked = _this.value == radio.value;\n                if (radio.checked) {\n                    _this._selected = radio;\n                }\n            });\n        }\n    };\n    /** Dispatch change event with current selection and group value. */\n    MdRadioGroup.prototype._emitChangeEvent = function () {\n        if (this._isInitialized) {\n            var event_1 = new MdRadioChange();\n            event_1.source = this._selected;\n            event_1.value = this._value;\n            this.change.emit(event_1);\n        }\n    };\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value\n     */\n    MdRadioGroup.prototype.writeValue = function (value) {\n        this.value = value;\n    };\n    /**\n     * Registers a callback to be triggered when the model value changes.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdRadioGroup.prototype.registerOnChange = function (fn) {\n        this._controlValueAccessorChangeFn = fn;\n    };\n    /**\n     * Registers a callback to be triggered when the control is touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdRadioGroup.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    /**\n     * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.\n     * @param isDisabled Whether the control should be disabled.\n     */\n    MdRadioGroup.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    __decorate$28([\n        _angular_core.Output(), \n        __metadata$28('design:type', _angular_core.EventEmitter)\n    ], MdRadioGroup.prototype, \"change\", void 0);\n    __decorate$28([\n        _angular_core.ContentChildren(_angular_core.forwardRef(function () { return MdRadioButton; })), \n        __metadata$28('design:type', _angular_core.QueryList)\n    ], MdRadioGroup.prototype, \"_radios\", void 0);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', String)\n    ], MdRadioGroup.prototype, \"name\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioGroup.prototype, \"align\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioGroup.prototype, \"labelPosition\", void 0);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Boolean)\n    ], MdRadioGroup.prototype, \"disabled\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioGroup.prototype, \"value\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioGroup.prototype, \"selected\", null);\n    MdRadioGroup = __decorate$28([\n        _angular_core.Directive({\n            selector: 'md-radio-group, mat-radio-group',\n            providers: [MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'radiogroup',\n            },\n        }), \n        __metadata$28('design:paramtypes', [])\n    ], MdRadioGroup);\n    return MdRadioGroup;\n}());\n/**\n * A radio-button. May be inside of\n */\nvar MdRadioButton = (function () {\n    function MdRadioButton(radioGroup, _elementRef, _renderer, radioDispatcher) {\n        // Assertions. Ideally these should be stripped out by the compiler.\n        // TODO(jelbourn): Assert that there's no name binding AND a parent radio group.\n        var _this = this;\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        this.radioDispatcher = radioDispatcher;\n        /** Whether this radio is checked. */\n        this._checked = false;\n        /** The unique ID for the radio button. */\n        this.id = \"md-radio-\" + _uniqueIdCounter$1++;\n        /** Value assigned to this radio.*/\n        this._value = null;\n        /**\n         * Event emitted when the checked state of this radio button changes.\n         * Change events are only emitted when the value changes due to user interaction with\n         * the radio button (the same behavior as `<input type-\"radio\">`).\n         */\n        this.change = new _angular_core.EventEmitter();\n        this.radioGroup = radioGroup;\n        radioDispatcher.listen(function (id, name) {\n            if (id != _this.id && name == _this.name) {\n                _this.checked = false;\n            }\n        });\n    }\n    Object.defineProperty(MdRadioButton.prototype, \"disableRipple\", {\n        /** Whether the ripple effect for this radio button is disabled. */\n        get: function () { return this._disableRipple; },\n        set: function (value) { this._disableRipple = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"inputId\", {\n        /** ID of the native input element inside `<md-radio-button>` */\n        get: function () {\n            return this.id + \"-input\";\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"checked\", {\n        /** Whether this radio button is checked. */\n        get: function () {\n            return this._checked;\n        },\n        set: function (newCheckedState) {\n            if (this._checked != newCheckedState) {\n                this._checked = newCheckedState;\n                if (newCheckedState && this.radioGroup && this.radioGroup.value != this.value) {\n                    this.radioGroup.selected = this;\n                }\n                else if (!newCheckedState && this.radioGroup && this.radioGroup.value == this.value) {\n                    // When unchecking the selected radio button, update the selected radio\n                    // property on the group.\n                    this.radioGroup.selected = null;\n                }\n                if (newCheckedState) {\n                    // Notify all radio buttons with the same name to un-check.\n                    this.radioDispatcher.notify(this.id, this.name);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"value\", {\n        /** The value of this radio button. */\n        get: function () {\n            return this._value;\n        },\n        set: function (value) {\n            if (this._value != value) {\n                this._value = value;\n                if (this.radioGroup != null) {\n                    if (!this.checked) {\n                        // Update checked when the value changed to match the radio group's value\n                        this.checked = this.radioGroup.value == value;\n                    }\n                    if (this.checked) {\n                        this.radioGroup.selected = this;\n                    }\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"align\", {\n        /**\n         * Whether or not the radio-button should appear before or after the label.\n         * @deprecated\n         */\n        get: function () {\n            // align refers to the checkbox relative to the label, while labelPosition refers to the\n            // label relative to the checkbox. As such, they are inverted.\n            return this.labelPosition == 'after' ? 'start' : 'end';\n        },\n        set: function (v) {\n            this.labelPosition = (v == 'start') ? 'after' : 'before';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"labelPosition\", {\n        /** Whether the label should appear after or before the radio button. Defaults to 'after' */\n        get: function () {\n            return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after';\n        },\n        set: function (value) {\n            this._labelPosition = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdRadioButton.prototype, \"disabled\", {\n        /** Whether the radio button is disabled. */\n        get: function () {\n            return this._disabled || (this.radioGroup != null && this.radioGroup.disabled);\n        },\n        set: function (value) {\n            // The presence of *any* disabled value makes the component disabled, *except* for false.\n            this._disabled = (value != null && value !== false) ? true : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdRadioButton.prototype.ngOnInit = function () {\n        if (this.radioGroup) {\n            // If the radio is inside a radio group, determine if it should be checked\n            this.checked = this.radioGroup.value === this._value;\n            // Copy name from parent radio group\n            this.name = this.radioGroup.name;\n        }\n    };\n    /** Dispatch change event with current value. */\n    MdRadioButton.prototype._emitChangeEvent = function () {\n        var event = new MdRadioChange();\n        event.source = this;\n        event.value = this._value;\n        this.change.emit(event);\n    };\n    MdRadioButton.prototype._isRippleDisabled = function () {\n        return this.disableRipple || this.disabled;\n    };\n    /**\n     * We use a hidden native input field to handle changes to focus state via keyboard navigation,\n     * with visual rendering done separately. The native element is kept in sync with the overall\n     * state of the component.\n     */\n    MdRadioButton.prototype._onInputFocus = function () {\n        this._isFocused = true;\n    };\n    /** Focuses the radio button. */\n    MdRadioButton.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');\n        this._onInputFocus();\n    };\n    MdRadioButton.prototype._onInputBlur = function () {\n        this._isFocused = false;\n        if (this.radioGroup) {\n            this.radioGroup._touch();\n        }\n    };\n    MdRadioButton.prototype._onInputClick = function (event) {\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `radio-button` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    };\n    /**\n     * Triggered when the radio button received a click or the input recognized any change.\n     * Clicking on a label element, will trigger a change event on the associated input.\n     */\n    MdRadioButton.prototype._onInputChange = function (event) {\n        // We always have to stop propagation on the change event.\n        // Otherwise the change event, from the input element, will bubble up and\n        // emit its event object to the `change` output.\n        event.stopPropagation();\n        var groupValueChanged = this.radioGroup && this.value != this.radioGroup.value;\n        this.checked = true;\n        this._emitChangeEvent();\n        if (this.radioGroup) {\n            this.radioGroup._controlValueAccessorChangeFn(this.value);\n            this.radioGroup._touch();\n            if (groupValueChanged) {\n                this.radioGroup._emitChangeEvent();\n            }\n        }\n    };\n    MdRadioButton.prototype._getHostElement = function () {\n        return this._elementRef.nativeElement;\n    };\n    __decorate$28([\n        _angular_core.HostBinding('class.md-radio-focused'), \n        __metadata$28('design:type', Boolean)\n    ], MdRadioButton.prototype, \"_isFocused\", void 0);\n    __decorate$28([\n        _angular_core.HostBinding('id'),\n        _angular_core.Input(), \n        __metadata$28('design:type', String)\n    ], MdRadioButton.prototype, \"id\", void 0);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', String)\n    ], MdRadioButton.prototype, \"name\", void 0);\n    __decorate$28([\n        _angular_core.Input('aria-label'), \n        __metadata$28('design:type', String)\n    ], MdRadioButton.prototype, \"ariaLabel\", void 0);\n    __decorate$28([\n        _angular_core.Input('aria-labelledby'), \n        __metadata$28('design:type', String)\n    ], MdRadioButton.prototype, \"ariaLabelledby\", void 0);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Boolean)\n    ], MdRadioButton.prototype, \"disableRipple\", null);\n    __decorate$28([\n        _angular_core.Output(), \n        __metadata$28('design:type', _angular_core.EventEmitter)\n    ], MdRadioButton.prototype, \"change\", void 0);\n    __decorate$28([\n        _angular_core.ViewChild('input'), \n        __metadata$28('design:type', _angular_core.ElementRef)\n    ], MdRadioButton.prototype, \"_inputElement\", void 0);\n    __decorate$28([\n        _angular_core.HostBinding('class.md-radio-checked'),\n        _angular_core.Input(), \n        __metadata$28('design:type', Boolean)\n    ], MdRadioButton.prototype, \"checked\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioButton.prototype, \"value\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioButton.prototype, \"align\", null);\n    __decorate$28([\n        _angular_core.Input(), \n        __metadata$28('design:type', Object)\n    ], MdRadioButton.prototype, \"labelPosition\", null);\n    __decorate$28([\n        _angular_core.HostBinding('class.md-radio-disabled'),\n        _angular_core.Input(), \n        __metadata$28('design:type', Boolean)\n    ], MdRadioButton.prototype, \"disabled\", null);\n    MdRadioButton = __decorate$28([\n        _angular_core.Component({selector: 'md-radio-button, mat-radio-button',\n            template: \"<label [attr.for]=\\\"inputId\\\" class=\\\"md-radio-label\\\"><div class=\\\"md-radio-container\\\"><div class=\\\"md-radio-outer-circle\\\"></div><div class=\\\"md-radio-inner-circle\\\"></div><div md-ripple *ngIf=\\\"!_isRippleDisabled()\\\" class=\\\"md-radio-ripple\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\" [mdRippleCentered]=\\\"true\\\" [mdRippleSpeedFactor]=\\\"0.3\\\" mdRippleBackgroundColor=\\\"rgba(0, 0, 0, 0)\\\"></div></div><input #input class=\\\"md-radio-input cdk-visually-hidden\\\" type=\\\"radio\\\" [id]=\\\"inputId\\\" [checked]=\\\"checked\\\" [disabled]=\\\"disabled\\\" [name]=\\\"name\\\" [attr.aria-label]=\\\"ariaLabel\\\" [attr.aria-labelledby]=\\\"ariaLabelledby\\\" (change)=\\\"_onInputChange($event)\\\" (focus)=\\\"_onInputFocus()\\\" (blur)=\\\"_onInputBlur()\\\" (click)=\\\"_onInputClick($event)\\\"><div class=\\\"md-radio-label-content\\\" [class.md-radio-label-before]=\\\"labelPosition == 'before'\\\"><ng-content></ng-content></div></label>\",\n            styles: [\"md-radio-button{display:inline-block}.md-radio-label{cursor:pointer;display:inline-flex;align-items:baseline;white-space:nowrap}.md-radio-container{box-sizing:border-box;display:inline-block;height:20px;position:relative;width:20px;top:2px}.md-radio-inner-circle,.md-radio-outer-circle{box-sizing:border-box;height:20px;left:0;top:0;width:20px;position:absolute}.md-radio-outer-circle{border:2px solid;border-radius:50%;transition:border-color ease 280ms}.md-radio-inner-circle{border-radius:50%;transition:transform ease 280ms,background-color ease 280ms;transform:scale(0)}.md-radio-checked .md-radio-inner-circle{transform:scale(.5)}.md-radio-label-content{display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .md-radio-label-content{padding-right:8px;padding-left:0}.md-radio-label-content.md-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .md-radio-label-content.md-radio-label-before{padding-right:0;padding-left:8px}.md-radio-disabled,.md-radio-disabled .md-radio-label{cursor:default}.md-radio-ripple{position:absolute;left:-15px;top:-15px;right:-15px;bottom:-15px;border-radius:50%;z-index:1;pointer-events:none}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }),\n        __param$5(0, _angular_core.Optional()), \n        __metadata$28('design:paramtypes', [MdRadioGroup, _angular_core.ElementRef, _angular_core.Renderer, UniqueSelectionDispatcher])\n    ], MdRadioButton);\n    return MdRadioButton;\n}());\nvar MdRadioModule = (function () {\n    function MdRadioModule() {\n    }\n    MdRadioModule.forRoot = function () {\n        return {\n            ngModule: MdRadioModule,\n            providers: [UniqueSelectionDispatcher, ViewportRuler],\n        };\n    };\n    MdRadioModule = __decorate$28([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, MdRippleModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdRadioGroup, MdRadioButton, DefaultStyleCompatibilityModeModule],\n            declarations: [MdRadioGroup, MdRadioButton],\n        }), \n        __metadata$28('design:paramtypes', [])\n    ], MdRadioModule);\n    return MdRadioModule;\n}());\n\nvar __decorate$31 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$31 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nvar _uniqueIdCounter$2 = 0;\n/**\n * Single option inside of a `<md-select>` element.\n */\nvar MdOption = (function () {\n    function MdOption(_element, _renderer) {\n        this._element = _element;\n        this._renderer = _renderer;\n        this._selected = false;\n        /** Whether the option is disabled.  */\n        this._disabled = false;\n        this._id = \"md-select-option-\" + _uniqueIdCounter$2++;\n        /** Event emitted when the option is selected. */\n        this.onSelect = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(MdOption.prototype, \"id\", {\n        /** The unique ID of the option. */\n        get: function () { return this._id; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdOption.prototype, \"disabled\", {\n        /** Whether the option is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdOption.prototype, \"selected\", {\n        /** Whether or not the option is currently selected. */\n        get: function () {\n            return this._selected;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdOption.prototype, \"viewValue\", {\n        /**\n         * The displayed value of the option. It is necessary to show the selected option in the\n         * select's trigger.\n         */\n        get: function () {\n            // TODO(kara): Add input property alternative for node envs.\n            return this._getHostElement().textContent.trim();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Selects the option. */\n    MdOption.prototype.select = function () {\n        this._selected = true;\n        this.onSelect.emit();\n    };\n    /** Deselects the option. */\n    MdOption.prototype.deselect = function () {\n        this._selected = false;\n    };\n    /** Sets focus onto this option. */\n    MdOption.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._getHostElement(), 'focus');\n    };\n    /** Ensures the option is selected when activated from the keyboard. */\n    MdOption.prototype._handleKeydown = function (event) {\n        if (event.keyCode === ENTER || event.keyCode === SPACE) {\n            this._selectViaInteraction();\n        }\n    };\n    /**\n     * Selects the option while indicating the selection came from the user. Used to\n     * determine if the select's view -> model callback should be invoked.\n     */\n    MdOption.prototype._selectViaInteraction = function () {\n        if (!this.disabled) {\n            this._selected = true;\n            this.onSelect.emit(true);\n        }\n    };\n    /** Returns the correct tabindex for the option depending on disabled state. */\n    MdOption.prototype._getTabIndex = function () {\n        return this.disabled ? '-1' : '0';\n    };\n    MdOption.prototype._getHostElement = function () {\n        return this._element.nativeElement;\n    };\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Object)\n    ], MdOption.prototype, \"value\", void 0);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Object)\n    ], MdOption.prototype, \"disabled\", null);\n    __decorate$31([\n        _angular_core.Output(), \n        __metadata$31('design:type', Object)\n    ], MdOption.prototype, \"onSelect\", void 0);\n    MdOption = __decorate$31([\n        _angular_core.Component({selector: 'md-option, mat-option',\n            host: {\n                'role': 'option',\n                '[attr.tabindex]': '_getTabIndex()',\n                '[class.md-selected]': 'selected',\n                '[id]': 'id',\n                '[attr.aria-selected]': 'selected.toString()',\n                '[attr.aria-disabled]': 'disabled.toString()',\n                '[class.md-option-disabled]': 'disabled',\n                '(click)': '_selectViaInteraction()',\n                '(keydown)': '_handleKeydown($event)'\n            },\n            template: \"<ng-content></ng-content><div class=\\\"md-option-ripple\\\" *ngIf=\\\"!disabled\\\" md-ripple mdRippleBackgroundColor=\\\"rgba(0,0,0,0)\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\"></div>\",\n            styles: [\".md-select-value,md-option{white-space:nowrap;text-overflow:ellipsis}md-select{display:inline-block;outline:0}.md-select-trigger{display:flex;justify-content:space-between;align-items:center;height:30px;min-width:112px;cursor:pointer;position:relative;box-sizing:border-box}[aria-disabled=true] .md-select-trigger{background-image:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x;border-bottom:transparent;background-position:0 bottom;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-select-placeholder{position:relative;padding:0 2px;transform-origin:left top}.md-select-placeholder.md-floating-placeholder{top:-22px;left:-2px;transform:scale(.75)}[dir=rtl] .md-select-placeholder{transform-origin:right top}[dir=rtl] .md-select-placeholder.md-floating-placeholder{left:2px}[aria-required=true] .md-select-placeholder::after{content:'*'}.md-select-value{position:absolute;overflow-x:hidden;left:0;top:6px}[dir=rtl] .md-select-value{left:auto;right:0}.md-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.md-select-panel{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px}@media screen and (-ms-high-contrast:active){.md-select-panel{outline:solid 1px}.md-option-ripple{opacity:.5}}md-option{overflow-x:hidden;display:flex;flex-direction:row;align-items:center;height:48px;padding:0 16px;font-size:16px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;text-align:start;text-decoration:none;position:relative;cursor:pointer;outline:0}md-option[disabled]{cursor:default}md-option md-icon{margin-right:16px}[dir=rtl] md-option md-icon{margin-left:16px}md-option[aria-disabled=true]{cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-option-ripple{position:absolute;top:0;left:0;bottom:0;right:0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$31('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdOption);\n    return MdOption;\n}());\n\n/**\n * This class manages keyboard events for selectable lists. If you pass it a query list\n * of focusable items, it will focus the correct item when arrow events occur.\n */\nvar ListKeyManager = (function () {\n    function ListKeyManager(_items) {\n        this._items = _items;\n        this._tabOut = new rxjs_Subject.Subject();\n        this._wrap = false;\n    }\n    /**\n     * Turns on focus wrapping mode, which ensures that the focus will wrap to\n     * the other end of list when there are no more items in the given direction.\n     *\n     * @returns The ListKeyManager that the method was called on.\n     */\n    ListKeyManager.prototype.withFocusWrap = function () {\n        this._wrap = true;\n        return this;\n    };\n    /**\n     * Sets the focus of the list to the item at the index specified.\n     *\n     * @param index The index of the item to be focused.\n     */\n    ListKeyManager.prototype.setFocus = function (index) {\n        this._focusedItemIndex = index;\n        this._items.toArray()[index].focus();\n    };\n    /**\n     * Sets the focus depending on the key event passed in.\n     * @param event Keyboard event to be used for determining which element to focus.\n     */\n    ListKeyManager.prototype.onKeydown = function (event) {\n        switch (event.keyCode) {\n            case DOWN_ARROW:\n                this.focusNextItem();\n                break;\n            case UP_ARROW:\n                this.focusPreviousItem();\n                break;\n            case HOME:\n                this.focusFirstItem();\n                break;\n            case END:\n                this.focusLastItem();\n                break;\n            case TAB:\n                // Note that we shouldn't prevent the default action on tab.\n                this._tabOut.next(null);\n                return;\n            default:\n                return;\n        }\n        event.preventDefault();\n    };\n    /** Focuses the first enabled item in the list. */\n    ListKeyManager.prototype.focusFirstItem = function () {\n        this._setFocusByIndex(0, 1);\n    };\n    /** Focuses the last enabled item in the list. */\n    ListKeyManager.prototype.focusLastItem = function () {\n        this._setFocusByIndex(this._items.length - 1, -1);\n    };\n    /** Focuses the next enabled item in the list. */\n    ListKeyManager.prototype.focusNextItem = function () {\n        this._setFocusByDelta(1);\n    };\n    /** Focuses a previous enabled item in the list. */\n    ListKeyManager.prototype.focusPreviousItem = function () {\n        this._setFocusByDelta(-1);\n    };\n    Object.defineProperty(ListKeyManager.prototype, \"focusedItemIndex\", {\n        /** Returns the index of the currently focused item. */\n        get: function () {\n            return this._focusedItemIndex;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Allows setting of the focusedItemIndex without focusing the item.\n     * @param index The new focusedItemIndex.\n     */\n    ListKeyManager.prototype.updateFocusedItemIndex = function (index) {\n        this._focusedItemIndex = index;\n    };\n    Object.defineProperty(ListKeyManager.prototype, \"tabOut\", {\n        /**\n         * Observable that emits any time the TAB key is pressed, so components can react\n         * when focus is shifted off of the list.\n         */\n        get: function () {\n            return this._tabOut.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * This method sets focus to the correct item, given a list of items and the delta\n     * between the currently focused item and the new item to be focused. It will calculate\n     * the proper focus differently depending on whether wrap mode is turned on.\n     */\n    ListKeyManager.prototype._setFocusByDelta = function (delta, items) {\n        if (items === void 0) { items = this._items.toArray(); }\n        this._wrap ? this._setWrapModeFocus(delta, items)\n            : this._setDefaultModeFocus(delta, items);\n    };\n    /**\n     * Sets the focus properly given \"wrap\" mode. In other words, it will continue to move\n     * down the list until it finds an item that is not disabled, and it will wrap if it\n     * encounters either end of the list.\n     */\n    ListKeyManager.prototype._setWrapModeFocus = function (delta, items) {\n        // when focus would leave menu, wrap to beginning or end\n        this._focusedItemIndex =\n            (this._focusedItemIndex + delta + items.length) % items.length;\n        // skip all disabled menu items recursively until an active one is reached\n        if (items[this._focusedItemIndex].disabled) {\n            this._setWrapModeFocus(delta, items);\n        }\n        else {\n            items[this._focusedItemIndex].focus();\n        }\n    };\n    /**\n     * Sets the focus properly given the default mode. In other words, it will\n     * continue to move down the list until it finds an item that is not disabled. If\n     * it encounters either end of the list, it will stop and not wrap.\n     */\n    ListKeyManager.prototype._setDefaultModeFocus = function (delta, items) {\n        this._setFocusByIndex(this._focusedItemIndex + delta, delta, items);\n    };\n    /**\n     * Sets the focus to the first enabled item starting at the index specified. If the\n     * item is disabled, it will move in the fallbackDelta direction until it either\n     * finds an enabled item or encounters the end of the list.\n     */\n    ListKeyManager.prototype._setFocusByIndex = function (index, fallbackDelta, items) {\n        if (items === void 0) { items = this._items.toArray(); }\n        if (!items[index]) {\n            return;\n        }\n        while (items[index].disabled) {\n            index += fallbackDelta;\n            if (!items[index]) {\n                return;\n            }\n        }\n        this.setFocus(index);\n    };\n    return ListKeyManager;\n}());\n\n/**\n * The following are all the animations for the md-select component, with each\n * const containing the metadata for one animation.\n *\n * The values below match the implementation of the Material 1 md-select animation.\n */\n/**\n * This animation shrinks the placeholder text to 75% of its normal size and translates\n * it to either the top left corner (ltr) or top right corner (rtl) of the trigger,\n * depending on the text direction of the application.\n */\nvar transformPlaceholder = _angular_core.trigger('transformPlaceholder', [\n    _angular_core.state('floating-ltr', _angular_core.style({\n        top: '-22px',\n        left: '-2px',\n        transform: \"scale(0.75)\"\n    })),\n    _angular_core.state('floating-rtl', _angular_core.style({\n        top: '-22px',\n        left: '2px',\n        transform: \"scale(0.75)\"\n    })),\n    _angular_core.transition('* => *', _angular_core.animate(\"400ms cubic-bezier(0.25, 0.8, 0.25, 1)\"))\n]);\n/**\n * This animation transforms the select's overlay panel on and off the page.\n *\n * When the panel is attached to the DOM, it expands its width 32px, scales it up to\n * 100% on the Y axis, fades in its border, and translates slightly up and to the\n * side to ensure the option text correctly overlaps the trigger text.\n *\n * When the panel is removed from the DOM, it simply fades out linearly.\n */\nvar transformPanel = _angular_core.trigger('transformPanel', [\n    _angular_core.state('showing', _angular_core.style({\n        opacity: 1,\n        minWidth: 'calc(100% + 32px)',\n        transform: \"translate3d(0,0,0) scaleY(1)\"\n    })),\n    _angular_core.transition('void => *', [\n        _angular_core.style({\n            opacity: 0,\n            minWidth: '100%',\n            transform: \"translate3d(0, 0, 0) scaleY(0)\"\n        }),\n        _angular_core.animate(\"150ms cubic-bezier(0.25, 0.8, 0.25, 1)\")\n    ]),\n    _angular_core.transition('* => void', [\n        _angular_core.animate('250ms 100ms linear', _angular_core.style({ opacity: 0 }))\n    ])\n]);\n/**\n * This animation fades in the background color and text content of the\n * select's options. It is time delayed to occur 100ms after the overlay\n * panel has transformed in.\n */\nvar fadeInContent = _angular_core.trigger('fadeInContent', [\n    _angular_core.state('showing', _angular_core.style({ opacity: 1 })),\n    _angular_core.transition('void => showing', [\n        _angular_core.style({ opacity: 0 }),\n        _angular_core.animate(\"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)\")\n    ])\n]);\n\nvar __decorate$30 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$30 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$6 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the alignment of the selected option over\n * the trigger element.\n */\n/** The fixed height of every option element. */\nvar SELECT_OPTION_HEIGHT = 48;\n/** The max height of the select's overlay panel */\nvar SELECT_PANEL_MAX_HEIGHT = 256;\n/** The max number of options visible at once in the select panel. */\nvar SELECT_MAX_OPTIONS_DISPLAYED = 5;\n/** The fixed height of the select's trigger element. */\nvar SELECT_TRIGGER_HEIGHT = 30;\n/**\n * Must adjust for the difference in height between the option and the trigger,\n * so the text will align on the y axis.\n * (SELECT_OPTION_HEIGHT (48) - SELECT_TRIGGER_HEIGHT (30)) / 2 = 9\n */\nvar SELECT_OPTION_HEIGHT_ADJUSTMENT = 9;\n/** The panel's padding on the x-axis */\nvar SELECT_PANEL_PADDING_X = 16;\n/**\n * The panel's padding on the y-axis. This padding indicates there are more\n * options available if you scroll.\n */\nvar SELECT_PANEL_PADDING_Y = 16;\n/**\n * The select panel will only \"fit\" inside the viewport if it is positioned at\n * this value or more away from the viewport boundary.\n */\nvar SELECT_PANEL_VIEWPORT_PADDING = 8;\nvar MdSelect = (function () {\n    function MdSelect(_element, _renderer, _viewportRuler, _dir, _control) {\n        this._element = _element;\n        this._renderer = _renderer;\n        this._viewportRuler = _viewportRuler;\n        this._dir = _dir;\n        this._control = _control;\n        /** Whether or not the overlay panel is open. */\n        this._panelOpen = false;\n        /** Subscriptions to option events. */\n        this._subscriptions = [];\n        /** Whether filling out the select is required in the form.  */\n        this._required = false;\n        /** Whether the select is disabled.  */\n        this._disabled = false;\n        /** The scroll position of the overlay panel, calculated to center the selected option. */\n        this._scrollTop = 0;\n        /** The animation state of the placeholder. */\n        this._placeholderState = '';\n        /** View -> model callback called when value changes */\n        this._onChange = function (value) { };\n        /** View -> model callback called when select has been touched */\n        this._onTouched = function () { };\n        /** The IDs of child options to be passed to the aria-owns attribute. */\n        this._optionIds = '';\n        /** The value of the select panel's transform-origin property. */\n        this._transformOrigin = 'top';\n        /**\n         * The x-offset of the overlay panel in relation to the trigger's top start corner.\n         * This must be adjusted to align the selected option text over the trigger text when\n         * the panel opens. Will change based on LTR or RTL text direction.\n         */\n        this._offsetX = 0;\n        /**\n         * The y-offset of the overlay panel in relation to the trigger's top start corner.\n         * This must be adjusted to align the selected option text over the trigger text.\n         * when the panel opens. Will change based on the y-position of the selected option.\n         */\n        this._offsetY = 0;\n        /**\n         * This position config ensures that the top \"start\" corner of the overlay\n         * is aligned with with the top \"start\" of the origin by default (overlapping\n         * the trigger completely). If the panel cannot fit below the trigger, it\n         * will fall back to a position above the trigger.\n         */\n        this._positions = [\n            {\n                originX: 'start',\n                originY: 'top',\n                overlayX: 'start',\n                overlayY: 'top',\n            },\n            {\n                originX: 'start',\n                originY: 'bottom',\n                overlayX: 'start',\n                overlayY: 'bottom',\n            },\n        ];\n        /** Event emitted when the select has been opened. */\n        this.onOpen = new _angular_core.EventEmitter();\n        /** Event emitted when the select has been closed. */\n        this.onClose = new _angular_core.EventEmitter();\n        if (this._control) {\n            this._control.valueAccessor = this;\n        }\n    }\n    Object.defineProperty(MdSelect.prototype, \"placeholder\", {\n        /** Placeholder to be shown if no value has been selected. */\n        get: function () { return this._placeholder; },\n        set: function (value) {\n            var _this = this;\n            this._placeholder = value;\n            // Must wait to record the trigger width to ensure placeholder width is included.\n            Promise.resolve(null).then(function () { return _this._triggerWidth = _this._getWidth(); });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSelect.prototype, \"disabled\", {\n        /** Whether the component is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) {\n            this._disabled = coerceBooleanProperty(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSelect.prototype, \"required\", {\n        /** Whether the component is required. */\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdSelect.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        this._initKeyManager();\n        this._resetOptions();\n        this._changeSubscription = this.options.changes.subscribe(function () { return _this._resetOptions(); });\n    };\n    MdSelect.prototype.ngOnDestroy = function () {\n        this._dropSubscriptions();\n        this._changeSubscription.unsubscribe();\n        this._tabSubscription.unsubscribe();\n    };\n    /** Toggles the overlay panel open or closed. */\n    MdSelect.prototype.toggle = function () {\n        this.panelOpen ? this.close() : this.open();\n    };\n    /** Opens the overlay panel. */\n    MdSelect.prototype.open = function () {\n        if (this.disabled) {\n            return;\n        }\n        this._calculateOverlayPosition();\n        this._placeholderState = this._isRtl() ? 'floating-rtl' : 'floating-ltr';\n        this._panelOpen = true;\n    };\n    /** Closes the overlay panel and focuses the host element. */\n    MdSelect.prototype.close = function () {\n        this._panelOpen = false;\n        if (!this._selected) {\n            this._placeholderState = '';\n        }\n        this._focusHost();\n    };\n    /**\n     * Sets the select's value. Part of the ControlValueAccessor interface\n     * required to integrate with Angular's core forms API.\n     *\n     * @param value New value to be written to the model.\n     */\n    MdSelect.prototype.writeValue = function (value) {\n        var _this = this;\n        if (!this.options) {\n            // In reactive forms, writeValue() will be called synchronously before\n            // the select's child options have been created. It's necessary to call\n            // writeValue() again after the options have been created to ensure any\n            // initial view value is set.\n            Promise.resolve(null).then(function () { return _this.writeValue(value); });\n            return;\n        }\n        this._setSelectionByValue(value);\n    };\n    /**\n     * Saves a callback function to be invoked when the select's value\n     * changes from user input. Part of the ControlValueAccessor interface\n     * required to integrate with Angular's core forms API.\n     *\n     * @param fn Callback to be triggered when the value changes.\n     */\n    MdSelect.prototype.registerOnChange = function (fn) {\n        this._onChange = fn;\n    };\n    /**\n     * Saves a callback function to be invoked when the select is blurred\n     * by the user. Part of the ControlValueAccessor interface required\n     * to integrate with Angular's core forms API.\n     *\n     * @param fn Callback to be triggered when the component has been touched.\n     */\n    MdSelect.prototype.registerOnTouched = function (fn) {\n        this._onTouched = fn;\n    };\n    /**\n     * Disables the select. Part of the ControlValueAccessor interface required\n     * to integrate with Angular's core forms API.\n     *\n     * @param isDisabled Sets whether the component is disabled.\n     */\n    MdSelect.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    Object.defineProperty(MdSelect.prototype, \"panelOpen\", {\n        /** Whether or not the overlay panel is open. */\n        get: function () {\n            return this._panelOpen;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSelect.prototype, \"selected\", {\n        /** The currently selected option. */\n        get: function () {\n            return this._selected;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdSelect.prototype._isRtl = function () {\n        return this._dir ? this._dir.value === 'rtl' : false;\n    };\n    /** The width of the trigger element. This is necessary to match\n     * the overlay width to the trigger width.\n     */\n    MdSelect.prototype._getWidth = function () {\n        return this._getTriggerRect().width;\n    };\n    /** Ensures the panel opens if activated by the keyboard. */\n    MdSelect.prototype._handleKeydown = function (event) {\n        if (event.keyCode === ENTER || event.keyCode === SPACE) {\n            this.open();\n        }\n    };\n    /**\n     * When the panel is finished animating, emits an event and focuses\n     * an option if the panel is open.\n     */\n    MdSelect.prototype._onPanelDone = function () {\n        if (this.panelOpen) {\n            this._focusCorrectOption();\n            this.onOpen.emit();\n        }\n        else {\n            this.onClose.emit();\n        }\n    };\n    /**\n     * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\n     * \"blur\" to the panel when it opens, causing a false positive.\n     */\n    MdSelect.prototype._onBlur = function () {\n        if (!this.panelOpen) {\n            this._onTouched();\n        }\n    };\n    /** Returns the correct tabindex for the select depending on disabled state. */\n    MdSelect.prototype._getTabIndex = function () {\n        return this.disabled ? '-1' : '0';\n    };\n    /**\n     * Sets the scroll position of the scroll container. This must be called after\n     * the overlay pane is attached or the scroll container element will not yet be\n     * present in the DOM.\n     */\n    MdSelect.prototype._setScrollTop = function () {\n        var scrollContainer = this.overlayDir.overlayRef.overlayElement.querySelector('.md-select-panel');\n        scrollContainer.scrollTop = this._scrollTop;\n    };\n    /**\n     * Sets the selected option based on a value. If no option can be\n     * found with the designated value, the select trigger is cleared.\n     */\n    MdSelect.prototype._setSelectionByValue = function (value) {\n        var options = this.options.toArray();\n        for (var i = 0; i < this.options.length; i++) {\n            if (options[i].value === value) {\n                options[i].select();\n                return;\n            }\n        }\n        // Clear selection if no item was selected.\n        this._clearSelection();\n    };\n    /** Clears the select trigger and deselects every option in the list. */\n    MdSelect.prototype._clearSelection = function () {\n        this._selected = null;\n        this._updateOptions();\n    };\n    MdSelect.prototype._getTriggerRect = function () {\n        return this.trigger.nativeElement.getBoundingClientRect();\n    };\n    /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n    MdSelect.prototype._initKeyManager = function () {\n        var _this = this;\n        this._keyManager = new ListKeyManager(this.options);\n        this._tabSubscription = this._keyManager.tabOut.subscribe(function () {\n            _this.close();\n        });\n    };\n    /** Drops current option subscriptions and IDs and resets from scratch. */\n    MdSelect.prototype._resetOptions = function () {\n        this._dropSubscriptions();\n        this._listenToOptions();\n        this._setOptionIds();\n    };\n    /** Listens to selection events on each option. */\n    MdSelect.prototype._listenToOptions = function () {\n        var _this = this;\n        this.options.forEach(function (option) {\n            var sub = option.onSelect.subscribe(function (isUserInput) {\n                if (isUserInput) {\n                    _this._onChange(option.value);\n                }\n                _this._onSelect(option);\n            });\n            _this._subscriptions.push(sub);\n        });\n    };\n    /** Unsubscribes from all option subscriptions. */\n    MdSelect.prototype._dropSubscriptions = function () {\n        this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n        this._subscriptions = [];\n    };\n    /** Records option IDs to pass to the aria-owns property. */\n    MdSelect.prototype._setOptionIds = function () {\n        this._optionIds = this.options.map(function (option) { return option.id; }).join(' ');\n    };\n    /** When a new option is selected, deselects the others and closes the panel. */\n    MdSelect.prototype._onSelect = function (option) {\n        this._selected = option;\n        this._updateOptions();\n        this._setValueWidth();\n        this._placeholderState = '';\n        if (this.panelOpen) {\n            this.close();\n        }\n    };\n    /** Deselect each option that doesn't match the current selection. */\n    MdSelect.prototype._updateOptions = function () {\n        var _this = this;\n        this.options.forEach(function (option) {\n            if (option !== _this.selected) {\n                option.deselect();\n            }\n        });\n    };\n    /**\n     * Must set the width of the selected option's value programmatically\n     * because it is absolutely positioned and otherwise will not clip\n     * overflow. The selection arrow is 9px wide, add 4px of padding = 13\n     */\n    MdSelect.prototype._setValueWidth = function () {\n        this._selectedValueWidth = this._triggerWidth - 13;\n    };\n    /** Focuses the selected item. If no option is selected, it will focus\n     * the first item instead.\n     */\n    MdSelect.prototype._focusCorrectOption = function () {\n        if (this.selected) {\n            this._keyManager.setFocus(this._getOptionIndex(this.selected));\n        }\n        else {\n            this._keyManager.focusFirstItem();\n        }\n    };\n    /** Focuses the host element when the panel closes. */\n    MdSelect.prototype._focusHost = function () {\n        this._renderer.invokeElementMethod(this._element.nativeElement, 'focus');\n    };\n    /** Gets the index of the provided option in the option list. */\n    MdSelect.prototype._getOptionIndex = function (option) {\n        return this.options.reduce(function (result, current, index) {\n            return result === undefined ? (option === current ? index : undefined) : result;\n        }, undefined);\n    };\n    /** Calculates the scroll position and x- and y-offsets of the overlay panel. */\n    MdSelect.prototype._calculateOverlayPosition = function () {\n        this._offsetX = this._isRtl() ? SELECT_PANEL_PADDING_X : -SELECT_PANEL_PADDING_X;\n        var panelHeight = Math.min(this.options.length * SELECT_OPTION_HEIGHT, SELECT_PANEL_MAX_HEIGHT);\n        var scrollContainerHeight = this.options.length * SELECT_OPTION_HEIGHT;\n        // The farthest the panel can be scrolled before it hits the bottom\n        var maxScroll = scrollContainerHeight - panelHeight;\n        if (this.selected) {\n            var selectedIndex = this._getOptionIndex(this.selected);\n            // We must maintain a scroll buffer so the selected option will be scrolled to the\n            // center of the overlay panel rather than the top.\n            var scrollBuffer = panelHeight / 2;\n            this._scrollTop = this._calculateOverlayScroll(selectedIndex, scrollBuffer, maxScroll);\n            this._offsetY = this._calculateOverlayOffset(selectedIndex, scrollBuffer, maxScroll);\n        }\n        else {\n            // If no option is selected, the panel centers on the first option. In this case,\n            // we must only adjust for the height difference between the option element\n            // and the trigger element, then multiply it by -1 to ensure the panel moves\n            // in the correct direction up the page.\n            this._offsetY = (SELECT_OPTION_HEIGHT - SELECT_TRIGGER_HEIGHT) / 2 * -1;\n        }\n        this._checkOverlayWithinViewport(maxScroll);\n    };\n    /**\n     * Calculates the scroll position of the select's overlay panel.\n     *\n     * Attempts to center the selected option in the panel. If the option is\n     * too high or too low in the panel to be scrolled to the center, it clamps the\n     * scroll position to the min or max scroll positions respectively.\n     */\n    MdSelect.prototype._calculateOverlayScroll = function (selectedIndex, scrollBuffer, maxScroll) {\n        var optionOffsetFromScrollTop = SELECT_OPTION_HEIGHT * selectedIndex;\n        var halfOptionHeight = SELECT_OPTION_HEIGHT / 2;\n        // Starts at the optionOffsetFromScrollTop, which scrolls the option to the top of the\n        // scroll container, then subtracts the scroll buffer to scroll the option down to\n        // the center of the overlay panel. Half the option height must be re-added to the\n        // scrollTop so the option is centered based on its middle, not its top edge.\n        var optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;\n        return clampValue(0, optimalScrollPosition, maxScroll);\n    };\n    /**\n     * Calculates the y-offset of the select's overlay panel in relation to the\n     * top start corner of the trigger. It has to be adjusted in order for the\n     * selected option to be aligned over the trigger when the panel opens.\n     */\n    MdSelect.prototype._calculateOverlayOffset = function (selectedIndex, scrollBuffer, maxScroll) {\n        var optionOffsetFromPanelTop;\n        if (this._scrollTop === 0) {\n            optionOffsetFromPanelTop = selectedIndex * SELECT_OPTION_HEIGHT;\n        }\n        else if (this._scrollTop === maxScroll) {\n            var firstDisplayedIndex = this.options.length - SELECT_MAX_OPTIONS_DISPLAYED;\n            var selectedDisplayIndex = selectedIndex - firstDisplayedIndex;\n            // Because the panel height is longer than the height of the options alone,\n            // there is always extra padding at the top or bottom of the panel. When\n            // scrolled to the very bottom, this padding is at the top of the panel and\n            // must be added to the offset.\n            optionOffsetFromPanelTop =\n                selectedDisplayIndex * SELECT_OPTION_HEIGHT + SELECT_PANEL_PADDING_Y;\n        }\n        else {\n            // If the option was scrolled to the middle of the panel using a scroll buffer,\n            // its offset will be the scroll buffer minus the half height that was added to\n            // center it.\n            optionOffsetFromPanelTop = scrollBuffer - SELECT_OPTION_HEIGHT / 2;\n        }\n        // The final offset is the option's offset from the top, adjusted for the height\n        // difference, multiplied by -1 to ensure that the overlay moves in the correct\n        // direction up the page.\n        return optionOffsetFromPanelTop * -1 - SELECT_OPTION_HEIGHT_ADJUSTMENT;\n    };\n    /**\n     * Checks that the attempted overlay position will fit within the viewport.\n     * If it will not fit, tries to adjust the scroll position and the associated\n     * y-offset so the panel can open fully on-screen. If it still won't fit,\n     * sets the offset back to 0 to allow the fallback position to take over.\n     */\n    MdSelect.prototype._checkOverlayWithinViewport = function (maxScroll) {\n        var viewportRect = this._viewportRuler.getViewportRect();\n        var triggerRect = this._getTriggerRect();\n        var topSpaceAvailable = triggerRect.top - SELECT_PANEL_VIEWPORT_PADDING;\n        var bottomSpaceAvailable = viewportRect.height - triggerRect.bottom - SELECT_PANEL_VIEWPORT_PADDING;\n        var panelHeightTop = Math.abs(this._offsetY);\n        var totalPanelHeight = Math.min(this.options.length * SELECT_OPTION_HEIGHT, SELECT_PANEL_MAX_HEIGHT);\n        var panelHeightBottom = totalPanelHeight - panelHeightTop - triggerRect.height;\n        if (panelHeightBottom > bottomSpaceAvailable) {\n            this._adjustPanelUp(panelHeightBottom, bottomSpaceAvailable);\n        }\n        else if (panelHeightTop > topSpaceAvailable) {\n            this._adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll);\n        }\n        else {\n            this._transformOrigin = this._getOriginBasedOnOption();\n        }\n    };\n    /** Adjusts the overlay panel up to fit in the viewport. */\n    MdSelect.prototype._adjustPanelUp = function (panelHeightBottom, bottomSpaceAvailable) {\n        var distanceBelowViewport = panelHeightBottom - bottomSpaceAvailable;\n        // Scrolls the panel up by the distance it was extending past the boundary, then\n        // adjusts the offset by that amount to move the panel up into the viewport.\n        this._scrollTop -= distanceBelowViewport;\n        this._offsetY -= distanceBelowViewport;\n        this._transformOrigin = this._getOriginBasedOnOption();\n        // If the panel is scrolled to the very top, it won't be able to fit the panel\n        // by scrolling, so set the offset to 0 to allow the fallback position to take\n        // effect.\n        if (this._scrollTop <= 0) {\n            this._scrollTop = 0;\n            this._offsetY = 0;\n            this._transformOrigin = \"50% bottom 0px\";\n        }\n    };\n    /** Adjusts the overlay panel down to fit in the viewport. */\n    MdSelect.prototype._adjustPanelDown = function (panelHeightTop, topSpaceAvailable, maxScroll) {\n        var distanceAboveViewport = panelHeightTop - topSpaceAvailable;\n        // Scrolls the panel down by the distance it was extending past the boundary, then\n        // adjusts the offset by that amount to move the panel down into the viewport.\n        this._scrollTop += distanceAboveViewport;\n        this._offsetY += distanceAboveViewport;\n        this._transformOrigin = this._getOriginBasedOnOption();\n        // If the panel is scrolled to the very bottom, it won't be able to fit the\n        // panel by scrolling, so set the offset to 0 to allow the fallback position\n        // to take effect.\n        if (this._scrollTop >= maxScroll) {\n            this._scrollTop = maxScroll;\n            this._offsetY = 0;\n            this._transformOrigin = \"50% top 0px\";\n            return;\n        }\n    };\n    /** Sets the transform origin point based on the selected option. */\n    MdSelect.prototype._getOriginBasedOnOption = function () {\n        var originY = Math.abs(this._offsetY) - SELECT_OPTION_HEIGHT_ADJUSTMENT + SELECT_OPTION_HEIGHT / 2;\n        return \"50% \" + originY + \"px 0px\";\n    };\n    __decorate$30([\n        _angular_core.ViewChild('trigger'), \n        __metadata$30('design:type', _angular_core.ElementRef)\n    ], MdSelect.prototype, \"trigger\", void 0);\n    __decorate$30([\n        _angular_core.ViewChild(ConnectedOverlayDirective), \n        __metadata$30('design:type', ConnectedOverlayDirective)\n    ], MdSelect.prototype, \"overlayDir\", void 0);\n    __decorate$30([\n        _angular_core.ContentChildren(MdOption), \n        __metadata$30('design:type', _angular_core.QueryList)\n    ], MdSelect.prototype, \"options\", void 0);\n    __decorate$30([\n        _angular_core.Input(), \n        __metadata$30('design:type', Object)\n    ], MdSelect.prototype, \"placeholder\", null);\n    __decorate$30([\n        _angular_core.Input(), \n        __metadata$30('design:type', Object)\n    ], MdSelect.prototype, \"disabled\", null);\n    __decorate$30([\n        _angular_core.Input(), \n        __metadata$30('design:type', Object)\n    ], MdSelect.prototype, \"required\", null);\n    __decorate$30([\n        _angular_core.Output(), \n        __metadata$30('design:type', Object)\n    ], MdSelect.prototype, \"onOpen\", void 0);\n    __decorate$30([\n        _angular_core.Output(), \n        __metadata$30('design:type', Object)\n    ], MdSelect.prototype, \"onClose\", void 0);\n    MdSelect = __decorate$30([\n        _angular_core.Component({selector: 'md-select, mat-select',\n            template: \"<div class=\\\"md-select-trigger\\\" cdk-overlay-origin (click)=\\\"toggle()\\\" #origin=\\\"cdkOverlayOrigin\\\" #trigger><span class=\\\"md-select-placeholder\\\" [class.md-floating-placeholder]=\\\"this.selected\\\" [@transformPlaceholder]=\\\"_placeholderState\\\" [style.width.px]=\\\"_selectedValueWidth\\\">{{ placeholder }} </span><span class=\\\"md-select-value\\\" *ngIf=\\\"selected\\\">{{ selected?.viewValue }} </span><span class=\\\"md-select-arrow\\\"></span></div><template cdk-connected-overlay [origin]=\\\"origin\\\" [open]=\\\"panelOpen\\\" hasBackdrop (backdropClick)=\\\"close()\\\" backdropClass=\\\"cdk-overlay-transparent-backdrop\\\" [positions]=\\\"_positions\\\" [minWidth]=\\\"_triggerWidth\\\" [offsetY]=\\\"_offsetY\\\" [offsetX]=\\\"_offsetX\\\" (attach)=\\\"_setScrollTop()\\\"><div class=\\\"md-select-panel\\\" [@transformPanel]=\\\"'showing'\\\" (@transformPanel.done)=\\\"_onPanelDone()\\\" (keydown)=\\\"_keyManager.onKeydown($event)\\\" [style.transformOrigin]=\\\"_transformOrigin\\\"><div class=\\\"md-select-content\\\" [@fadeInContent]=\\\"'showing'\\\"><ng-content></ng-content></div></div></template>\",\n            styles: [\".md-select-value,md-option{white-space:nowrap;text-overflow:ellipsis}md-select{display:inline-block;outline:0}.md-select-trigger{display:flex;justify-content:space-between;align-items:center;height:30px;min-width:112px;cursor:pointer;position:relative;box-sizing:border-box}[aria-disabled=true] .md-select-trigger{background-image:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x;border-bottom:transparent;background-position:0 bottom;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-select-placeholder{position:relative;padding:0 2px;transform-origin:left top}.md-select-placeholder.md-floating-placeholder{top:-22px;left:-2px;transform:scale(.75)}[dir=rtl] .md-select-placeholder{transform-origin:right top}[dir=rtl] .md-select-placeholder.md-floating-placeholder{left:2px}[aria-required=true] .md-select-placeholder::after{content:'*'}.md-select-value{position:absolute;overflow-x:hidden;left:0;top:6px}[dir=rtl] .md-select-value{left:auto;right:0}.md-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.md-select-panel{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px}@media screen and (-ms-high-contrast:active){.md-select-panel{outline:solid 1px}.md-option-ripple{opacity:.5}}md-option{overflow-x:hidden;display:flex;flex-direction:row;align-items:center;height:48px;padding:0 16px;font-size:16px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;text-align:start;text-decoration:none;position:relative;cursor:pointer;outline:0}md-option[disabled]{cursor:default}md-option md-icon{margin-right:16px}[dir=rtl] md-option md-icon{margin-left:16px}md-option[aria-disabled=true]{cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-option-ripple{position:absolute;top:0;left:0;bottom:0;right:0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            host: {\n                'role': 'listbox',\n                '[attr.tabindex]': '_getTabIndex()',\n                '[attr.aria-label]': 'placeholder',\n                '[attr.aria-required]': 'required.toString()',\n                '[attr.aria-disabled]': 'disabled.toString()',\n                '[attr.aria-invalid]': '_control?.invalid || \"false\"',\n                '[attr.aria-owns]': '_optionIds',\n                '[class.md-select-disabled]': 'disabled',\n                '(keydown)': '_handleKeydown($event)',\n                '(blur)': '_onBlur()'\n            },\n            animations: [\n                transformPlaceholder,\n                transformPanel,\n                fadeInContent\n            ],\n            exportAs: 'mdSelect',\n        }),\n        __param$6(3, _angular_core.Optional()),\n        __param$6(4, _angular_core.Optional()), \n        __metadata$30('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer, ViewportRuler, Dir, _angular_forms.NgControl])\n    ], MdSelect);\n    return MdSelect;\n}());\n/** Clamps a value n between min and max values. */\nfunction clampValue(min, n, max) {\n    return Math.min(Math.max(min, n), max);\n}\n\nvar __decorate$29 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$29 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdSelectModule = (function () {\n    function MdSelectModule() {\n    }\n    MdSelectModule.forRoot = function () {\n        return {\n            ngModule: MdSelectModule,\n            providers: [OVERLAY_PROVIDERS]\n        };\n    };\n    MdSelectModule = __decorate$29([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, OverlayModule, MdRippleModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdSelect, MdOption, DefaultStyleCompatibilityModeModule],\n            declarations: [MdSelect, MdOption],\n        }), \n        __metadata$29('design:paramtypes', [])\n    ], MdSelectModule);\n    return MdSelectModule;\n}());\n\nvar __decorate$32 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$32 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MD_SLIDE_TOGGLE_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdSlideToggle; }),\n    multi: true\n};\n// A simple change event emitted by the MdSlideToggle component.\nvar MdSlideToggleChange = (function () {\n    function MdSlideToggleChange() {\n    }\n    return MdSlideToggleChange;\n}());\n// Increasing integer for generating unique ids for slide-toggle components.\nvar nextId$1 = 0;\n/**\n * Two-state control, which can be also called `switch`.\n */\nvar MdSlideToggle = (function () {\n    function MdSlideToggle(_elementRef, _renderer) {\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        this.onChange = function (_) { };\n        this.onTouched = function () { };\n        // A unique id for the slide-toggle. By default the id is auto-generated.\n        this._uniqueId = \"md-slide-toggle-\" + ++nextId$1;\n        this._checked = false;\n        this._isMousedown = false;\n        this._slideRenderer = null;\n        this._disabled = false;\n        this._required = false;\n        // Needs to be public to support AOT compilation (as host binding).\n        this._hasFocus = false;\n        /** Name value will be applied to the input element if present */\n        this.name = null;\n        /** A unique id for the slide-toggle input. If none is supplied, it will be auto-generated. */\n        this.id = this._uniqueId;\n        /** Used to specify the tabIndex value for the underlying input element. */\n        this.tabIndex = 0;\n        /** Used to set the aria-label attribute on the underlying input element. */\n        this.ariaLabel = null;\n        /** Used to set the aria-labelledby attribute on the underlying input element. */\n        this.ariaLabelledby = null;\n        this._change = new _angular_core.EventEmitter();\n        /** An event will be dispatched each time the slide-toggle changes its value. */\n        this.change = this._change.asObservable();\n    }\n    Object.defineProperty(MdSlideToggle.prototype, \"disabled\", {\n        /** Whether the slide-toggle is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlideToggle.prototype, \"required\", {\n        /** Whether the slide-toggle is required. */\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlideToggle.prototype, \"inputId\", {\n        /** Returns the unique id for the visual hidden input. */\n        get: function () { return (this.id || this._uniqueId) + \"-input\"; },\n        enumerable: true,\n        configurable: true\n    });\n    MdSlideToggle.prototype.ngAfterContentInit = function () {\n        this._slideRenderer = new SlideToggleRenderer(this._elementRef);\n    };\n    /**\n     * The onChangeEvent method will be also called on click.\n     * This is because everything for the slide-toggle is wrapped inside of a label,\n     * which triggers a onChange event on click.\n     */\n    MdSlideToggle.prototype._onChangeEvent = function (event) {\n        // We always have to stop propagation on the change event.\n        // Otherwise the change event, from the input element, will bubble up and\n        // emit its event object to the component's `change` output.\n        event.stopPropagation();\n        // Once a drag is currently in progress, we do not want to toggle the slide-toggle on a click.\n        if (!this.disabled && !this._slideRenderer.isDragging()) {\n            this.toggle();\n            // Emit our custom change event if the native input emitted one.\n            // It is important to only emit it, if the native input triggered one, because\n            // we don't want to trigger a change event, when the `checked` variable changes for example.\n            this._emitChangeEvent();\n        }\n    };\n    MdSlideToggle.prototype._onInputClick = function (event) {\n        this.onTouched();\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `slide-toggle` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    };\n    MdSlideToggle.prototype._setMousedown = function () {\n        var _this = this;\n        // We only *show* the focus style when focus has come to the button via the keyboard.\n        // The Material Design spec is silent on this topic, and without doing this, the\n        // button continues to look :active after clicking.\n        // @see http://marcysutton.com/button-focus-hell/\n        this._isMousedown = true;\n        setTimeout(function () { return _this._isMousedown = false; }, 100);\n    };\n    MdSlideToggle.prototype._onInputFocus = function () {\n        // Only show the focus / ripple indicator when the focus was not triggered by a mouse\n        // interaction on the component.\n        if (!this._isMousedown) {\n            this._hasFocus = true;\n        }\n    };\n    MdSlideToggle.prototype._onInputBlur = function () {\n        this._hasFocus = false;\n        this.onTouched();\n    };\n    /** Implemented as part of ControlValueAccessor. */\n    MdSlideToggle.prototype.writeValue = function (value) {\n        this.checked = value;\n    };\n    /** Implemented as part of ControlValueAccessor. */\n    MdSlideToggle.prototype.registerOnChange = function (fn) {\n        this.onChange = fn;\n    };\n    /** Implemented as part of ControlValueAccessor. */\n    MdSlideToggle.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    /** Implemented as a part of ControlValueAccessor. */\n    MdSlideToggle.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    /** Focuses the slide-toggle. */\n    MdSlideToggle.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');\n        this._onInputFocus();\n    };\n    Object.defineProperty(MdSlideToggle.prototype, \"checked\", {\n        /** Whether the slide-toggle is checked. */\n        get: function () { return !!this._checked; },\n        set: function (value) {\n            if (this.checked !== !!value) {\n                this._checked = value;\n                this.onChange(this._checked);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlideToggle.prototype, \"color\", {\n        /** The color of the slide-toggle. Can be primary, accent, or warn. */\n        get: function () { return this._color; },\n        set: function (value) {\n            this._updateColor(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Toggles the checked state of the slide-toggle. */\n    MdSlideToggle.prototype.toggle = function () {\n        this.checked = !this.checked;\n    };\n    MdSlideToggle.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    MdSlideToggle.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this._renderer.setElementClass(this._elementRef.nativeElement, \"md-\" + color, isAdd);\n        }\n    };\n    /** Emits the change event to the `change` output EventEmitter */\n    MdSlideToggle.prototype._emitChangeEvent = function () {\n        var event = new MdSlideToggleChange();\n        event.source = this;\n        event.checked = this.checked;\n        this._change.emit(event);\n    };\n    MdSlideToggle.prototype._onDragStart = function () {\n        if (!this.disabled) {\n            this._slideRenderer.startThumbDrag(this.checked);\n        }\n    };\n    MdSlideToggle.prototype._onDrag = function (event) {\n        if (this._slideRenderer.isDragging()) {\n            this._slideRenderer.updateThumbPosition(event.deltaX);\n        }\n    };\n    MdSlideToggle.prototype._onDragEnd = function () {\n        var _this = this;\n        if (!this._slideRenderer.isDragging()) {\n            return;\n        }\n        // Notice that we have to stop outside of the current event handler,\n        // because otherwise the click event will be fired and will reset the new checked variable.\n        setTimeout(function () {\n            _this.checked = _this._slideRenderer.stopThumbDrag();\n            _this._emitChangeEvent();\n        }, 0);\n    };\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], MdSlideToggle.prototype, \"name\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], MdSlideToggle.prototype, \"id\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Number)\n    ], MdSlideToggle.prototype, \"tabIndex\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], MdSlideToggle.prototype, \"ariaLabel\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], MdSlideToggle.prototype, \"ariaLabelledby\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Boolean)\n    ], MdSlideToggle.prototype, \"disabled\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Boolean)\n    ], MdSlideToggle.prototype, \"required\", null);\n    __decorate$32([\n        _angular_core.Output(), \n        __metadata$32('design:type', rxjs_Observable.Observable)\n    ], MdSlideToggle.prototype, \"change\", void 0);\n    __decorate$32([\n        _angular_core.ViewChild('input'), \n        __metadata$32('design:type', _angular_core.ElementRef)\n    ], MdSlideToggle.prototype, \"_inputElement\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], MdSlideToggle.prototype, \"checked\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], MdSlideToggle.prototype, \"color\", null);\n    MdSlideToggle = __decorate$32([\n        _angular_core.Component({selector: 'md-slide-toggle, mat-slide-toggle',\n            host: {\n                '[class.md-checked]': 'checked',\n                '[class.md-disabled]': 'disabled',\n                // This md-slide-toggle prefix will change, once the temporary ripple is removed.\n                '[class.md-slide-toggle-focused]': '_hasFocus',\n                '(mousedown)': '_setMousedown()'\n            },\n            template: \"<label class=\\\"md-slide-toggle-label\\\"><div class=\\\"md-slide-toggle-container\\\"><div class=\\\"md-slide-toggle-bar\\\"></div><div class=\\\"md-slide-toggle-thumb-container\\\" (slidestart)=\\\"_onDragStart()\\\" (slide)=\\\"_onDrag($event)\\\" (slideend)=\\\"_onDragEnd()\\\"><div class=\\\"md-slide-toggle-thumb\\\"><div class=\\\"md-ink-ripple\\\"></div></div></div><input #input class=\\\"md-slide-toggle-input cdk-visually-hidden\\\" type=\\\"checkbox\\\" [id]=\\\"inputId\\\" [required]=\\\"required\\\" [tabIndex]=\\\"tabIndex\\\" [checked]=\\\"checked\\\" [disabled]=\\\"disabled\\\" [attr.name]=\\\"name\\\" [attr.aria-label]=\\\"ariaLabel\\\" [attr.aria-labelledby]=\\\"ariaLabelledby\\\" (blur)=\\\"_onInputBlur()\\\" (focus)=\\\"_onInputFocus()\\\" (change)=\\\"_onChangeEvent($event)\\\" (click)=\\\"_onInputClick($event)\\\"></div><span class=\\\"md-slide-toggle-content\\\"><ng-content></ng-content></span></label>\",\n            styles: [\"md-slide-toggle{display:flex;height:24px;margin:16px 0;line-height:24px;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}md-slide-toggle.md-checked .md-slide-toggle-thumb-container{transform:translate3d(100%,0,0)}md-slide-toggle .md-ink-ripple{border-radius:50%;opacity:0;height:48px;left:50%;overflow:hidden;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);transition:opacity ease 280ms,background-color ease 280ms;width:48px}md-slide-toggle.md-slide-toggle-focused .md-ink-ripple{opacity:1}md-slide-toggle.md-slide-toggle-disabled .md-ink-ripple{background-color:#000}md-slide-toggle.md-disabled .md-slide-toggle-container,md-slide-toggle.md-disabled .md-slide-toggle-label{cursor:default}.md-slide-toggle-content{font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500}.md-slide-toggle-label{display:flex;flex:1;cursor:pointer}.md-slide-toggle-container{cursor:-webkit-grab;cursor:grab;width:36px;height:24px;position:relative;margin-right:8px}[dir=rtl] .md-slide-toggle-container{margin-left:8px;margin-right:0}.md-slide-toggle-thumb-container{position:absolute;top:2px;left:0;z-index:1;width:16px;transform:translate3d(0,0,0);transition:all 80ms linear;transition-property:transform}.md-slide-toggle-thumb-container.md-dragging{transition-duration:0s}.md-slide-toggle-thumb{position:absolute;margin:0;left:0;top:0;height:20px;width:20px;border-radius:50%;box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.md-slide-toggle-thumb{background:#fff;border:1px solid #000}.md-slide-toggle-bar{background:#fff}}.md-slide-toggle-bar{position:absolute;left:1px;top:5px;width:34px;height:14px;border-radius:8px}.md-slide-toggle-input{bottom:0;left:10px}.md-slide-toggle-bar,.md-slide-toggle-thumb{transition:all 80ms linear;transition-property:background-color;transition-delay:50ms}\"],\n            providers: [MD_SLIDE_TOGGLE_VALUE_ACCESSOR],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush\n        }), \n        __metadata$32('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdSlideToggle);\n    return MdSlideToggle;\n}());\n/**\n * Renderer for the Slide Toggle component, which separates DOM modification in its own class\n */\nvar SlideToggleRenderer = (function () {\n    function SlideToggleRenderer(_elementRef) {\n        this._elementRef = _elementRef;\n        this._thumbEl = _elementRef.nativeElement.querySelector('.md-slide-toggle-thumb-container');\n        this._thumbBarEl = _elementRef.nativeElement.querySelector('.md-slide-toggle-bar');\n    }\n    /** Whether the slide-toggle is currently dragging. */\n    SlideToggleRenderer.prototype.isDragging = function () {\n        return !!this._thumbBarWidth;\n    };\n    /** Initializes the drag of the slide-toggle. */\n    SlideToggleRenderer.prototype.startThumbDrag = function (checked) {\n        if (!this.isDragging()) {\n            this._thumbBarWidth = this._thumbBarEl.clientWidth - this._thumbEl.clientWidth;\n            this._checked = checked;\n            this._thumbEl.classList.add('md-dragging');\n        }\n    };\n    /** Stops the current drag and returns the new checked value. */\n    SlideToggleRenderer.prototype.stopThumbDrag = function () {\n        if (this.isDragging()) {\n            this._thumbBarWidth = null;\n            this._thumbEl.classList.remove('md-dragging');\n            applyCssTransform(this._thumbEl, '');\n            return this._percentage > 50;\n        }\n    };\n    /** Updates the thumb containers position from the specified distance. */\n    SlideToggleRenderer.prototype.updateThumbPosition = function (distance) {\n        this._percentage = this._getThumbPercentage(distance);\n        applyCssTransform(this._thumbEl, \"translate3d(\" + this._percentage + \"%, 0, 0)\");\n    };\n    /** Retrieves the percentage of thumb from the moved distance. */\n    SlideToggleRenderer.prototype._getThumbPercentage = function (distance) {\n        var percentage = (distance / this._thumbBarWidth) * 100;\n        // When the toggle was initially checked, then we have to start the drag at the end.\n        if (this._checked) {\n            percentage += 100;\n        }\n        return Math.max(0, Math.min(percentage, 100));\n    };\n    return SlideToggleRenderer;\n}());\nvar MdSlideToggleModule = (function () {\n    function MdSlideToggleModule() {\n    }\n    MdSlideToggleModule.forRoot = function () {\n        return {\n            ngModule: MdSlideToggleModule,\n            providers: [{ provide: _angular_platformBrowser.HAMMER_GESTURE_CONFIG, useClass: GestureConfig }]\n        };\n    };\n    MdSlideToggleModule = __decorate$32([\n        _angular_core.NgModule({\n            imports: [_angular_forms.FormsModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdSlideToggle, DefaultStyleCompatibilityModeModule],\n            declarations: [MdSlideToggle],\n        }), \n        __metadata$32('design:paramtypes', [])\n    ], MdSlideToggleModule);\n    return MdSlideToggleModule;\n}());\n\nvar __decorate$33 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$33 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$7 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Visually, a 30px separation between tick marks looks best. This is very subjective but it is\n * the default separation we chose.\n */\nvar MIN_AUTO_TICK_SEPARATION = 30;\n/**\n * Provider Expression that allows md-slider to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)] and [formControl].\n */\nvar MD_SLIDER_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdSlider; }),\n    multi: true\n};\n/** A simple change event emitted by the MdSlider component. */\nvar MdSliderChange = (function () {\n    function MdSliderChange() {\n    }\n    return MdSliderChange;\n}());\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `<input type=\"range\">` element.\n */\nvar MdSlider = (function () {\n    function MdSlider(_dir, elementRef) {\n        this._dir = _dir;\n        /** A renderer to handle updating the slider's thumb and fill track. */\n        this._renderer = null;\n        /** The dimensions of the slider. */\n        this._sliderDimensions = null;\n        this._disabled = false;\n        this._thumbLabel = false;\n        this._controlValueAccessorChangeFn = function () { };\n        /** The last value for which a change event was emitted. */\n        this._lastEmittedValue = null;\n        /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n        this.onTouched = function () { };\n        /**\n         * Whether or not the thumb is sliding.\n         * Used to determine if there should be a transition for the thumb and fill track.\n         */\n        this._isSliding = false;\n        /**\n         * Whether or not the slider is active (clicked or sliding).\n         * Used to shrink and grow the thumb as according to the Material Design spec.\n         */\n        this._isActive = false;\n        this._step = 1;\n        this._tickInterval = 0;\n        this._tickIntervalPercent = 0;\n        this._percent = 0;\n        this._value = null;\n        this._min = 0;\n        this._max = 100;\n        this._invert = false;\n        this._vertical = false;\n        /** Event emitted when the slider value has changed. */\n        this.change = new _angular_core.EventEmitter();\n        this._renderer = new SliderRenderer(elementRef);\n    }\n    Object.defineProperty(MdSlider.prototype, \"disabled\", {\n        /** Whether or not the slider is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"thumbLabel\", {\n        /** Whether or not to show the thumb label. */\n        get: function () { return this._thumbLabel; },\n        set: function (value) { this._thumbLabel = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"_thumbLabelDeprecated\", {\n        /** @deprecated */\n        get: function () { return this._thumbLabel; },\n        set: function (value) { this._thumbLabel = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"step\", {\n        /** The values at which the thumb will snap. */\n        get: function () { return this._step; },\n        set: function (v) { this._step = coerceNumberProperty(v, this._step); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"tickInterval\", {\n        /**\n         * How often to show ticks. Relative to the step so that a tick always appears on a step.\n         * Ex: Tick interval of 4 with a step of 3 will draw a tick every 4 steps (every 12 values).\n         */\n        get: function () { return this._tickInterval; },\n        set: function (v) {\n            this._tickInterval = (v == 'auto') ? v : coerceNumberProperty(v, this._tickInterval);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"_tickIntervalDeprecated\", {\n        /** @deprecated */\n        get: function () { return this.tickInterval; },\n        set: function (v) { this.tickInterval = v; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"tickIntervalPercent\", {\n        /** The size of a tick interval as a percentage of the size of the track. */\n        get: function () { return this._tickIntervalPercent; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"percent\", {\n        /** The percentage of the slider that coincides with the value. */\n        get: function () { return this._clamp(this._percent); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"value\", {\n        /** Value of the slider. */\n        get: function () {\n            // If the value needs to be read and it is still uninitialized, initialize it to the min.\n            if (this._value === null) {\n                this.value = this._min;\n            }\n            return this._value;\n        },\n        set: function (v) {\n            this._value = coerceNumberProperty(v, this._value);\n            this._percent = this._calculatePercentage(this._value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"min\", {\n        /** The miniumum value that the slider can have. */\n        get: function () {\n            return this._min;\n        },\n        set: function (v) {\n            this._min = coerceNumberProperty(v, this._min);\n            // If the value wasn't explicitly set by the user, set it to the min.\n            if (this._value === null) {\n                this.value = this._min;\n            }\n            this._percent = this._calculatePercentage(this.value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"max\", {\n        /** The maximum value that the slider can have. */\n        get: function () {\n            return this._max;\n        },\n        set: function (v) {\n            this._max = coerceNumberProperty(v, this._max);\n            this._percent = this._calculatePercentage(this.value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"invert\", {\n        /** Whether the slider is inverted. */\n        get: function () { return this._invert; },\n        set: function (value) { this._invert = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"vertical\", {\n        /** Whether the slider is vertical. */\n        get: function () { return this._vertical; },\n        set: function (value) { this._vertical = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"invertAxis\", {\n        /**\n         * Whether the axis of the slider is inverted.\n         * (i.e. whether moving the thumb in the positive x or y direction decreases the slider's value).\n         */\n        get: function () {\n            // Standard non-inverted mode for a vertical slider should be dragging the thumb from bottom to\n            // top. However from a y-axis standpoint this is inverted.\n            return this.vertical ? !this.invert : this.invert;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"invertMouseCoords\", {\n        /**\n         * Whether mouse events should be converted to a slider position by calculating their distance\n         * from the right or bottom edge of the slider as opposed to the top or left.\n         */\n        get: function () {\n            return (this.direction == 'rtl' && !this.vertical) ? !this.invertAxis : this.invertAxis;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"trackFillStyles\", {\n        /** CSS styles for the track fill element. */\n        get: function () {\n            var axis = this.vertical ? 'Y' : 'X';\n            return {\n                'transform': \"scale\" + axis + \"(\" + this.percent + \")\"\n            };\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"ticksContainerStyles\", {\n        /** CSS styles for the ticks container element. */\n        get: function () {\n            var axis = this.vertical ? 'Y' : 'X';\n            // For a horizontal slider in RTL languages we push the ticks container off the left edge\n            // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n            var sign = !this.vertical && this.direction == 'rtl' ? '' : '-';\n            var offset = this.tickIntervalPercent / 2 * 100;\n            return {\n                'transform': \"translate\" + axis + \"(\" + sign + offset + \"%)\"\n            };\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"ticksStyles\", {\n        /** CSS styles for the ticks element. */\n        get: function () {\n            var tickSize = this.tickIntervalPercent * 100;\n            var backgroundSize = this.vertical ? \"2px \" + tickSize + \"%\" : tickSize + \"% 2px\";\n            var axis = this.vertical ? 'Y' : 'X';\n            // Depending on the direction we pushed the ticks container, push the ticks the opposite\n            // direction to re-center them but clip off the end edge. In RTL languages we need to flip the\n            // ticks 180 degrees so we're really cutting off the end edge abd not the start.\n            var sign = !this.vertical && this.direction == 'rtl' ? '-' : '';\n            var rotate = !this.vertical && this.direction == 'rtl' ? ' rotate(180deg)' : '';\n            return {\n                'backgroundSize': backgroundSize,\n                // Without translateZ ticks sometimes jitter as the slider moves on Chrome & Firefox.\n                'transform': \"translateZ(0) translate\" + axis + \"(\" + sign + tickSize / 2 + \"%)\" + rotate\n            };\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"thumbContainerStyles\", {\n        get: function () {\n            var axis = this.vertical ? 'Y' : 'X';\n            // For a horizontal slider in RTL languages we push the thumb container off the left edge\n            // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n            var invertOffset = (this.direction == 'rtl' && !this.vertical) ? !this.invertAxis : this.invertAxis;\n            var offset = (invertOffset ? this.percent : 1 - this.percent) * 100;\n            return {\n                'transform': \"translate\" + axis + \"(-\" + offset + \"%)\"\n            };\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSlider.prototype, \"direction\", {\n        /** The language direction for this slider element. */\n        get: function () {\n            return (this._dir && this._dir.value == 'rtl') ? 'rtl' : 'ltr';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdSlider.prototype._onMouseenter = function () {\n        if (this.disabled) {\n            return;\n        }\n        // We save the dimensions of the slider here so we can use them to update the spacing of the\n        // ticks and determine where on the slider click and slide events happen.\n        this._sliderDimensions = this._renderer.getSliderDimensions();\n        this._updateTickIntervalPercent();\n    };\n    MdSlider.prototype._onClick = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        this._isActive = true;\n        this._isSliding = false;\n        this._renderer.addFocus();\n        this._updateValueFromPosition({ x: event.clientX, y: event.clientY });\n        this._emitValueIfChanged();\n    };\n    MdSlider.prototype._onSlide = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        // Prevent the slide from selecting anything else.\n        event.preventDefault();\n        this._updateValueFromPosition({ x: event.center.x, y: event.center.y });\n    };\n    MdSlider.prototype._onSlideStart = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        // Simulate mouseenter in case this is a mobile device.\n        this._onMouseenter();\n        event.preventDefault();\n        this._isSliding = true;\n        this._isActive = true;\n        this._renderer.addFocus();\n        this._updateValueFromPosition({ x: event.center.x, y: event.center.y });\n    };\n    MdSlider.prototype._onSlideEnd = function () {\n        this._isSliding = false;\n        this._emitValueIfChanged();\n    };\n    MdSlider.prototype._onBlur = function () {\n        this._isActive = false;\n        this.onTouched();\n    };\n    MdSlider.prototype._onKeydown = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        switch (event.keyCode) {\n            case PAGE_UP:\n                this._increment(10);\n                break;\n            case PAGE_DOWN:\n                this._increment(-10);\n                break;\n            case END:\n                this.value = this.max;\n                break;\n            case HOME:\n                this.value = this.min;\n                break;\n            case LEFT_ARROW:\n                // NOTE: For a sighted user it would make more sense that when they press an arrow key on an\n                // inverted slider the thumb moves in that direction. However for a blind user, nothing\n                // about the slider indicates that it is inverted. They will expect left to be decrement,\n                // regardless of how it appears on the screen. For speakers ofRTL languages, they probably\n                // expect left to mean increment. Therefore we flip the meaning of the side arrow keys for\n                // RTL. For inverted sliders we prefer a good a11y experience to having it \"look right\" for\n                // sighted users, therefore we do not swap the meaning.\n                this._increment(this.direction == 'rtl' ? 1 : -1);\n                break;\n            case UP_ARROW:\n                this._increment(1);\n                break;\n            case RIGHT_ARROW:\n                // See comment on LEFT_ARROW about the conditions under which we flip the meaning.\n                this._increment(this.direction == 'rtl' ? -1 : 1);\n                break;\n            case DOWN_ARROW:\n                this._increment(-1);\n                break;\n            default:\n                // Return if the key is not one that we explicitly handle to avoid calling preventDefault on\n                // it.\n                return;\n        }\n        event.preventDefault();\n    };\n    /** Increments the slider by the given number of steps (negative number decrements). */\n    MdSlider.prototype._increment = function (numSteps) {\n        this.value = this._clamp(this.value + this.step * numSteps, this.min, this.max);\n    };\n    /** Calculate the new value from the new physical location. The value will always be snapped. */\n    MdSlider.prototype._updateValueFromPosition = function (pos) {\n        if (!this._sliderDimensions) {\n            return;\n        }\n        var offset = this.vertical ? this._sliderDimensions.top : this._sliderDimensions.left;\n        var size = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n        var posComponent = this.vertical ? pos.y : pos.x;\n        // The exact value is calculated from the event and used to find the closest snap value.\n        var percent = this._clamp((posComponent - offset) / size);\n        if (this.invertMouseCoords) {\n            percent = 1 - percent;\n        }\n        var exactValue = this._calculateValue(percent);\n        // This calculation finds the closest step by finding the closest whole number divisible by the\n        // step relative to the min.\n        var closestValue = Math.round((exactValue - this.min) / this.step) * this.step + this.min;\n        // The value needs to snap to the min and max.\n        this.value = this._clamp(closestValue, this.min, this.max);\n    };\n    /** Emits a change event if the current value is different from the last emitted value. */\n    MdSlider.prototype._emitValueIfChanged = function () {\n        if (this.value != this._lastEmittedValue) {\n            var event_1 = new MdSliderChange();\n            event_1.source = this;\n            event_1.value = this.value;\n            this._lastEmittedValue = this.value;\n            this._controlValueAccessorChangeFn(this.value);\n            this.change.emit(event_1);\n        }\n    };\n    /** Updates the amount of space between ticks as a percentage of the width of the slider. */\n    MdSlider.prototype._updateTickIntervalPercent = function () {\n        if (!this.tickInterval) {\n            return;\n        }\n        if (this.tickInterval == 'auto') {\n            var trackSize = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n            var pixelsPerStep = trackSize * this.step / (this.max - this.min);\n            var stepsPerTick = Math.ceil(MIN_AUTO_TICK_SEPARATION / pixelsPerStep);\n            var pixelsPerTick = stepsPerTick * this.step;\n            this._tickIntervalPercent = pixelsPerTick / trackSize;\n        }\n        else {\n            this._tickIntervalPercent = this.tickInterval * this.step / (this.max - this.min);\n        }\n    };\n    /** Calculates the percentage of the slider that a value is. */\n    MdSlider.prototype._calculatePercentage = function (value) {\n        return (value - this.min) / (this.max - this.min);\n    };\n    /** Calculates the value a percentage of the slider corresponds to. */\n    MdSlider.prototype._calculateValue = function (percentage) {\n        return this.min + percentage * (this.max - this.min);\n    };\n    /** Return a number between two numbers. */\n    MdSlider.prototype._clamp = function (value, min, max) {\n        if (min === void 0) { min = 0; }\n        if (max === void 0) { max = 1; }\n        return Math.max(min, Math.min(value, max));\n    };\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value\n     */\n    MdSlider.prototype.writeValue = function (value) {\n        this.value = value;\n    };\n    /**\n     * Registers a callback to eb triggered when the value has changed.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdSlider.prototype.registerOnChange = function (fn) {\n        this._controlValueAccessorChangeFn = fn;\n    };\n    /**\n     * Registers a callback to be triggered when the component is touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdSlider.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    /**\n     * Sets whether the component should be disabled.\n     * Implemented as part of ControlValueAccessor.\n     * @param isDisabled\n     */\n    MdSlider.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Boolean)\n    ], MdSlider.prototype, \"disabled\", null);\n    __decorate$33([\n        _angular_core.Input('thumbLabel'), \n        __metadata$33('design:type', Boolean)\n    ], MdSlider.prototype, \"thumbLabel\", null);\n    __decorate$33([\n        _angular_core.Input('thumb-label'), \n        __metadata$33('design:type', Boolean)\n    ], MdSlider.prototype, \"_thumbLabelDeprecated\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"step\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"tickInterval\", null);\n    __decorate$33([\n        _angular_core.Input('tick-interval'), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"_tickIntervalDeprecated\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"value\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"min\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"max\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"invert\", null);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"vertical\", null);\n    __decorate$33([\n        _angular_core.Output(), \n        __metadata$33('design:type', Object)\n    ], MdSlider.prototype, \"change\", void 0);\n    MdSlider = __decorate$33([\n        _angular_core.Component({selector: 'md-slider, mat-slider',\n            providers: [MD_SLIDER_VALUE_ACCESSOR],\n            host: {\n                '(blur)': '_onBlur()',\n                '(click)': '_onClick($event)',\n                '(keydown)': '_onKeydown($event)',\n                '(mouseenter)': '_onMouseenter()',\n                '(slide)': '_onSlide($event)',\n                '(slideend)': '_onSlideEnd()',\n                '(slidestart)': '_onSlideStart($event)',\n                'role': 'slider',\n                'tabindex': '0',\n                '[attr.aria-disabled]': 'disabled',\n                '[attr.aria-valuemax]': 'max',\n                '[attr.aria-valuemin]': 'min',\n                '[attr.aria-valuenow]': 'value',\n                '[class.md-slider-active]': '_isActive',\n                '[class.md-slider-disabled]': 'disabled',\n                '[class.md-slider-has-ticks]': 'tickInterval',\n                '[class.md-slider-horizontal]': '!vertical',\n                '[class.md-slider-axis-inverted]': 'invertAxis',\n                '[class.md-slider-sliding]': '_isSliding',\n                '[class.md-slider-thumb-label-showing]': 'thumbLabel',\n                '[class.md-slider-vertical]': 'vertical',\n            },\n            template: \"<div class=\\\"md-slider-track\\\"><div class=\\\"md-slider-track-fill\\\" [ngStyle]=\\\"trackFillStyles\\\"></div><div class=\\\"md-slider-ticks-container\\\" [ngStyle]=\\\"ticksContainerStyles\\\"><div class=\\\"md-slider-ticks\\\" [ngStyle]=\\\"ticksStyles\\\"></div></div><div class=\\\"md-slider-thumb-container\\\" [ngStyle]=\\\"thumbContainerStyles\\\"><div class=\\\"md-slider-thumb\\\"></div><div class=\\\"md-slider-thumb-label\\\"><span class=\\\"md-slider-thumb-label-text\\\">{{value}}</span></div></div></div>\",\n            styles: [\"md-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.md-slider-track{position:absolute}.md-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.md-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.md-slider-ticks{opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.md-slider-thumb,.md-slider-thumb-container{transition:transform .4s cubic-bezier(.25,.8,.25,1);position:absolute}.md-slider-thumb-container{z-index:1}.md-slider-thumb{right:-10px;bottom:-10px;width:20px;height:20px;border-radius:50%;transform:scale(.7)}.md-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:.3s cubic-bezier(.35,0,.25,1);transition-property:transform,border-radius}.md-slider-thumb-label-text{z-index:1;font-size:12px;font-weight:700;opacity:0;transition:opacity .3s cubic-bezier(.35,0,.25,1)}.md-slider-sliding .md-slider-thumb-container,.md-slider-sliding .md-slider-track-fill{transition-duration:0s}.md-slider-has-ticks .md-slider-track::after{content:'';position:absolute;border:0 solid rgba(0,0,0,.6);opacity:0;transition:opacity .3s cubic-bezier(.35,0,.25,1)}.md-slider-active .md-slider-thumb-label-text,.md-slider-has-ticks.md-slider-active .md-slider-ticks,.md-slider-has-ticks.md-slider-active .md-slider-track::after,.md-slider-has-ticks:hover .md-slider-ticks,.md-slider-has-ticks:hover .md-slider-track::after{opacity:1}.md-slider-thumb-label-showing .md-slider-thumb-label{display:flex}.md-slider-axis-inverted .md-slider-track-fill{transform-origin:100% 100%}.md-slider-active .md-slider-thumb{transform:scale(1)}.md-slider-active.md-slider-thumb-label-showing .md-slider-thumb{transform:scale(0)}.md-slider-active .md-slider-thumb-label{border-radius:50% 50% 0}.md-slider-horizontal{height:48px;min-width:128px}.md-slider-horizontal .md-slider-track{height:2px;top:23px;left:8px;right:8px}.md-slider-horizontal .md-slider-track::after{height:2px;border-left-width:2px;right:0}.md-slider-horizontal .md-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.md-slider-horizontal .md-slider-ticks-container{height:2px;width:100%}.md-slider-horizontal .md-slider-ticks{background:repeating-linear-gradient(to right,rgba(0,0,0,.6),rgba(0,0,0,.6) 2px,transparent 0,transparent);background:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.6),rgba(0,0,0,.6) 2px,transparent 0,transparent);height:2px;width:100%}.md-slider-horizontal .md-slider-thumb-container{width:100%;height:0;top:50%}.md-slider-horizontal .md-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.4) rotate(45deg)}.md-slider-horizontal .md-slider-thumb-label-text{transform:rotate(-45deg)}.md-slider-horizontal.md-slider-active .md-slider-thumb-label{transform:rotate(45deg)}.md-slider-vertical{width:48px;min-height:128px}.md-slider-vertical .md-slider-track{width:2px;top:8px;bottom:8px;left:23px}.md-slider-vertical .md-slider-track::after{width:2px;border-top-width:2px;bottom:0}.md-slider-vertical .md-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.md-slider-vertical .md-slider-ticks-container{width:2px;height:100%}.md-slider-vertical .md-slider-ticks{background:repeating-linear-gradient(to bottom,rgba(0,0,0,.6),rgba(0,0,0,.6) 2px,transparent 0,transparent);width:2px;height:100%}.md-slider-vertical .md-slider-thumb-container{height:100%;width:0;left:50%}.md-slider-vertical .md-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.4) rotate(-45deg)}.md-slider-vertical .md-slider-thumb-label-text{transform:rotate(45deg)}.md-slider-vertical.md-slider-active .md-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .md-slider-track::after{left:0;right:auto}[dir=rtl] .md-slider-horizontal .md-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .md-slider-horizontal.md-slider-axis-inverted .md-slider-track-fill{transform-origin:0 0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }),\n        __param$7(0, _angular_core.Optional()), \n        __metadata$33('design:paramtypes', [Dir, _angular_core.ElementRef])\n    ], MdSlider);\n    return MdSlider;\n}());\n/**\n * Renderer class in order to keep all dom manipulation in one place and outside of the main class.\n * @docs-private\n */\nvar SliderRenderer = (function () {\n    function SliderRenderer(elementRef) {\n        this._sliderElement = elementRef.nativeElement;\n    }\n    /**\n     * Get the bounding client rect of the slider track element.\n     * The track is used rather than the native element to ignore the extra space that the thumb can\n     * take up.\n     */\n    SliderRenderer.prototype.getSliderDimensions = function () {\n        var trackElement = this._sliderElement.querySelector('.md-slider-track');\n        return trackElement.getBoundingClientRect();\n    };\n    /**\n     * Focuses the native element.\n     * Currently only used to allow a blur event to fire but will be used with keyboard input later.\n     */\n    SliderRenderer.prototype.addFocus = function () {\n        this._sliderElement.focus();\n    };\n    return SliderRenderer;\n}());\nvar MdSliderModule = (function () {\n    function MdSliderModule() {\n    }\n    MdSliderModule.forRoot = function () {\n        return {\n            ngModule: MdSliderModule,\n            providers: [{ provide: _angular_platformBrowser.HAMMER_GESTURE_CONFIG, useClass: GestureConfig }]\n        };\n    };\n    MdSliderModule = __decorate$33([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdSlider, DefaultStyleCompatibilityModeModule],\n            declarations: [MdSlider],\n            providers: [\n                { provide: _angular_platformBrowser.HAMMER_GESTURE_CONFIG, useClass: GestureConfig },\n            ],\n        }), \n        __metadata$33('design:paramtypes', [])\n    ], MdSliderModule);\n    return MdSliderModule;\n}());\n\nvar __extends$7 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$34 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$34 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$8 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/** Exception thrown when two MdSidenav are matching the same side. */\nvar MdDuplicatedSidenavError = (function (_super) {\n    __extends$7(MdDuplicatedSidenavError, _super);\n    function MdDuplicatedSidenavError(align) {\n        _super.call(this, \"A sidenav was already declared for 'align=\\\"\" + align + \"\\\"'\");\n    }\n    return MdDuplicatedSidenavError;\n}(MdError));\n/** Sidenav toggle promise result. */\nvar MdSidenavToggleResult = (function () {\n    function MdSidenavToggleResult(type, animationFinished) {\n        this.type = type;\n        this.animationFinished = animationFinished;\n    }\n    return MdSidenavToggleResult;\n}());\n/**\n * <md-sidenav> component.\n *\n * This component corresponds to the drawer of the sidenav.\n *\n * Please refer to README.md for examples on how to use it.\n */\nvar MdSidenav = (function () {\n    /**\n     * @param _elementRef The DOM element reference. Used for transition and width calculation.\n     *     If not available we do not hook on transitions.\n     */\n    function MdSidenav(_elementRef, _renderer) {\n        var _this = this;\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        /** Alignment of the sidenav (direction neutral); whether 'start' or 'end'. */\n        this._align = 'start';\n        this._valid = true;\n        /** Mode of the sidenav; whether 'over' or 'side'. */\n        this.mode = 'over';\n        /** Whether the sidenav is opened. */\n        this._opened = false;\n        /** Event emitted when the sidenav is being opened. Use this to synchronize animations. */\n        this.onOpenStart = new _angular_core.EventEmitter();\n        /** Event emitted when the sidenav is fully opened. */\n        this.onOpen = new _angular_core.EventEmitter();\n        /** Event emitted when the sidenav is being closed. Use this to synchronize animations. */\n        this.onCloseStart = new _angular_core.EventEmitter();\n        /** Event emitted when the sidenav is fully closed. */\n        this.onClose = new _angular_core.EventEmitter();\n        /** Event emitted when the sidenav alignment changes. */\n        this.onAlignChanged = new _angular_core.EventEmitter();\n        /** The current toggle animation promise. `null` if no animation is in progress. */\n        this._toggleAnimationPromise = null;\n        /**\n         * The current toggle animation promise resolution function.\n         * `null` if no animation is in progress.\n         */\n        this._resolveToggleAnimationPromise = null;\n        this._elementFocusedBeforeSidenavWasOpened = null;\n        this.onOpen.subscribe(function () {\n            _this._elementFocusedBeforeSidenavWasOpened = document.activeElement;\n            if (!_this.isFocusTrapDisabled) {\n                _this._focusTrap.focusFirstTabbableElementWhenReady();\n            }\n        });\n        this.onClose.subscribe(function () {\n            if (_this._elementFocusedBeforeSidenavWasOpened instanceof HTMLElement) {\n                _this._renderer.invokeElementMethod(_this._elementFocusedBeforeSidenavWasOpened, 'focus');\n            }\n            else {\n                _this._renderer.invokeElementMethod(_this._elementRef.nativeElement, 'blur');\n            }\n            _this._elementFocusedBeforeSidenavWasOpened = null;\n        });\n    }\n    Object.defineProperty(MdSidenav.prototype, \"valid\", {\n        /** Whether this md-sidenav is part of a valid md-sidenav-container configuration. */\n        get: function () { return this._valid; },\n        set: function (value) {\n            value = coerceBooleanProperty(value);\n            // When the drawers are not in a valid configuration we close them all until they are in a valid\n            // configuration again.\n            if (!value) {\n                this.close();\n            }\n            this._valid = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"align\", {\n        /** Direction which the sidenav is aligned in. */\n        get: function () { return this._align; },\n        set: function (value) {\n            // Make sure we have a valid value.\n            value = (value == 'end') ? 'end' : 'start';\n            if (value != this._align) {\n                this._align = value;\n                this.onAlignChanged.emit();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"isFocusTrapDisabled\", {\n        get: function () {\n            // The focus trap is only enabled when the sidenav is open in any mode other than side.\n            return !this.opened || this.mode == 'side';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdSidenav.prototype.ngAfterContentInit = function () {\n        // This can happen when the sidenav is set to opened in the template and the transition\n        // isn't ended.\n        if (this._toggleAnimationPromise) {\n            this._resolveToggleAnimationPromise(true);\n            this._toggleAnimationPromise = this._resolveToggleAnimationPromise = null;\n        }\n    };\n    Object.defineProperty(MdSidenav.prototype, \"opened\", {\n        /**\n         * Whether the sidenav is opened. We overload this because we trigger an event when it\n         * starts or end.\n         */\n        get: function () { return this._opened; },\n        set: function (v) {\n            this.toggle(coerceBooleanProperty(v));\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Open this sidenav, and return a Promise that will resolve when it's fully opened (or get\n     * rejected if it didn't). */\n    MdSidenav.prototype.open = function () {\n        return this.toggle(true);\n    };\n    /**\n     * Close this sidenav, and return a Promise that will resolve when it's fully closed (or get\n     * rejected if it didn't).\n     */\n    MdSidenav.prototype.close = function () {\n        return this.toggle(false);\n    };\n    /**\n     * Toggle this sidenav. This is equivalent to calling open() when it's already opened, or\n     * close() when it's closed.\n     * @param isOpen Whether the sidenav should be open.\n     * @returns Resolves with the result of whether the sidenav was opened or closed.\n     */\n    MdSidenav.prototype.toggle = function (isOpen) {\n        var _this = this;\n        if (isOpen === void 0) { isOpen = !this.opened; }\n        if (!this.valid) {\n            return Promise.resolve(new MdSidenavToggleResult(isOpen ? 'open' : 'close', true));\n        }\n        // Shortcut it if we're already opened.\n        if (isOpen === this.opened) {\n            return this._toggleAnimationPromise ||\n                Promise.resolve(new MdSidenavToggleResult(isOpen ? 'open' : 'close', true));\n        }\n        this._opened = isOpen;\n        if (isOpen) {\n            this.onOpenStart.emit();\n        }\n        else {\n            this.onCloseStart.emit();\n        }\n        if (this._toggleAnimationPromise) {\n            this._resolveToggleAnimationPromise(false);\n        }\n        this._toggleAnimationPromise = new Promise(function (resolve) {\n            _this._resolveToggleAnimationPromise = function (animationFinished) {\n                return resolve(new MdSidenavToggleResult(isOpen ? 'open' : 'close', animationFinished));\n            };\n        });\n        return this._toggleAnimationPromise;\n    };\n    /**\n     * Handles the keyboard events.\n     * @docs-private\n     */\n    MdSidenav.prototype.handleKeydown = function (event) {\n        if (event.keyCode === ESCAPE) {\n            this.close();\n            event.stopPropagation();\n        }\n    };\n    /**\n     * When transition has finished, set the internal state for classes and emit the proper event.\n     * The event passed is actually of type TransitionEvent, but that type is not available in\n     * Android so we use any.\n     */\n    MdSidenav.prototype._onTransitionEnd = function (transitionEvent) {\n        if (transitionEvent.target == this._elementRef.nativeElement\n            && transitionEvent.propertyName.endsWith('transform')) {\n            if (this._opened) {\n                this.onOpen.emit();\n            }\n            else {\n                this.onClose.emit();\n            }\n            if (this._toggleAnimationPromise) {\n                this._resolveToggleAnimationPromise(true);\n                this._toggleAnimationPromise = this._resolveToggleAnimationPromise = null;\n            }\n        }\n    };\n    Object.defineProperty(MdSidenav.prototype, \"_isClosing\", {\n        get: function () {\n            return !this._opened && !!this._toggleAnimationPromise;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_isOpening\", {\n        get: function () {\n            return this._opened && !!this._toggleAnimationPromise;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_isClosed\", {\n        get: function () {\n            return !this._opened && !this._toggleAnimationPromise;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_isOpened\", {\n        get: function () {\n            return this._opened && !this._toggleAnimationPromise;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_isEnd\", {\n        get: function () {\n            return this.align == 'end';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_modeSide\", {\n        get: function () {\n            return this.mode == 'side';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_modeOver\", {\n        get: function () {\n            return this.mode == 'over';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_modePush\", {\n        get: function () {\n            return this.mode == 'push';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenav.prototype, \"_width\", {\n        get: function () {\n            if (this._elementRef.nativeElement) {\n                return this._elementRef.nativeElement.offsetWidth;\n            }\n            return 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$34([\n        _angular_core.ViewChild(FocusTrap), \n        __metadata$34('design:type', FocusTrap)\n    ], MdSidenav.prototype, \"_focusTrap\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"align\", null);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"mode\", void 0);\n    __decorate$34([\n        _angular_core.Output('open-start'), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"onOpenStart\", void 0);\n    __decorate$34([\n        _angular_core.Output('open'), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"onOpen\", void 0);\n    __decorate$34([\n        _angular_core.Output('close-start'), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"onCloseStart\", void 0);\n    __decorate$34([\n        _angular_core.Output('close'), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"onClose\", void 0);\n    __decorate$34([\n        _angular_core.Output('align-changed'), \n        __metadata$34('design:type', Object)\n    ], MdSidenav.prototype, \"onAlignChanged\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Boolean)\n    ], MdSidenav.prototype, \"opened\", null);\n    MdSidenav = __decorate$34([\n        _angular_core.Component({selector: 'md-sidenav, mat-sidenav',\n            // TODO(mmalerba): move template to separate file.\n            template: \"<cdk-focus-trap class=\\\"md-sidenav-focus-trap\\\" [disabled]=\\\"isFocusTrapDisabled\\\"><ng-content></ng-content></cdk-focus-trap>\",\n            host: {\n                '(transitionend)': '_onTransitionEnd($event)',\n                '(keydown)': 'handleKeydown($event)',\n                // must prevent the browser from aligning text based on value\n                '[attr.align]': 'null',\n                '[class.md-sidenav-closed]': '_isClosed',\n                '[class.md-sidenav-closing]': '_isClosing',\n                '[class.md-sidenav-end]': '_isEnd',\n                '[class.md-sidenav-opened]': '_isOpened',\n                '[class.md-sidenav-opening]': '_isOpening',\n                '[class.md-sidenav-over]': '_modeOver',\n                '[class.md-sidenav-push]': '_modePush',\n                '[class.md-sidenav-side]': '_modeSide',\n                '[class.md-sidenav-invalid]': '!valid',\n                'tabIndex': '-1'\n            },\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$34('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdSidenav);\n    return MdSidenav;\n}());\n/**\n * <md-sidenav-container> component.\n *\n * This is the parent component to one or two <md-sidenav>s that validates the state internally\n * and coordinates the backdrop and content styling.\n */\nvar MdSidenavContainer = (function () {\n    function MdSidenavContainer(_dir, _element, _renderer) {\n        var _this = this;\n        this._dir = _dir;\n        this._element = _element;\n        this._renderer = _renderer;\n        /** Event emitted when the sidenav backdrop is clicked. */\n        this.onBackdropClicked = new _angular_core.EventEmitter();\n        // If a `Dir` directive exists up the tree, listen direction changes and update the left/right\n        // properties to point to the proper start/end.\n        if (_dir != null) {\n            _dir.dirChange.subscribe(function () { return _this._validateDrawers(); });\n        }\n    }\n    Object.defineProperty(MdSidenavContainer.prototype, \"start\", {\n        /** The sidenav child with the `start` alignment. */\n        get: function () { return this._start; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdSidenavContainer.prototype, \"end\", {\n        /** The sidenav child with the `end` alignment. */\n        get: function () { return this._end; },\n        enumerable: true,\n        configurable: true\n    });\n    MdSidenavContainer.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        // On changes, assert on consistency.\n        this._sidenavs.changes.subscribe(function () { return _this._validateDrawers(); });\n        this._sidenavs.forEach(function (sidenav) {\n            _this._watchSidenavToggle(sidenav);\n            _this._watchSidenavAlign(sidenav);\n        });\n        this._validateDrawers();\n    };\n    /**\n     * Subscribes to sidenav events in order to set a class on the main container element when the\n     * sidenav is open and the backdrop is visible. This ensures any overflow on the container element\n     * is properly hidden.\n     */\n    MdSidenavContainer.prototype._watchSidenavToggle = function (sidenav) {\n        var _this = this;\n        if (!sidenav || sidenav.mode === 'side') {\n            return;\n        }\n        sidenav.onOpen.subscribe(function () { return _this._setContainerClass(sidenav, true); });\n        sidenav.onClose.subscribe(function () { return _this._setContainerClass(sidenav, false); });\n    };\n    /**\n     * Subscribes to sidenav onAlignChanged event in order to re-validate drawers when the align\n     * changes.\n     */\n    MdSidenavContainer.prototype._watchSidenavAlign = function (sidenav) {\n        var _this = this;\n        if (!sidenav) {\n            return;\n        }\n        sidenav.onAlignChanged.subscribe(function () { return _this._validateDrawers(); });\n    };\n    /** Toggles the 'md-sidenav-opened' class on the main 'md-sidenav-container' element. */\n    MdSidenavContainer.prototype._setContainerClass = function (sidenav, bool) {\n        this._renderer.setElementClass(this._element.nativeElement, 'md-sidenav-opened', bool);\n    };\n    /** Sets the valid state of the drawers. */\n    MdSidenavContainer.prototype._setDrawersValid = function (valid) {\n        this._sidenavs.forEach(function (sidenav) {\n            sidenav.valid = valid;\n        });\n        if (!valid) {\n            this._start = this._end = this._left = this._right = null;\n        }\n    };\n    /** Validate the state of the sidenav children components. */\n    MdSidenavContainer.prototype._validateDrawers = function () {\n        this._start = this._end = null;\n        // Ensure that we have at most one start and one end sidenav.\n        // NOTE: We must call toArray on _sidenavs even though it's iterable\n        // (see https://github.com/Microsoft/TypeScript/issues/3164).\n        for (var _i = 0, _a = this._sidenavs.toArray(); _i < _a.length; _i++) {\n            var sidenav = _a[_i];\n            if (sidenav.align == 'end') {\n                if (this._end != null) {\n                    this._setDrawersValid(false);\n                    return;\n                }\n                this._end = sidenav;\n            }\n            else {\n                if (this._start != null) {\n                    this._setDrawersValid(false);\n                    return;\n                }\n                this._start = sidenav;\n            }\n        }\n        this._right = this._left = null;\n        // Detect if we're LTR or RTL.\n        if (this._dir == null || this._dir.value == 'ltr') {\n            this._left = this._start;\n            this._right = this._end;\n        }\n        else {\n            this._left = this._end;\n            this._right = this._start;\n        }\n        this._setDrawersValid(true);\n    };\n    MdSidenavContainer.prototype._onBackdropClicked = function () {\n        this.onBackdropClicked.emit();\n        this._closeModalSidenav();\n    };\n    MdSidenavContainer.prototype._closeModalSidenav = function () {\n        if (this._start != null && this._start.mode != 'side') {\n            this._start.close();\n        }\n        if (this._end != null && this._end.mode != 'side') {\n            this._end.close();\n        }\n    };\n    MdSidenavContainer.prototype._isShowingBackdrop = function () {\n        return (this._isSidenavOpen(this._start) && this._start.mode != 'side')\n            || (this._isSidenavOpen(this._end) && this._end.mode != 'side');\n    };\n    MdSidenavContainer.prototype._isSidenavOpen = function (side) {\n        return side != null && side.opened;\n    };\n    /**\n     * Return the width of the sidenav, if it's in the proper mode and opened.\n     * This may relayout the view, so do not call this often.\n     * @param sidenav\n     * @param mode\n     */\n    MdSidenavContainer.prototype._getSidenavEffectiveWidth = function (sidenav, mode) {\n        return (this._isSidenavOpen(sidenav) && sidenav.mode == mode) ? sidenav._width : 0;\n    };\n    MdSidenavContainer.prototype._getMarginLeft = function () {\n        return this._getSidenavEffectiveWidth(this._left, 'side');\n    };\n    MdSidenavContainer.prototype._getMarginRight = function () {\n        return this._getSidenavEffectiveWidth(this._right, 'side');\n    };\n    MdSidenavContainer.prototype._getPositionLeft = function () {\n        return this._getSidenavEffectiveWidth(this._left, 'push');\n    };\n    MdSidenavContainer.prototype._getPositionRight = function () {\n        return this._getSidenavEffectiveWidth(this._right, 'push');\n    };\n    /**\n     * Returns the horizontal offset for the content area.  There should never be a value for both\n     * left and right, so by subtracting the right value from the left value, we should always get\n     * the appropriate offset.\n     */\n    MdSidenavContainer.prototype._getPositionOffset = function () {\n        return this._getPositionLeft() - this._getPositionRight();\n    };\n    /**\n     * This is using [ngStyle] rather than separate [style...] properties because [style.transform]\n     * doesn't seem to work right now.\n     */\n    MdSidenavContainer.prototype._getStyles = function () {\n        return {\n            marginLeft: this._getMarginLeft() + \"px\",\n            marginRight: this._getMarginRight() + \"px\",\n            transform: \"translate3d(\" + this._getPositionOffset() + \"px, 0, 0)\"\n        };\n    };\n    __decorate$34([\n        _angular_core.ContentChildren(MdSidenav), \n        __metadata$34('design:type', _angular_core.QueryList)\n    ], MdSidenavContainer.prototype, \"_sidenavs\", void 0);\n    __decorate$34([\n        _angular_core.Output('backdrop-clicked'), \n        __metadata$34('design:type', Object)\n    ], MdSidenavContainer.prototype, \"onBackdropClicked\", void 0);\n    MdSidenavContainer = __decorate$34([\n        _angular_core.Component({selector: 'md-sidenav-container, mat-sidenav-container, md-sidenav-layout, mat-sidenav-layout',\n            // Do not use ChangeDetectionStrategy.OnPush. It does not work for this component because\n            // technically it is a sibling of MdSidenav (on the content tree) and isn't updated when MdSidenav\n            // changes its state.\n            template: \"<div class=\\\"md-sidenav-backdrop\\\" (click)=\\\"_onBackdropClicked()\\\" [class.md-sidenav-shown]=\\\"_isShowingBackdrop()\\\"></div><ng-content select=\\\"md-sidenav, mat-sidenav\\\"></ng-content><div class=\\\"md-sidenav-content\\\" [ngStyle]=\\\"_getStyles()\\\"><ng-content></ng-content></div>\",\n            styles: [\".md-sidenav-container,.md-sidenav-content{transform:translate3d(0,0,0);display:block}.md-sidenav-container{position:relative;box-sizing:border-box;-webkit-overflow-scrolling:touch;overflow:hidden}.md-sidenav-backdrop,.md-sidenav-container[fullscreen]{position:absolute;top:0;bottom:0;right:0;left:0}.md-sidenav-container[fullscreen].md-sidenav-opened{overflow:hidden}.md-sidenav-backdrop{display:block;z-index:2;visibility:hidden}.md-sidenav-backdrop.md-sidenav-shown{visibility:visible}@media screen and (-ms-high-contrast:active){.md-sidenav-backdrop{opacity:.5}}.md-sidenav-content{position:relative;height:100%;overflow:auto}md-sidenav,md-sidenav.md-sidenav-closing{transform:translate3d(-100%,0,0)}md-sidenav{display:block;position:absolute;top:0;bottom:0;z-index:3;min-width:5%;outline:0}md-sidenav.md-sidenav-closed{visibility:hidden}md-sidenav.md-sidenav-opened,md-sidenav.md-sidenav-opening{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);transform:translate3d(0,0,0)}md-sidenav.md-sidenav-opening{visibility:visible}md-sidenav.md-sidenav-end,md-sidenav.md-sidenav-end.md-sidenav-closing{transform:translate3d(100%,0,0)}md-sidenav.md-sidenav-side{z-index:1}md-sidenav.md-sidenav-end{right:0}md-sidenav.md-sidenav-end.md-sidenav-closed{visibility:hidden}md-sidenav.md-sidenav-end.md-sidenav-opened,md-sidenav.md-sidenav-end.md-sidenav-opening{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);transform:translate3d(0,0,0)}md-sidenav.md-sidenav-end.md-sidenav-opening{visibility:visible}[dir=rtl] md-sidenav,[dir=rtl] md-sidenav.md-sidenav-closing{transform:translate3d(100%,0,0)}[dir=rtl] md-sidenav.md-sidenav-closed{visibility:hidden}[dir=rtl] md-sidenav.md-sidenav-opened,[dir=rtl] md-sidenav.md-sidenav-opening{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);transform:translate3d(0,0,0)}[dir=rtl] md-sidenav.md-sidenav-opening{visibility:visible}[dir=rtl] md-sidenav.md-sidenav-end{left:0;right:auto;transform:translate3d(-100%,0,0)}[dir=rtl] md-sidenav.md-sidenav-end.md-sidenav-closed{visibility:hidden}[dir=rtl] md-sidenav.md-sidenav-end.md-sidenav-closing{transform:translate3d(-100%,0,0)}[dir=rtl] md-sidenav.md-sidenav-end.md-sidenav-opened,[dir=rtl] md-sidenav.md-sidenav-end.md-sidenav-opening{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);transform:translate3d(0,0,0)}[dir=rtl] md-sidenav.md-sidenav-end.md-sidenav-opening{visibility:visible}.md-sidenav-focus-trap{height:100%}.md-sidenav-focus-trap>.cdk-focus-trap-content{box-sizing:border-box;height:100%;overflow-y:auto;transform:translateZ(0)}.md-sidenav-invalid{display:none}\",\n\".md-sidenav-content,md-sidenav{transition:transform .4s cubic-bezier(.25,.8,.25,1)}.md-sidenav-backdrop.md-sidenav-shown{transition:background-color .4s cubic-bezier(.25,.8,.25,1)}\"],\n            host: {\n                'class': 'md-sidenav-container',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }),\n        __param$8(0, _angular_core.Optional()), \n        __metadata$34('design:paramtypes', [Dir, _angular_core.ElementRef, _angular_core.Renderer])\n    ], MdSidenavContainer);\n    return MdSidenavContainer;\n}());\nvar MdSidenavModule = (function () {\n    function MdSidenavModule() {\n    }\n    MdSidenavModule.forRoot = function () {\n        return {\n            ngModule: MdSidenavModule,\n            providers: [InteractivityChecker]\n        };\n    };\n    MdSidenavModule = __decorate$34([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, DefaultStyleCompatibilityModeModule, A11yModule, OverlayModule],\n            exports: [MdSidenavContainer, MdSidenav, DefaultStyleCompatibilityModeModule],\n            declarations: [MdSidenavContainer, MdSidenav],\n        }), \n        __metadata$34('design:paramtypes', [])\n    ], MdSidenavModule);\n    return MdSidenavModule;\n}());\n\nvar __decorate$35 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$35 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdListDivider = (function () {\n    function MdListDivider() {\n    }\n    MdListDivider = __decorate$35([\n        _angular_core.Directive({\n            selector: 'md-divider, mat-divider'\n        }), \n        __metadata$35('design:paramtypes', [])\n    ], MdListDivider);\n    return MdListDivider;\n}());\nvar MdList = (function () {\n    function MdList() {\n    }\n    MdList = __decorate$35([\n        _angular_core.Component({selector: 'md-list, mat-list, md-nav-list, mat-nav-list',\n            host: { 'role': 'list' },\n            template: '<ng-content></ng-content>',\n            styles: [\"md-list,md-nav-list{padding-top:8px;display:block}md-list [md-subheader],md-nav-list [md-subheader]{display:block;box-sizing:border-box;height:48px;padding:16px;margin:0;font-size:14px;font-weight:500}md-list [md-subheader]:first-child,md-nav-list [md-subheader]:first-child{margin-top:-8px}md-list a[md-list-item],md-list md-list-item,md-nav-list a[md-list-item],md-nav-list md-list-item{display:block}md-list a[md-list-item] .md-list-item,md-list md-list-item .md-list-item,md-nav-list a[md-list-item] .md-list-item,md-nav-list md-list-item .md-list-item{display:flex;flex-direction:row;align-items:center;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;box-sizing:border-box;font-size:16px;height:48px;padding:0 16px}md-list a[md-list-item].md-list-avatar .md-list-item,md-list md-list-item.md-list-avatar .md-list-item,md-nav-list a[md-list-item].md-list-avatar .md-list-item,md-nav-list md-list-item.md-list-avatar .md-list-item{height:56px}md-list a[md-list-item].md-2-line .md-list-item,md-list md-list-item.md-2-line .md-list-item,md-nav-list a[md-list-item].md-2-line .md-list-item,md-nav-list md-list-item.md-2-line .md-list-item{height:72px}md-list a[md-list-item].md-3-line .md-list-item,md-list md-list-item.md-3-line .md-list-item,md-nav-list a[md-list-item].md-3-line .md-list-item,md-nav-list md-list-item.md-3-line .md-list-item{height:88px}md-list a[md-list-item].md-multi-line .md-list-item,md-list md-list-item.md-multi-line .md-list-item,md-nav-list a[md-list-item].md-multi-line .md-list-item,md-nav-list md-list-item.md-multi-line .md-list-item{height:100%;padding:8px 16px}md-list a[md-list-item] .md-list-text,md-list md-list-item .md-list-text,md-nav-list a[md-list-item] .md-list-text,md-nav-list md-list-item .md-list-text{display:flex;flex-direction:column;width:100%;box-sizing:border-box;overflow:hidden;padding:0 16px}md-list a[md-list-item] .md-list-text>*,md-list md-list-item .md-list-text>*,md-nav-list a[md-list-item] .md-list-text>*,md-nav-list md-list-item .md-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}md-list a[md-list-item] .md-list-text:empty,md-list md-list-item .md-list-text:empty,md-nav-list a[md-list-item] .md-list-text:empty,md-nav-list md-list-item .md-list-text:empty{display:none}md-list a[md-list-item] .md-list-text:first-child,md-list md-list-item .md-list-text:first-child,md-nav-list a[md-list-item] .md-list-text:first-child,md-nav-list md-list-item .md-list-text:first-child{padding:0}md-list a[md-list-item] [md-list-avatar],md-list md-list-item [md-list-avatar],md-nav-list a[md-list-item] [md-list-avatar],md-nav-list md-list-item [md-list-avatar]{flex-shrink:0;width:40px;height:40px;border-radius:50%}md-list a[md-list-item] [md-list-icon],md-list md-list-item [md-list-icon],md-nav-list a[md-list-item] [md-list-icon],md-nav-list md-list-item [md-list-icon]{width:24px;height:24px;border-radius:50%;padding:4px}md-list a[md-list-item] [md-line],md-list md-list-item [md-line],md-nav-list a[md-list-item] [md-line],md-nav-list md-list-item [md-line]{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}md-list a[md-list-item] [md-line]:nth-child(n+2),md-list md-list-item [md-line]:nth-child(n+2),md-nav-list a[md-list-item] [md-line]:nth-child(n+2),md-nav-list md-list-item [md-line]:nth-child(n+2){font-size:14px}md-list[dense],md-nav-list[dense]{padding-top:4px;display:block}md-list[dense] [md-subheader],md-nav-list[dense] [md-subheader]{display:block;box-sizing:border-box;height:40px;padding:16px;margin:0;font-size:13px;font-weight:500}md-list[dense] [md-subheader]:first-child,md-nav-list[dense] [md-subheader]:first-child{margin-top:-4px}md-list[dense] a[md-list-item],md-list[dense] md-list-item,md-nav-list[dense] a[md-list-item],md-nav-list[dense] md-list-item{display:block}md-list[dense] a[md-list-item] .md-list-item,md-list[dense] md-list-item .md-list-item,md-nav-list[dense] a[md-list-item] .md-list-item,md-nav-list[dense] md-list-item .md-list-item{display:flex;flex-direction:row;align-items:center;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;box-sizing:border-box;font-size:13px;height:40px;padding:0 16px}md-list[dense] a[md-list-item].md-list-avatar .md-list-item,md-list[dense] md-list-item.md-list-avatar .md-list-item,md-nav-list[dense] a[md-list-item].md-list-avatar .md-list-item,md-nav-list[dense] md-list-item.md-list-avatar .md-list-item{height:48px}md-list[dense] a[md-list-item].md-2-line .md-list-item,md-list[dense] md-list-item.md-2-line .md-list-item,md-nav-list[dense] a[md-list-item].md-2-line .md-list-item,md-nav-list[dense] md-list-item.md-2-line .md-list-item{height:60px}md-list[dense] a[md-list-item].md-3-line .md-list-item,md-list[dense] md-list-item.md-3-line .md-list-item,md-nav-list[dense] a[md-list-item].md-3-line .md-list-item,md-nav-list[dense] md-list-item.md-3-line .md-list-item{height:76px}md-list[dense] a[md-list-item].md-multi-line .md-list-item,md-list[dense] md-list-item.md-multi-line .md-list-item,md-nav-list[dense] a[md-list-item].md-multi-line .md-list-item,md-nav-list[dense] md-list-item.md-multi-line .md-list-item{height:100%;padding:8px 16px}md-list[dense] a[md-list-item] .md-list-text,md-list[dense] md-list-item .md-list-text,md-nav-list[dense] a[md-list-item] .md-list-text,md-nav-list[dense] md-list-item .md-list-text{display:flex;flex-direction:column;width:100%;box-sizing:border-box;overflow:hidden;padding:0 16px}md-list[dense] a[md-list-item] .md-list-text>*,md-list[dense] md-list-item .md-list-text>*,md-nav-list[dense] a[md-list-item] .md-list-text>*,md-nav-list[dense] md-list-item .md-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}md-list[dense] a[md-list-item] .md-list-text:empty,md-list[dense] md-list-item .md-list-text:empty,md-nav-list[dense] a[md-list-item] .md-list-text:empty,md-nav-list[dense] md-list-item .md-list-text:empty{display:none}md-list[dense] a[md-list-item] .md-list-text:first-child,md-list[dense] md-list-item .md-list-text:first-child,md-nav-list[dense] a[md-list-item] .md-list-text:first-child,md-nav-list[dense] md-list-item .md-list-text:first-child{padding:0}md-list[dense] a[md-list-item] [md-list-avatar],md-list[dense] md-list-item [md-list-avatar],md-nav-list[dense] a[md-list-item] [md-list-avatar],md-nav-list[dense] md-list-item [md-list-avatar]{flex-shrink:0;width:40px;height:40px;border-radius:50%}md-list[dense] a[md-list-item] [md-list-icon],md-list[dense] md-list-item [md-list-icon],md-nav-list[dense] a[md-list-item] [md-list-icon],md-nav-list[dense] md-list-item [md-list-icon]{width:24px;height:24px;border-radius:50%;padding:4px}md-list[dense] a[md-list-item] [md-line],md-list[dense] md-list-item [md-line],md-nav-list[dense] a[md-list-item] [md-line],md-nav-list[dense] md-list-item [md-line]{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}md-list[dense] a[md-list-item] [md-line]:nth-child(n+2),md-list[dense] md-list-item [md-line]:nth-child(n+2),md-nav-list[dense] a[md-list-item] [md-line]:nth-child(n+2),md-nav-list[dense] md-list-item [md-line]:nth-child(n+2){font-size:13px}md-divider{display:block;border-top-style:solid;border-top-width:1px;margin:0}md-nav-list a{text-decoration:none;color:inherit}md-nav-list .md-list-item{cursor:pointer}md-nav-list .md-list-item.md-list-item-focus,md-nav-list .md-list-item:hover{outline:0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$35('design:paramtypes', [])\n    ], MdList);\n    return MdList;\n}());\n/* Need directive for a ContentChild query in list-item */\nvar MdListAvatar = (function () {\n    function MdListAvatar() {\n    }\n    MdListAvatar = __decorate$35([\n        _angular_core.Directive({ selector: '[md-list-avatar], [mat-list-avatar]' }), \n        __metadata$35('design:paramtypes', [])\n    ], MdListAvatar);\n    return MdListAvatar;\n}());\nvar MdListItem = (function () {\n    function MdListItem(_renderer, _element) {\n        this._renderer = _renderer;\n        this._element = _element;\n        this._hasFocus = false;\n    }\n    Object.defineProperty(MdListItem.prototype, \"_hasAvatar\", {\n        set: function (avatar) {\n            this._renderer.setElementClass(this._element.nativeElement, 'md-list-avatar', avatar != null);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdListItem.prototype.ngAfterContentInit = function () {\n        this._lineSetter = new MdLineSetter(this._lines, this._renderer, this._element);\n    };\n    MdListItem.prototype._handleFocus = function () {\n        this._hasFocus = true;\n    };\n    MdListItem.prototype._handleBlur = function () {\n        this._hasFocus = false;\n    };\n    __decorate$35([\n        _angular_core.ContentChildren(MdLine), \n        __metadata$35('design:type', _angular_core.QueryList)\n    ], MdListItem.prototype, \"_lines\", void 0);\n    __decorate$35([\n        _angular_core.ContentChild(MdListAvatar), \n        __metadata$35('design:type', MdListAvatar), \n        __metadata$35('design:paramtypes', [MdListAvatar])\n    ], MdListItem.prototype, \"_hasAvatar\", null);\n    MdListItem = __decorate$35([\n        _angular_core.Component({selector: 'md-list-item, mat-list-item, a[md-list-item], a[mat-list-item]',\n            host: {\n                'role': 'listitem',\n                '(focus)': '_handleFocus()',\n                '(blur)': '_handleBlur()',\n            },\n            template: \"<div class=\\\"md-list-item\\\" [class.md-list-item-focus]=\\\"_hasFocus\\\"><ng-content select=\\\"[md-list-avatar],[md-list-icon], [mat-list-avatar], [mat-list-icon]\\\"></ng-content><div class=\\\"md-list-text\\\"><ng-content select=\\\"[md-line], [mat-line]\\\"></ng-content></div><ng-content></ng-content></div>\",\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$35('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdListItem);\n    return MdListItem;\n}());\nvar MdListModule = (function () {\n    function MdListModule() {\n    }\n    MdListModule.forRoot = function () {\n        return {\n            ngModule: MdListModule,\n            providers: []\n        };\n    };\n    MdListModule = __decorate$35([\n        _angular_core.NgModule({\n            imports: [MdLineModule, DefaultStyleCompatibilityModeModule],\n            exports: [\n                MdList,\n                MdListItem,\n                MdListDivider,\n                MdListAvatar,\n                MdLineModule,\n                DefaultStyleCompatibilityModeModule,\n            ],\n            declarations: [MdList, MdListItem, MdListDivider, MdListAvatar],\n        }), \n        __metadata$35('design:paramtypes', [])\n    ], MdListModule);\n    return MdListModule;\n}());\n\n/**\n * Converts values into strings. Falsy values become empty strings.\n * @docs-private\n */\nfunction coerceToString(value) {\n    return \"\" + (value || '');\n}\n/**\n * Converts a value that might be a string into a number.\n * @docs-private\n */\nfunction coerceToNumber(value) {\n    return typeof value === 'string' ? parseInt(value, 10) : value;\n}\n\nvar __decorate$37 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$37 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdGridTile = (function () {\n    function MdGridTile(_renderer, _element) {\n        this._renderer = _renderer;\n        this._element = _element;\n        this._rowspan = 1;\n        this._colspan = 1;\n    }\n    Object.defineProperty(MdGridTile.prototype, \"rowspan\", {\n        /** Amount of rows that the grid tile takes up. */\n        get: function () { return this._rowspan; },\n        set: function (value) { this._rowspan = coerceToNumber(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdGridTile.prototype, \"colspan\", {\n        /** Amount of columns that the grid tile takes up. */\n        get: function () { return this._colspan; },\n        set: function (value) { this._colspan = coerceToNumber(value); },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets the style of the grid-tile element.  Needs to be set manually to avoid\n     * \"Changed after checked\" errors that would occur with HostBinding.\n     */\n    MdGridTile.prototype._setStyle = function (property, value) {\n        this._renderer.setElementStyle(this._element.nativeElement, property, value);\n    };\n    __decorate$37([\n        _angular_core.Input(), \n        __metadata$37('design:type', Object)\n    ], MdGridTile.prototype, \"rowspan\", null);\n    __decorate$37([\n        _angular_core.Input(), \n        __metadata$37('design:type', Object)\n    ], MdGridTile.prototype, \"colspan\", null);\n    MdGridTile = __decorate$37([\n        _angular_core.Component({selector: 'md-grid-tile, mat-grid-tile',\n            host: { 'role': 'listitem' },\n            template: \"<figure><ng-content></ng-content></figure>\",\n            styles: [\"md-grid-list{display:block;position:relative}md-grid-tile{display:block;position:absolute;overflow:hidden}md-grid-tile figure{display:flex;position:absolute;align-items:center;justify-content:center;height:100%;top:0;right:0;bottom:0;left:0;padding:0;margin:0}md-grid-tile md-grid-tile-footer,md-grid-tile md-grid-tile-header{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;font-size:16px;position:absolute;left:0;right:0}md-grid-tile md-grid-tile-footer [md-line],md-grid-tile md-grid-tile-header [md-line]{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}md-grid-tile md-grid-tile-footer [md-line]:nth-child(n+2),md-grid-tile md-grid-tile-header [md-line]:nth-child(n+2){font-size:12px}md-grid-tile .md-grid-list-text>*,md-grid-tile md-grid-tile-footer>*,md-grid-tile md-grid-tile-header>*{margin:0;padding:0;font-weight:400;font-size:inherit}md-grid-tile md-grid-tile-footer.md-2-line,md-grid-tile md-grid-tile-header.md-2-line{height:68px}md-grid-tile .md-grid-list-text{display:flex;flex-direction:column;width:100%;box-sizing:border-box;overflow:hidden}md-grid-tile .md-grid-list-text:empty,md-grid-tile [md-grid-avatar]:empty{display:none}md-grid-tile md-grid-tile-header{top:0}md-grid-tile md-grid-tile-footer{bottom:0}md-grid-tile [md-grid-avatar]{padding-right:16px}[dir=rtl] md-grid-tile [md-grid-avatar]{padding-right:0;padding-left:16px}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$37('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdGridTile);\n    return MdGridTile;\n}());\nvar MdGridTileText = (function () {\n    function MdGridTileText(_renderer, _element) {\n        this._renderer = _renderer;\n        this._element = _element;\n    }\n    MdGridTileText.prototype.ngAfterContentInit = function () {\n        this._lineSetter = new MdLineSetter(this._lines, this._renderer, this._element);\n    };\n    __decorate$37([\n        _angular_core.ContentChildren(MdLine), \n        __metadata$37('design:type', _angular_core.QueryList)\n    ], MdGridTileText.prototype, \"_lines\", void 0);\n    MdGridTileText = __decorate$37([\n        _angular_core.Component({selector: 'md-grid-tile-header, mat-grid-tile-header, md-grid-tile-footer, mat-grid-tile-footer',\n            template: \"<ng-content select=\\\"[md-grid-avatar], [mat-grid-avatar]\\\"></ng-content><div class=\\\"md-grid-list-text\\\"><ng-content select=\\\"[md-line], [mat-line]\\\"></ng-content></div><ng-content></ng-content>\"\n        }), \n        __metadata$37('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdGridTileText);\n    return MdGridTileText;\n}());\n\nvar __extends$8 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Exception thrown when cols property is missing from grid-list\n * @docs-private\n */\nvar MdGridListColsError = (function (_super) {\n    __extends$8(MdGridListColsError, _super);\n    function MdGridListColsError() {\n        _super.call(this, \"md-grid-list: must pass in number of columns. Example: <md-grid-list cols=\\\"3\\\">\");\n    }\n    return MdGridListColsError;\n}(MdError));\n/**\n * Exception thrown when a tile's colspan is longer than the number of cols in list\n * @docs-private\n */\nvar MdGridTileTooWideError = (function (_super) {\n    __extends$8(MdGridTileTooWideError, _super);\n    function MdGridTileTooWideError(cols, listLength) {\n        _super.call(this, \"md-grid-list: tile with colspan \" + cols + \" is wider than grid with cols=\\\"\" + listLength + \"\\\".\");\n    }\n    return MdGridTileTooWideError;\n}(MdError));\n/**\n * Exception thrown when an invalid ratio is passed in as a rowHeight\n * @docs-private\n */\nvar MdGridListBadRatioError = (function (_super) {\n    __extends$8(MdGridListBadRatioError, _super);\n    function MdGridListBadRatioError(value) {\n        _super.call(this, \"md-grid-list: invalid ratio given for row-height: \\\"\" + value + \"\\\"\");\n    }\n    return MdGridListBadRatioError;\n}(MdError));\n\n/**\n * Class for determining, from a list of tiles, the (row, col) position of each of those tiles\n * in the grid. This is necessary (rather than just rendering the tiles in normal document flow)\n * because the tiles can have a rowspan.\n *\n * The positioning algorithm greedily places each tile as soon as it encounters a gap in the grid\n * large enough to accommodate it so that the tiles still render in the same order in which they\n * are given.\n *\n * The basis of the algorithm is the use of an array to track the already placed tiles. Each\n * element of the array corresponds to a column, and the value indicates how many cells in that\n * column are already occupied; zero indicates an empty cell. Moving \"down\" to the next row\n * decrements each value in the tracking array (indicating that the column is one cell closer to\n * being free).\n *\n * @docs-private\n */\nvar TileCoordinator = (function () {\n    function TileCoordinator(numColumns, tiles) {\n        var _this = this;\n        /** Index at which the search for the next gap will start. */\n        this.columnIndex = 0;\n        /** The current row index. */\n        this.rowIndex = 0;\n        this.tracker = new Array(numColumns);\n        this.tracker.fill(0, 0, this.tracker.length);\n        this.positions = tiles.map(function (tile) { return _this._trackTile(tile); });\n    }\n    Object.defineProperty(TileCoordinator.prototype, \"rowCount\", {\n        /** Gets the total number of rows occupied by tiles */\n        get: function () { return this.rowIndex + 1; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TileCoordinator.prototype, \"rowspan\", {\n        /** Gets the total span of rows occupied by tiles.\n         * Ex: A list with 1 row that contains a tile with rowspan 2 will have a total rowspan of 2. */\n        get: function () {\n            var lastRowMax = Math.max.apply(Math, this.tracker);\n            // if any of the tiles has a rowspan that pushes it beyond the total row count,\n            // add the difference to the rowcount\n            return lastRowMax > 1 ? this.rowCount + lastRowMax - 1 : this.rowCount;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Calculates the row and col position of a tile. */\n    TileCoordinator.prototype._trackTile = function (tile) {\n        // Find a gap large enough for this tile.\n        var gapStartIndex = this._findMatchingGap(tile.colspan);\n        // Place tile in the resulting gap.\n        this._markTilePosition(gapStartIndex, tile);\n        // The next time we look for a gap, the search will start at columnIndex, which should be\n        // immediately after the tile that has just been placed.\n        this.columnIndex = gapStartIndex + tile.colspan;\n        return new TilePosition(this.rowIndex, gapStartIndex);\n    };\n    /** Finds the next available space large enough to fit the tile. */\n    TileCoordinator.prototype._findMatchingGap = function (tileCols) {\n        if (tileCols > this.tracker.length) {\n            throw new MdGridTileTooWideError(tileCols, this.tracker.length);\n        }\n        // Start index is inclusive, end index is exclusive.\n        var gapStartIndex = -1;\n        var gapEndIndex = -1;\n        // Look for a gap large enough to fit the given tile. Empty spaces are marked with a zero.\n        do {\n            // If we've reached the end of the row, go to the next row.\n            if (this.columnIndex + tileCols > this.tracker.length) {\n                this._nextRow();\n                continue;\n            }\n            gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n            // If there are no more empty spaces in this row at all, move on to the next row.\n            if (gapStartIndex == -1) {\n                this._nextRow();\n                continue;\n            }\n            gapEndIndex = this._findGapEndIndex(gapStartIndex);\n            // If a gap large enough isn't found, we want to start looking immediately after the current\n            // gap on the next iteration.\n            this.columnIndex = gapStartIndex + 1;\n        } while (gapEndIndex - gapStartIndex < tileCols);\n        return gapStartIndex;\n    };\n    /** Move \"down\" to the next row. */\n    TileCoordinator.prototype._nextRow = function () {\n        this.columnIndex = 0;\n        this.rowIndex++;\n        // Decrement all spaces by one to reflect moving down one row.\n        for (var i = 0; i < this.tracker.length; i++) {\n            this.tracker[i] = Math.max(0, this.tracker[i] - 1);\n        }\n    };\n    /**\n     * Finds the end index (exclusive) of a gap given the index from which to start looking.\n     * The gap ends when a non-zero value is found.\n     */\n    TileCoordinator.prototype._findGapEndIndex = function (gapStartIndex) {\n        for (var i = gapStartIndex + 1; i < this.tracker.length; i++) {\n            if (this.tracker[i] != 0) {\n                return i;\n            }\n        }\n        // The gap ends with the end of the row.\n        return this.tracker.length;\n    };\n    /** Update the tile tracker to account for the given tile in the given space. */\n    TileCoordinator.prototype._markTilePosition = function (start, tile) {\n        for (var i = 0; i < tile.colspan; i++) {\n            this.tracker[start + i] = tile.rowspan;\n        }\n    };\n    return TileCoordinator;\n}());\n/**\n * Simple data structure for tile position (row, col).\n * @docs-private\n */\nvar TilePosition = (function () {\n    function TilePosition(row, col) {\n        this.row = row;\n        this.col = col;\n    }\n    return TilePosition;\n}());\n\nvar __extends$9 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Sets the style properties for an individual tile, given the position calculated by the\n * Tile Coordinator.\n * @docs-private\n */\nvar TileStyler = (function () {\n    function TileStyler() {\n        this._rows = 0;\n        this._rowspan = 0;\n    }\n    /**\n     * Adds grid-list layout info once it is available. Cannot be processed in the constructor\n     * because these properties haven't been calculated by that point.\n     *\n     * @param gutterSize Size of the grid's gutter.\n     * @param tracker Instance of the TileCoordinator.\n     * @param cols Amount of columns in the grid.\n     * @param direction Layout direction of the grid.\n     */\n    TileStyler.prototype.init = function (gutterSize, tracker, cols, direction) {\n        this._gutterSize = normalizeUnits(gutterSize);\n        this._rows = tracker.rowCount;\n        this._rowspan = tracker.rowspan;\n        this._cols = cols;\n        this._direction = direction;\n    };\n    /**\n     * Computes the amount of space a single 1x1 tile would take up (width or height).\n     * Used as a basis for other calculations.\n     * @param sizePercent Percent of the total grid-list space that one 1x1 tile would take up.\n     * @param gutterFraction Fraction of the gutter size taken up by one 1x1 tile.\n     * @return The size of a 1x1 tile as an expression that can be evaluated via CSS calc().\n     */\n    TileStyler.prototype.getBaseTileSize = function (sizePercent, gutterFraction) {\n        // Take the base size percent (as would be if evenly dividing the size between cells),\n        // and then subtracting the size of one gutter. However, since there are no gutters on the\n        // edges, each tile only uses a fraction (gutterShare = numGutters / numCells) of the gutter\n        // size. (Imagine having one gutter per tile, and then breaking up the extra gutter on the\n        // edge evenly among the cells).\n        return \"(\" + sizePercent + \"% - ( \" + this._gutterSize + \" * \" + gutterFraction + \" ))\";\n    };\n    /**\n     * Gets The horizontal or vertical position of a tile, e.g., the 'top' or 'left' property value.\n     * @param offset Number of tiles that have already been rendered in the row/column.\n     * @param baseSize Base size of a 1x1 tile (as computed in getBaseTileSize).\n     * @return Position of the tile as a CSS calc() expression.\n     */\n    TileStyler.prototype.getTilePosition = function (baseSize, offset) {\n        // The position comes the size of a 1x1 tile plus gutter for each previous tile in the\n        // row/column (offset).\n        return calc(\"(\" + baseSize + \" + \" + this._gutterSize + \") * \" + offset);\n    };\n    /**\n     * Gets the actual size of a tile, e.g., width or height, taking rowspan or colspan into account.\n     * @param baseSize Base size of a 1x1 tile (as computed in getBaseTileSize).\n     * @param span The tile's rowspan or colspan.\n     * @return Size of the tile as a CSS calc() expression.\n     */\n    TileStyler.prototype.getTileSize = function (baseSize, span) {\n        return \"(\" + baseSize + \" * \" + span + \") + (\" + (span - 1) + \" * \" + this._gutterSize + \")\";\n    };\n    /**\n     * Sets the style properties to be applied to a tile for the given row and column index.\n     * @param tile Tile to which to apply the styling.\n     * @param rowIndex Index of the tile's row.\n     * @param colIndex Index of the tile's column.\n     */\n    TileStyler.prototype.setStyle = function (tile, rowIndex, colIndex) {\n        // Percent of the available horizontal space that one column takes up.\n        var percentWidthPerTile = 100 / this._cols;\n        // Fraction of the vertical gutter size that each column takes up.\n        // For example, if there are 5 columns, each column uses 4/5 = 0.8 times the gutter width.\n        var gutterWidthFractionPerTile = (this._cols - 1) / this._cols;\n        this.setColStyles(tile, colIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n        this.setRowStyles(tile, rowIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n    };\n    /** Sets the horizontal placement of the tile in the list. */\n    TileStyler.prototype.setColStyles = function (tile, colIndex, percentWidth, gutterWidth) {\n        // Base horizontal size of a column.\n        var baseTileWidth = this.getBaseTileSize(percentWidth, gutterWidth);\n        // The width and horizontal position of each tile is always calculated the same way, but the\n        // height and vertical position depends on the rowMode.\n        var side = this._direction === 'ltr' ? 'left' : 'right';\n        tile._setStyle(side, this.getTilePosition(baseTileWidth, colIndex));\n        tile._setStyle('width', calc(this.getTileSize(baseTileWidth, tile.colspan)));\n    };\n    /**\n     * Calculates the total size taken up by gutters across one axis of a list.\n     */\n    TileStyler.prototype.getGutterSpan = function () {\n        return this._gutterSize + \" * (\" + this._rowspan + \" - 1)\";\n    };\n    /**\n     * Calculates the total size taken up by tiles across one axis of a list.\n     * @param tileHeight Height of the tile.\n     */\n    TileStyler.prototype.getTileSpan = function (tileHeight) {\n        return this._rowspan + \" * \" + this.getTileSize(tileHeight, 1);\n    };\n    /**\n     * Sets the vertical placement of the tile in the list.\n     * This method will be implemented by each type of TileStyler.\n     * @docs-private\n     */\n    TileStyler.prototype.setRowStyles = function (tile, rowIndex, percentWidth, gutterWidth) { };\n    /**\n     * Calculates the computed height and returns the correct style property to set.\n     * This method will be implemented by each type of TileStyler.\n     * @docs-private\n     */\n    TileStyler.prototype.getComputedHeight = function () { return null; };\n    return TileStyler;\n}());\n/**\n * This type of styler is instantiated when the user passes in a fixed row height.\n * Example <md-grid-list cols=\"3\" rowHeight=\"100px\">\n * @docs-private\n */\nvar FixedTileStyler = (function (_super) {\n    __extends$9(FixedTileStyler, _super);\n    function FixedTileStyler(fixedRowHeight) {\n        _super.call(this);\n        this.fixedRowHeight = fixedRowHeight;\n    }\n    FixedTileStyler.prototype.init = function (gutterSize, tracker, cols, direction) {\n        _super.prototype.init.call(this, gutterSize, tracker, cols, direction);\n        this.fixedRowHeight = normalizeUnits(this.fixedRowHeight);\n    };\n    FixedTileStyler.prototype.setRowStyles = function (tile, rowIndex, percentWidth, gutterWidth) {\n        tile._setStyle('top', this.getTilePosition(this.fixedRowHeight, rowIndex));\n        tile._setStyle('height', calc(this.getTileSize(this.fixedRowHeight, tile.rowspan)));\n    };\n    FixedTileStyler.prototype.getComputedHeight = function () {\n        return [\n            'height', calc(this.getTileSpan(this.fixedRowHeight) + \" + \" + this.getGutterSpan())\n        ];\n    };\n    return FixedTileStyler;\n}(TileStyler));\n/**\n * This type of styler is instantiated when the user passes in a width:height ratio\n * for the row height.  Example <md-grid-list cols=\"3\" rowHeight=\"3:1\">\n * @docs-private\n */\nvar RatioTileStyler = (function (_super) {\n    __extends$9(RatioTileStyler, _super);\n    function RatioTileStyler(value) {\n        _super.call(this);\n        this._parseRatio(value);\n    }\n    RatioTileStyler.prototype.setRowStyles = function (tile, rowIndex, percentWidth, gutterWidth) {\n        var percentHeightPerTile = percentWidth / this.rowHeightRatio;\n        this.baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterWidth);\n        // Use paddingTop and marginTop to maintain the given aspect ratio, as\n        // a percentage-based value for these properties is applied versus the *width* of the\n        // containing block. See http://www.w3.org/TR/CSS2/box.html#margin-properties\n        tile._setStyle('marginTop', this.getTilePosition(this.baseTileHeight, rowIndex));\n        tile._setStyle('paddingTop', calc(this.getTileSize(this.baseTileHeight, tile.rowspan)));\n    };\n    RatioTileStyler.prototype.getComputedHeight = function () {\n        return [\n            'paddingBottom', calc(this.getTileSpan(this.baseTileHeight) + \" + \" + this.getGutterSpan())\n        ];\n    };\n    RatioTileStyler.prototype._parseRatio = function (value) {\n        var ratioParts = value.split(':');\n        if (ratioParts.length !== 2) {\n            throw new MdGridListBadRatioError(value);\n        }\n        this.rowHeightRatio = parseFloat(ratioParts[0]) / parseFloat(ratioParts[1]);\n    };\n    return RatioTileStyler;\n}(TileStyler));\n/**\n * This type of styler is instantiated when the user selects a \"fit\" row height mode.\n * In other words, the row height will reflect the total height of the container divided\n * by the number of rows.  Example <md-grid-list cols=\"3\" rowHeight=\"fit\">\n *\n * @docs-private\n */\nvar FitTileStyler = (function (_super) {\n    __extends$9(FitTileStyler, _super);\n    function FitTileStyler() {\n        _super.apply(this, arguments);\n    }\n    FitTileStyler.prototype.setRowStyles = function (tile, rowIndex, percentWidth, gutterWidth) {\n        // Percent of the available vertical space that one row takes up.\n        var percentHeightPerTile = 100 / this._rowspan;\n        // Fraction of the horizontal gutter size that each column takes up.\n        var gutterHeightPerTile = (this._rows - 1) / this._rows;\n        // Base vertical size of a column.\n        var baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterHeightPerTile);\n        tile._setStyle('top', this.getTilePosition(baseTileHeight, rowIndex));\n        tile._setStyle('height', calc(this.getTileSize(baseTileHeight, tile.rowspan)));\n    };\n    return FitTileStyler;\n}(TileStyler));\n/** Wraps a CSS string in a calc function */\nfunction calc(exp) { return \"calc(\" + exp + \")\"; }\n/** Appends pixels to a CSS string if no units are given. */\nfunction normalizeUnits(value) {\n    return (value.match(/px|em|rem/)) ? value : value + 'px';\n}\n\nvar __decorate$36 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$36 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$9 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n// TODO(kara): Conditional (responsive) column count / row size.\n// TODO(kara): Re-layout on window resize / media change (debounced).\n// TODO(kara): gridTileHeader and gridTileFooter.\nvar MD_FIT_MODE = 'fit';\nvar MdGridList = (function () {\n    function MdGridList(_renderer, _element, _dir) {\n        this._renderer = _renderer;\n        this._element = _element;\n        this._dir = _dir;\n        /** The amount of space between tiles. This will be something like '5px' or '2em'. */\n        this._gutter = '1px';\n    }\n    Object.defineProperty(MdGridList.prototype, \"cols\", {\n        /** Amount of columns in the grid list. */\n        get: function () { return this._cols; },\n        set: function (value) { this._cols = coerceToNumber(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdGridList.prototype, \"gutterSize\", {\n        /** Size of the grid list's gutter in pixels. */\n        get: function () { return this._gutter; },\n        set: function (value) { this._gutter = coerceToString(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdGridList.prototype, \"rowHeight\", {\n        /** Set internal representation of row height from the user-provided value. */\n        set: function (value) {\n            this._rowHeight = coerceToString(value);\n            this._setTileStyler();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdGridList.prototype.ngOnInit = function () {\n        this._checkCols();\n        this._checkRowHeight();\n    };\n    /**\n     * The layout calculation is fairly cheap if nothing changes, so there's little cost\n     * to run it frequently.\n     */\n    MdGridList.prototype.ngAfterContentChecked = function () {\n        this._layoutTiles();\n    };\n    /** Throw a friendly error if cols property is missing */\n    MdGridList.prototype._checkCols = function () {\n        if (!this.cols) {\n            throw new MdGridListColsError();\n        }\n    };\n    /** Default to equal width:height if rowHeight property is missing */\n    MdGridList.prototype._checkRowHeight = function () {\n        if (!this._rowHeight) {\n            this._tileStyler = new RatioTileStyler('1:1');\n        }\n    };\n    /** Creates correct Tile Styler subtype based on rowHeight passed in by user */\n    MdGridList.prototype._setTileStyler = function () {\n        if (this._rowHeight === MD_FIT_MODE) {\n            this._tileStyler = new FitTileStyler();\n        }\n        else if (this._rowHeight && this._rowHeight.match(/:/g)) {\n            this._tileStyler = new RatioTileStyler(this._rowHeight);\n        }\n        else {\n            this._tileStyler = new FixedTileStyler(this._rowHeight);\n        }\n    };\n    /** Computes and applies the size and position for all children grid tiles. */\n    MdGridList.prototype._layoutTiles = function () {\n        var tiles = this._tiles.toArray();\n        var tracker = new TileCoordinator(this.cols, tiles);\n        var direction = this._dir ? this._dir.value : 'ltr';\n        this._tileStyler.init(this.gutterSize, tracker, this.cols, direction);\n        for (var i = 0; i < tiles.length; i++) {\n            var pos = tracker.positions[i];\n            var tile = tiles[i];\n            this._tileStyler.setStyle(tile, pos.row, pos.col);\n        }\n        this._setListStyle(this._tileStyler.getComputedHeight());\n    };\n    /** Sets style on the main grid-list element, given the style name and value. */\n    MdGridList.prototype._setListStyle = function (style$$1) {\n        if (style$$1) {\n            this._renderer.setElementStyle(this._element.nativeElement, style$$1[0], style$$1[1]);\n        }\n    };\n    __decorate$36([\n        _angular_core.ContentChildren(MdGridTile), \n        __metadata$36('design:type', _angular_core.QueryList)\n    ], MdGridList.prototype, \"_tiles\", void 0);\n    __decorate$36([\n        _angular_core.Input(), \n        __metadata$36('design:type', Object)\n    ], MdGridList.prototype, \"cols\", null);\n    __decorate$36([\n        _angular_core.Input(), \n        __metadata$36('design:type', Object)\n    ], MdGridList.prototype, \"gutterSize\", null);\n    __decorate$36([\n        _angular_core.Input(), \n        __metadata$36('design:type', Object), \n        __metadata$36('design:paramtypes', [Object])\n    ], MdGridList.prototype, \"rowHeight\", null);\n    MdGridList = __decorate$36([\n        _angular_core.Component({selector: 'md-grid-list, mat-grid-list',\n            template: \"<div class=\\\"md-grid-list\\\"><ng-content></ng-content></div>\",\n            styles: [\"md-grid-list{display:block;position:relative}md-grid-tile{display:block;position:absolute;overflow:hidden}md-grid-tile figure{display:flex;position:absolute;align-items:center;justify-content:center;height:100%;top:0;right:0;bottom:0;left:0;padding:0;margin:0}md-grid-tile md-grid-tile-footer,md-grid-tile md-grid-tile-header{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;font-size:16px;position:absolute;left:0;right:0}md-grid-tile md-grid-tile-footer [md-line],md-grid-tile md-grid-tile-header [md-line]{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}md-grid-tile md-grid-tile-footer [md-line]:nth-child(n+2),md-grid-tile md-grid-tile-header [md-line]:nth-child(n+2){font-size:12px}md-grid-tile .md-grid-list-text>*,md-grid-tile md-grid-tile-footer>*,md-grid-tile md-grid-tile-header>*{margin:0;padding:0;font-weight:400;font-size:inherit}md-grid-tile md-grid-tile-footer.md-2-line,md-grid-tile md-grid-tile-header.md-2-line{height:68px}md-grid-tile .md-grid-list-text{display:flex;flex-direction:column;width:100%;box-sizing:border-box;overflow:hidden}md-grid-tile .md-grid-list-text:empty,md-grid-tile [md-grid-avatar]:empty{display:none}md-grid-tile md-grid-tile-header{top:0}md-grid-tile md-grid-tile-footer{bottom:0}md-grid-tile [md-grid-avatar]{padding-right:16px}[dir=rtl] md-grid-tile [md-grid-avatar]{padding-right:0;padding-left:16px}\"],\n            host: {\n                'role': 'list'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }),\n        __param$9(2, _angular_core.Optional()), \n        __metadata$36('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef, Dir])\n    ], MdGridList);\n    return MdGridList;\n}());\nvar MdGridListModule = (function () {\n    function MdGridListModule() {\n    }\n    MdGridListModule.forRoot = function () {\n        return {\n            ngModule: MdGridListModule,\n            providers: []\n        };\n    };\n    MdGridListModule = __decorate$36([\n        _angular_core.NgModule({\n            imports: [MdLineModule, DefaultStyleCompatibilityModeModule],\n            exports: [\n                MdGridList,\n                MdGridTile,\n                MdGridTileText,\n                MdLineModule,\n                DefaultStyleCompatibilityModeModule,\n            ],\n            declarations: [MdGridList, MdGridTile, MdGridTileText],\n        }), \n        __metadata$36('design:paramtypes', [])\n    ], MdGridListModule);\n    return MdGridListModule;\n}());\n\nvar __decorate$38 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$38 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Content of a card, needed as it's used as a selector in the API.\n */\nvar MdCardContent = (function () {\n    function MdCardContent() {\n    }\n    MdCardContent = __decorate$38([\n        _angular_core.Directive({\n            selector: 'md-card-content, mat-card-content'\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardContent);\n    return MdCardContent;\n}());\n/**\n * Title of a card, needed as it's used as a selector in the API.\n */\nvar MdCardTitle = (function () {\n    function MdCardTitle() {\n    }\n    MdCardTitle = __decorate$38([\n        _angular_core.Directive({\n            selector: 'md-card-title, mat-card-title'\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardTitle);\n    return MdCardTitle;\n}());\n/**\n * Sub-title of a card, needed as it's used as a selector in the API.\n */\nvar MdCardSubtitle = (function () {\n    function MdCardSubtitle() {\n    }\n    MdCardSubtitle = __decorate$38([\n        _angular_core.Directive({\n            selector: 'md-card-subtitle, mat-card-subtitle'\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardSubtitle);\n    return MdCardSubtitle;\n}());\n/**\n * Action section of a card, needed as it's used as a selector in the API.\n */\nvar MdCardActions = (function () {\n    function MdCardActions() {\n    }\n    MdCardActions = __decorate$38([\n        _angular_core.Directive({\n            selector: 'md-card-actions, mat-card-actions'\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardActions);\n    return MdCardActions;\n}());\n/**\n * Footer of a card, needed as it's used as a selector in the API.\n */\nvar MdCardFooter = (function () {\n    function MdCardFooter() {\n    }\n    MdCardFooter = __decorate$38([\n        _angular_core.Directive({\n            selector: 'md-card-footer, mat-card-footer'\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardFooter);\n    return MdCardFooter;\n}());\n/**\n * A basic content container component that adds the styles of a Material design card.\n *\n * While this component can be used alone, it also provides a number\n * of preset styles for common card sections, including:\n * - md-card-title\n * - md-card-subtitle\n * - md-card-content\n * - md-card-actions\n * - md-card-footer\n */\nvar MdCard = (function () {\n    function MdCard() {\n    }\n    MdCard = __decorate$38([\n        _angular_core.Component({selector: 'md-card, mat-card',\n            template: \"<ng-content></ng-content>\",\n            styles: [\"md-card{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);transition:box-shadow 280ms cubic-bezier(.4,0,.2,1);will-change:box-shadow;display:block;position:relative;padding:24px;border-radius:2px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif}@media screen and (-ms-high-contrast:active){md-card{outline:solid 1px}}.md-card-flat{box-shadow:none}md-card-actions,md-card-content,md-card-subtitle,md-card-title{display:block;margin-bottom:16px}md-card-title{font-size:24px;font-weight:400}md-card-content,md-card-header md-card-title,md-card-subtitle{font-size:14px}md-card-actions{margin-left:-16px;margin-right:-16px;padding:8px 0}md-card-actions[align=end]{display:flex;justify-content:flex-end}[md-card-image]{width:calc(100% + 48px);margin:0 -24px 16px}[md-card-xl-image]{width:240px;height:240px;margin:-8px}md-card-footer{position:absolute;width:100%;min-height:5px;bottom:0;left:0}md-card-actions [md-button],md-card-actions [md-raised-button]{margin:0 4px}md-card-header{display:flex;flex-direction:row;height:40px;margin:-8px 0 16px}.md-card-header-text{height:40px;margin:0 8px}[md-card-avatar]{height:40px;width:40px;border-radius:50%}[md-card-lg-image],[md-card-md-image],[md-card-sm-image]{margin:-8px 0}md-card-title-group{display:flex;justify-content:space-between;margin:0 -8px}[md-card-sm-image]{width:80px;height:80px}[md-card-md-image]{width:112px;height:112px}[md-card-lg-image]{width:152px;height:152px}@media (max-width:600px){md-card{padding:24px 16px}[md-card-image]{width:calc(100% + 32px);margin:16px -16px}md-card-title-group{margin:0}[md-card-xl-image]{margin-left:0;margin-right:0}md-card-header{margin:-8px 0 0}}md-card-content>:first-child,md-card>:first-child{margin-top:0}md-card-content>:last-child,md-card>:last-child{margin-bottom:0}[md-card-image]:first-child{margin-top:-24px}md-card>md-card-actions:last-child{margin-bottom:-16px;padding-bottom:0}md-card-actions [md-button]:first-child,md-card-actions [md-raised-button]:first-child{margin-left:0;margin-right:0}md-card-subtitle:not(:first-child),md-card-title:not(:first-child){margin-top:-4px}md-card-header md-card-subtitle:not(:first-child),md-card>[md-card-xl-image]:first-child{margin-top:-8px}md-card>[md-card-xl-image]:last-child{margin-bottom:-8px}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCard);\n    return MdCard;\n}());\n/**\n * Component intended to be used within the `<md-card>` component. It adds styles for a\n * preset header section (i.e. a title, subtitle, and avatar layout).\n */\nvar MdCardHeader = (function () {\n    function MdCardHeader() {\n    }\n    MdCardHeader = __decorate$38([\n        _angular_core.Component({selector: 'md-card-header, mat-card-header',\n            template: \"<ng-content select=\\\"[md-card-avatar], [mat-card-avatar]\\\"></ng-content><div class=\\\"md-card-header-text\\\"><ng-content select=\\\"md-card-title, mat-card-title, md-card-subtitle, mat-card-subtitle\\\"></ng-content></div><ng-content></ng-content>\",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardHeader);\n    return MdCardHeader;\n}());\n/**\n * Component intended to be used within the <md-card> component. It adds styles for a preset\n * layout that groups an image with a title section.\n */\nvar MdCardTitleGroup = (function () {\n    function MdCardTitleGroup() {\n    }\n    MdCardTitleGroup = __decorate$38([\n        _angular_core.Component({selector: 'md-card-title-group, mat-card-title-group',\n            template: \"<div><ng-content select=\\\"md-card-title, mat-card-title, md-card-subtitle, mat-card-subtitle\\\"></ng-content></div><ng-content select=\\\"img\\\"></ng-content><ng-content></ng-content>\",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardTitleGroup);\n    return MdCardTitleGroup;\n}());\nvar MdCardModule = (function () {\n    function MdCardModule() {\n    }\n    MdCardModule.forRoot = function () {\n        return {\n            ngModule: MdCardModule,\n            providers: []\n        };\n    };\n    MdCardModule = __decorate$38([\n        _angular_core.NgModule({\n            imports: [DefaultStyleCompatibilityModeModule],\n            exports: [\n                MdCard,\n                MdCardHeader,\n                MdCardTitleGroup,\n                MdCardContent,\n                MdCardTitle,\n                MdCardSubtitle,\n                MdCardActions,\n                MdCardFooter,\n                DefaultStyleCompatibilityModeModule,\n            ],\n            declarations: [\n                MdCard, MdCardHeader, MdCardTitleGroup, MdCardContent, MdCardTitle, MdCardSubtitle,\n                MdCardActions, MdCardFooter\n            ],\n        }), \n        __metadata$38('design:paramtypes', [])\n    ], MdCardModule);\n    return MdCardModule;\n}());\n\nvar __decorate$40 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$40 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Material design styled Chip component. Used inside the MdChipList component.\n */\nvar MdChip = (function () {\n    function MdChip(_renderer, _elementRef) {\n        this._renderer = _renderer;\n        this._elementRef = _elementRef;\n        /** Whether or not the chip is disabled. Disabled chips cannot be focused. */\n        this._disabled = null;\n        /** Whether or not the chip is selected. */\n        this._selected = false;\n        /** The palette color of selected chips. */\n        this._color = 'primary';\n        /** Emitted when the chip is focused. */\n        this.onFocus = new _angular_core.EventEmitter();\n        /** Emitted when the chip is selected. */\n        this.select = new _angular_core.EventEmitter();\n        /** Emitted when the chip is deselected. */\n        this.deselect = new _angular_core.EventEmitter();\n        /** Emitted when the chip is destroyed. */\n        this.destroy = new _angular_core.EventEmitter();\n    }\n    MdChip.prototype.ngOnInit = function () {\n        this._addDefaultCSSClass();\n        this._updateColor(this._color);\n    };\n    MdChip.prototype.ngOnDestroy = function () {\n        this.destroy.emit({ chip: this });\n    };\n    Object.defineProperty(MdChip.prototype, \"disabled\", {\n        /** Whether or not the chip is disabled. */\n        get: function () {\n            return this._disabled;\n        },\n        /** Sets the disabled state of the chip. */\n        set: function (value) {\n            this._disabled = coerceBooleanProperty(value) ? true : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdChip.prototype, \"_isAriaDisabled\", {\n        /** A String representation of the current disabled state. */\n        get: function () {\n            return String(coerceBooleanProperty(this.disabled));\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdChip.prototype, \"selected\", {\n        /** Whether or not this chip is selected. */\n        get: function () {\n            return this._selected;\n        },\n        set: function (value) {\n            this._selected = coerceBooleanProperty(value);\n            if (this._selected) {\n                this.select.emit({ chip: this });\n            }\n            else {\n                this.deselect.emit({ chip: this });\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Toggles the current selected state of this chip.\n     * @return Whether the chip is selected.\n     */\n    MdChip.prototype.toggleSelected = function () {\n        this.selected = !this.selected;\n        return this.selected;\n    };\n    Object.defineProperty(MdChip.prototype, \"color\", {\n        /** The color of the chip. Can be `primary`, `accent`, or `warn`. */\n        get: function () {\n            return this._color;\n        },\n        set: function (value) {\n            this._updateColor(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Allows for programmatic focusing of the chip. */\n    MdChip.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus');\n        this.onFocus.emit({ chip: this });\n    };\n    /** Ensures events fire properly upon click. */\n    MdChip.prototype._handleClick = function (event) {\n        // Check disabled\n        if (this.disabled) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n        else {\n            this.focus();\n        }\n    };\n    /** Initializes the appropriate CSS classes based on the chip type (basic or standard). */\n    MdChip.prototype._addDefaultCSSClass = function () {\n        var el = this._elementRef.nativeElement;\n        // Always add the `md-chip` class\n        el.classList.add('md-chip');\n        // If we are a basic chip, also add the `md-basic-chip` class for :not() targeting\n        if (el.nodeName.toLowerCase() == 'md-basic-chip' || el.hasAttribute('md-basic-chip')) {\n            el.classList.add('md-basic-chip');\n        }\n    };\n    /** Updates the private _color variable and the native element. */\n    MdChip.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    /** Sets the md-color on the native element. */\n    MdChip.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this._renderer.setElementClass(this._elementRef.nativeElement, \"md-\" + color, isAdd);\n        }\n    };\n    __decorate$40([\n        _angular_core.Output(), \n        __metadata$40('design:type', Object)\n    ], MdChip.prototype, \"select\", void 0);\n    __decorate$40([\n        _angular_core.Output(), \n        __metadata$40('design:type', Object)\n    ], MdChip.prototype, \"deselect\", void 0);\n    __decorate$40([\n        _angular_core.Output(), \n        __metadata$40('design:type', Object)\n    ], MdChip.prototype, \"destroy\", void 0);\n    __decorate$40([\n        _angular_core.Input(), \n        __metadata$40('design:type', Boolean)\n    ], MdChip.prototype, \"disabled\", null);\n    __decorate$40([\n        _angular_core.Input(), \n        __metadata$40('design:type', Boolean)\n    ], MdChip.prototype, \"selected\", null);\n    __decorate$40([\n        _angular_core.Input(), \n        __metadata$40('design:type', String)\n    ], MdChip.prototype, \"color\", null);\n    MdChip = __decorate$40([\n        _angular_core.Component({\n            selector: 'md-basic-chip, [md-basic-chip], md-chip, [md-chip]',\n            template: \"<ng-content></ng-content>\",\n            host: {\n                'tabindex': '-1',\n                'role': 'option',\n                '[class.md-chip-selected]': 'selected',\n                '[attr.disabled]': 'disabled',\n                '[attr.aria-disabled]': '_isAriaDisabled',\n                '(click)': '_handleClick($event)'\n            }\n        }), \n        __metadata$40('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdChip);\n    return MdChip;\n}());\n\nvar __decorate$39 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$39 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * A material design chips component (named ChipList for it's similarity to the List component).\n *\n * Example:\n *\n *     <md-chip-list>\n *       <md-chip>Chip 1<md-chip>\n *       <md-chip>Chip 2<md-chip>\n *     </md-chip-list>\n */\nvar MdChipList = (function () {\n    function MdChipList(_elementRef) {\n        this._elementRef = _elementRef;\n        /** Track which chips we're listening to for focus/destruction. */\n        this._subscribed = new WeakMap();\n        /** Whether or not the chip is selectable. */\n        this._selectable = true;\n    }\n    MdChipList.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        this._keyManager = new ListKeyManager(this.chips).withFocusWrap();\n        // Go ahead and subscribe all of the initial chips\n        this._subscribeChips(this.chips);\n        // When the list changes, re-subscribe\n        this.chips.changes.subscribe(function (chips) {\n            _this._subscribeChips(chips);\n        });\n    };\n    Object.defineProperty(MdChipList.prototype, \"selectable\", {\n        /**\n         * Whether or not this chip is selectable. When a chip is not selectable,\n         * it's selected state is always ignored.\n         */\n        get: function () {\n            return this._selectable;\n        },\n        set: function (value) {\n            this._selectable = coerceBooleanProperty(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Programmatically focus the chip list. This in turn focuses the first\n     * non-disabled chip in this chip list.\n     */\n    MdChipList.prototype.focus = function () {\n        // TODO: ARIA says this should focus the first `selected` chip.\n        this._keyManager.focusFirstItem();\n    };\n    /** Passes relevant key presses to our key manager. */\n    MdChipList.prototype._keydown = function (event) {\n        var target = event.target;\n        // If they are on a chip, check for space/left/right, otherwise pass to our key manager\n        if (target && target.classList.contains('md-chip')) {\n            switch (event.keyCode) {\n                case SPACE:\n                    // If we are selectable, toggle the focused chip\n                    if (this.selectable) {\n                        this._toggleSelectOnFocusedChip();\n                    }\n                    // Always prevent space from scrolling the page since the list has focus\n                    event.preventDefault();\n                    break;\n                case LEFT_ARROW:\n                    this._keyManager.focusPreviousItem();\n                    event.preventDefault();\n                    break;\n                case RIGHT_ARROW:\n                    this._keyManager.focusNextItem();\n                    event.preventDefault();\n                    break;\n                default:\n                    this._keyManager.onKeydown(event);\n            }\n        }\n    };\n    /** Toggles the selected state of the currently focused chip. */\n    MdChipList.prototype._toggleSelectOnFocusedChip = function () {\n        // Allow disabling of chip selection\n        if (!this.selectable) {\n            return;\n        }\n        var focusedIndex = this._keyManager.focusedItemIndex;\n        if (this._isValidIndex(focusedIndex)) {\n            var focusedChip = this.chips.toArray()[focusedIndex];\n            if (focusedChip) {\n                focusedChip.toggleSelected();\n            }\n        }\n    };\n    /**\n     * Iterate through the list of chips and add them to our list of\n     * subscribed chips.\n     *\n     * @param chips The list of chips to be subscribed.\n     */\n    MdChipList.prototype._subscribeChips = function (chips) {\n        var _this = this;\n        chips.forEach(function (chip) { return _this._addChip(chip); });\n    };\n    /**\n     * Add a specific chip to our subscribed list. If the chip has\n     * already been subscribed, this ensures it is only subscribed\n     * once.\n     *\n     * @param chip The chip to be subscribed (or checked for existing\n     * subscription).\n     */\n    MdChipList.prototype._addChip = function (chip) {\n        var _this = this;\n        // If we've already been subscribed to a parent, do nothing\n        if (this._subscribed.has(chip)) {\n            return;\n        }\n        // Watch for focus events outside of the keyboard navigation\n        chip.onFocus.subscribe(function () {\n            var chipIndex = _this.chips.toArray().indexOf(chip);\n            if (_this._isValidIndex(chipIndex)) {\n                _this._keyManager.updateFocusedItemIndex(chipIndex);\n            }\n        });\n        // On destroy, remove the item from our list, and check focus\n        chip.destroy.subscribe(function () {\n            var chipIndex = _this.chips.toArray().indexOf(chip);\n            if (_this._isValidIndex(chipIndex)) {\n                // Check whether the chip is the last item\n                if (chipIndex < _this.chips.length - 1) {\n                    _this._keyManager.setFocus(chipIndex);\n                }\n                else if (chipIndex - 1 >= 0) {\n                    _this._keyManager.setFocus(chipIndex - 1);\n                }\n            }\n            _this._subscribed.delete(chip);\n            chip.destroy.unsubscribe();\n        });\n        this._subscribed.set(chip, true);\n    };\n    /**\n     * Utility to ensure all indexes are valid.\n     *\n     * @param index The index to be checked.\n     * @returns True if the index is valid for our list of chips.\n     */\n    MdChipList.prototype._isValidIndex = function (index) {\n        return index >= 0 && index < this.chips.length;\n    };\n    __decorate$39([\n        _angular_core.Input(), \n        __metadata$39('design:type', Boolean)\n    ], MdChipList.prototype, \"selectable\", null);\n    MdChipList = __decorate$39([\n        _angular_core.Component({selector: 'md-chip-list',\n            template: \"<div class=\\\"md-chip-list-wrapper\\\"><ng-content></ng-content></div>\",\n            host: {\n                // Properties\n                'tabindex': '0',\n                'role': 'listbox',\n                'class': 'md-chip-list',\n                // Events\n                '(focus)': 'focus()',\n                '(keydown)': '_keydown($event)'\n            },\n            queries: {\n                chips: new _angular_core.ContentChildren(MdChip)\n            },\n            styles: [\".md-chip-list-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;align-items:flex-start}.md-chip-list-wrapper .md-chip:not(.md-basic-chip){margin:0 3px}.md-chip-list-wrapper .md-chip:not(.md-basic-chip):first-child{margin-left:0;margin-right:3px}.md-chip-list-wrapper .md-chip:not(.md-basic-chip):last-child,[dir=rtl] .md-chip-list-wrapper .md-chip:not(.md-basic-chip):first-child{margin-left:3px;margin-right:0}[dir=rtl] .md-chip-list-wrapper .md-chip:not(.md-basic-chip):last-child{margin-left:0;margin-right:3px}.md-chip:not(.md-basic-chip){display:inline-block;padding:8px 12px;border-radius:24px;font-size:13px;line-height:16px}.md-chip-list-stacked .md-chip-list-wrapper{display:block}.md-chip-list-stacked .md-chip-list-wrapper .md-chip:not(.md-basic-chip){display:block;margin:0 0 8px}[dir=rtl] .md-chip-list-stacked .md-chip-list-wrapper .md-chip:not(.md-basic-chip){margin:0 0 8px}.md-chip-list-stacked .md-chip-list-wrapper .md-chip:not(.md-basic-chip):last-child,[dir=rtl] .md-chip-list-stacked .md-chip-list-wrapper .md-chip:not(.md-basic-chip):last-child{margin-bottom:0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush\n        }), \n        __metadata$39('design:paramtypes', [_angular_core.ElementRef])\n    ], MdChipList);\n    return MdChipList;\n}());\nvar MdChipsModule = (function () {\n    function MdChipsModule() {\n    }\n    MdChipsModule.forRoot = function () {\n        return {\n            ngModule: MdChipsModule,\n            providers: []\n        };\n    };\n    MdChipsModule = __decorate$39([\n        _angular_core.NgModule({\n            imports: [],\n            exports: [MdChipList, MdChip],\n            declarations: [MdChipList, MdChip]\n        }), \n        __metadata$39('design:paramtypes', [])\n    ], MdChipsModule);\n    return MdChipsModule;\n}());\n\nvar __extends$11 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$42 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$42 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Exception thrown when attempting to load an icon with a name that cannot be found.\n * @docs-private\n */\nvar MdIconNameNotFoundError = (function (_super) {\n    __extends$11(MdIconNameNotFoundError, _super);\n    function MdIconNameNotFoundError(iconName) {\n        _super.call(this, \"Unable to find icon with the name \\\"\" + iconName + \"\\\"\");\n    }\n    return MdIconNameNotFoundError;\n}(MdError));\n/**\n * Exception thrown when attempting to load SVG content that does not contain the expected\n * <svg> tag.\n * @docs-private\n */\nvar MdIconSvgTagNotFoundError = (function (_super) {\n    __extends$11(MdIconSvgTagNotFoundError, _super);\n    function MdIconSvgTagNotFoundError() {\n        _super.call(this, '<svg> tag not found');\n    }\n    return MdIconSvgTagNotFoundError;\n}(MdError));\n/**\n * Configuration for an icon, including the URL and possibly the cached SVG element.\n * @docs-private\n */\nvar SvgIconConfig = (function () {\n    function SvgIconConfig(url) {\n        this.url = url;\n        this.svgElement = null;\n    }\n    return SvgIconConfig;\n}());\n/** Returns the cache key to use for an icon namespace and name. */\nvar iconKey = function (namespace, name) { return namespace + ':' + name; };\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 */\nvar MdIconRegistry = (function () {\n    function MdIconRegistry(_http, _sanitizer) {\n        this._http = _http;\n        this._sanitizer = _sanitizer;\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        /**\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        this._defaultFontSetClass = 'material-icons';\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    MdIconRegistry.prototype.addSvgIcon = function (iconName, url) {\n        return this.addSvgIconInNamespace('', iconName, url);\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    MdIconRegistry.prototype.addSvgIconInNamespace = function (namespace, iconName, url) {\n        var key = iconKey(namespace, iconName);\n        this._svgIconConfigs.set(key, new SvgIconConfig(url));\n        return this;\n    };\n    /**\n     * Registers an icon set by URL in the default namespace.\n     * @param url\n     */\n    MdIconRegistry.prototype.addSvgIconSet = function (url) {\n        return this.addSvgIconSetInNamespace('', url);\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    MdIconRegistry.prototype.addSvgIconSetInNamespace = function (namespace, url) {\n        var config = new SvgIconConfig(url);\n        if (this._iconSetConfigs.has(namespace)) {\n            this._iconSetConfigs.get(namespace).push(config);\n        }\n        else {\n            this._iconSetConfigs.set(namespace, [config]);\n        }\n        return this;\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     * @param alias Alias for the font.\n     * @param className Class name override to be used instead of the alias.\n     */\n    MdIconRegistry.prototype.registerFontClassAlias = function (alias, className) {\n        if (className === void 0) { 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    MdIconRegistry.prototype.classNameForFontAlias = function (alias) {\n        return this._fontCssClassesByAlias.get(alias) || alias;\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     * @param className\n     */\n    MdIconRegistry.prototype.setDefaultFontSetClass = function (className) {\n        this._defaultFontSetClass = className;\n        return this;\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    MdIconRegistry.prototype.getDefaultFontSetClass = function () {\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    MdIconRegistry.prototype.getSvgIconFromUrl = function (safeUrl) {\n        var _this = this;\n        var url = this._sanitizer.sanitize(_angular_core.SecurityContext.RESOURCE_URL, safeUrl);\n        if (this._cachedIconsByUrl.has(url)) {\n            return rxjs_Observable.Observable.of(cloneSvg(this._cachedIconsByUrl.get(url)));\n        }\n        return this._loadSvgIconFromConfig(new SvgIconConfig(url))\n            .do(function (svg) { return _this._cachedIconsByUrl.set(url, svg); })\n            .map(function (svg) { return 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 MdIconNameNotFoundError.\n     *\n     * @param name Name of the icon to be retrieved.\n     * @param namespace Namespace in which to look for the icon.\n     */\n    MdIconRegistry.prototype.getNamedSvgIcon = function (name, namespace) {\n        if (namespace === void 0) { namespace = ''; }\n        // Return (copy of) cached icon if possible.\n        var key = iconKey(namespace, name);\n        if (this._svgIconConfigs.has(key)) {\n            return this._getSvgFromConfig(this._svgIconConfigs.get(key));\n        }\n        // See if we have any icon sets registered for the namespace.\n        var iconSetConfigs = this._iconSetConfigs.get(namespace);\n        if (iconSetConfigs) {\n            return this._getSvgFromIconSetConfigs(name, iconSetConfigs);\n        }\n        return rxjs_Observable.Observable.throw(new MdIconNameNotFoundError(key));\n    };\n    /**\n     * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.\n     */\n    MdIconRegistry.prototype._getSvgFromConfig = function (config) {\n        if (config.svgElement) {\n            // We already have the SVG element for this icon, return a copy.\n            return rxjs_Observable.Observable.of(cloneSvg(config.svgElement));\n        }\n        else {\n            // Fetch the icon from the config's URL, cache it, and return a copy.\n            return this._loadSvgIconFromConfig(config)\n                .do(function (svg) { return config.svgElement = svg; })\n                .map(function (svg) { return 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     * MdIconNameNotFoundError if no icon with the specified name can be found.\n     */\n    MdIconRegistry.prototype._getSvgFromIconSetConfigs = function (name, iconSetConfigs) {\n        var _this = this;\n        // For all the icon set SVG elements we've fetched, see if any contain an icon with the\n        // requested name.\n        var 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 rxjs_Observable.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        var iconSetFetchRequests = iconSetConfigs\n            .filter(function (iconSetConfig) { return !iconSetConfig.svgElement; })\n            .map(function (iconSetConfig) {\n            return _this._loadSvgIconSetFromConfig(iconSetConfig)\n                .catch(function (err, caught) {\n                var url = _this._sanitizer.sanitize(_angular_core.SecurityContext.RESOURCE_URL, iconSetConfig.url);\n                // Swallow errors fetching individual URLs so the combined Observable won't\n                // necessarily fail.\n                console.log(\"Loading icon set URL: \" + url + \" failed: \" + err);\n                return rxjs_Observable.Observable.of(null);\n            })\n                .do(function (svg) {\n                // Cache SVG element.\n                if (svg) {\n                    iconSetConfig.svgElement = svg;\n                }\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 rxjs_Observable.Observable.forkJoin(iconSetFetchRequests)\n            .map(function (ignoredResults) {\n            var foundIcon = _this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n            if (!foundIcon) {\n                throw new MdIconNameNotFoundError(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    MdIconRegistry.prototype._extractIconWithNameFromAnySet = function (iconName, iconSetConfigs) {\n        // Iterate backwards, so icon sets added later have precedence.\n        for (var i = iconSetConfigs.length - 1; i >= 0; i--) {\n            var config = iconSetConfigs[i];\n            if (config.svgElement) {\n                var foundIcon = this._extractSvgIconFromSet(config.svgElement, iconName, config);\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    MdIconRegistry.prototype._loadSvgIconFromConfig = function (config) {\n        var _this = this;\n        return this._fetchUrl(config.url)\n            .map(function (svgText) { return _this._createSvgElementForSingleIcon(svgText, config); });\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    MdIconRegistry.prototype._loadSvgIconSetFromConfig = function (config) {\n        var _this = this;\n        // TODO: Document that icons should only be loaded from trusted sources.\n        return this._fetchUrl(config.url)\n            .map(function (svgText) { return _this._svgElementFromString(svgText); });\n    };\n    /**\n     * Creates a DOM element from the given SVG string, and adds default attributes.\n     */\n    MdIconRegistry.prototype._createSvgElementForSingleIcon = function (responseText, config) {\n        var svg = this._svgElementFromString(responseText);\n        this._setSvgAttributes(svg, config);\n        return svg;\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    MdIconRegistry.prototype._extractSvgIconFromSet = function (iconSet, iconName, config) {\n        var 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(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        // Elements created using DOMParser.parseFromString have the same problem.\n        // http://stackoverflow.com/questions/23003278/svg-innerhtml-in-firefox-can-not-display\n        var 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     * Creates a DOM element from the given SVG string.\n     */\n    MdIconRegistry.prototype._svgElementFromString = function (str) {\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        var div = document.createElement('DIV');\n        div.innerHTML = str;\n        var svg = div.querySelector('svg');\n        if (!svg) {\n            throw new MdIconSvgTagNotFoundError();\n        }\n        return svg;\n    };\n    /**\n     * Sets the default attributes for an SVG element to be used as an icon.\n     */\n    MdIconRegistry.prototype._setSvgAttributes = function (svg, config) {\n        if (!svg.getAttribute('xmlns')) {\n            svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n        }\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        return svg;\n    };\n    /**\n     * Returns an Observable which produces the string contents of the given URL. Results may be\n     * cached, so future calls with the same URL may not cause another HTTP request.\n     */\n    MdIconRegistry.prototype._fetchUrl = function (safeUrl) {\n        var _this = this;\n        var url = this._sanitizer.sanitize(_angular_core.SecurityContext.RESOURCE_URL, 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        if (this._inProgressUrlFetches.has(url)) {\n            return this._inProgressUrlFetches.get(url);\n        }\n        // TODO(jelbourn): for some reason, the `finally` operator \"loses\" the generic type on the\n        // Observable. Figure out why and fix it.\n        var req = this._http.get(url)\n            .map(function (response) { return response.text(); })\n            .finally(function () {\n            _this._inProgressUrlFetches.delete(url);\n        })\n            .share();\n        this._inProgressUrlFetches.set(url, req);\n        return req;\n    };\n    MdIconRegistry = __decorate$42([\n        _angular_core.Injectable(), \n        __metadata$42('design:paramtypes', [_angular_http.Http, _angular_platformBrowser.DomSanitizer])\n    ], MdIconRegistry);\n    return MdIconRegistry;\n}());\n/** Clones an SVGElement while preserving type information. */\nfunction cloneSvg(svg) {\n    return svg.cloneNode(true);\n}\n\nvar __extends$10 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$41 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$41 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Exception thrown when an invalid icon name is passed to an md-icon component. */\nvar MdIconInvalidNameError = (function (_super) {\n    __extends$10(MdIconInvalidNameError, _super);\n    function MdIconInvalidNameError(iconName) {\n        _super.call(this, \"Invalid icon name: \\\"\" + iconName + \"\\\"\");\n    }\n    return MdIconInvalidNameError;\n}(MdError));\n/**\n * Component to display an icon. It can be used in the following ways:\n * - Specify the svgSrc input to load an SVG icon from a URL. The SVG content is directly inlined\n *   as a child of the <md-icon> component, so that CSS styles can easily be applied to it.\n *   The URL is loaded via an XMLHttpRequest, so it must be on the same domain as the page or its\n *   server must be configured to allow cross-domain requests.\n *   Example:\n *     <md-icon svgSrc=\"assets/arrow.svg\"></md-icon>\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 *   MdIconRegistry. 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 *     <md-icon svgIcon=\"left-arrow\"></md-icon>\n *     <md-icon svgIcon=\"animals:cat\"></md-icon>\n *\n * - Use a font ligature as an icon by putting the ligature text in the content of the <md-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 MdIconRegistry.registerFontClassAlias.\n *   Examples:\n *     <md-icon>home</md-icon>\n *     <md-icon fontSet=\"myfont\">sun</md-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 *     <md-icon fontSet=\"fa\" fontIcon=\"alarm\"></md-icon>\n */\nvar MdIcon = (function () {\n    function MdIcon(_elementRef, _renderer, _mdIconRegistry) {\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        this._mdIconRegistry = _mdIconRegistry;\n        /** Screenreader label for the icon. */\n        this.hostAriaLabel = '';\n    }\n    Object.defineProperty(MdIcon.prototype, \"color\", {\n        /** Color of the icon. */\n        get: function () { return this._color; },\n        set: function (value) { this._updateColor(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdIcon.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    MdIcon.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this._renderer.setElementClass(this._elementRef.nativeElement, \"md-\" + color, isAdd);\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 a MdIconInvalidNameError 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 MdIconInvalidNameError)\n     */\n    MdIcon.prototype._splitIconName = function (iconName) {\n        if (!iconName) {\n            return ['', ''];\n        }\n        var parts = iconName.split(':');\n        switch (parts.length) {\n            case 1:\n                // Use default namespace.\n                return ['', parts[0]];\n            case 2:\n                return parts;\n            default:\n                throw new MdIconInvalidNameError(iconName);\n        }\n    };\n    MdIcon.prototype.ngOnChanges = function (changes) {\n        var _this = this;\n        var changedInputs = Object.keys(changes);\n        // Only update the inline SVG icon if the inputs changed, to avoid unnecessary DOM operations.\n        if (changedInputs.indexOf('svgIcon') != -1 || changedInputs.indexOf('svgSrc') != -1) {\n            if (this.svgIcon) {\n                var _a = this._splitIconName(this.svgIcon), namespace = _a[0], iconName = _a[1];\n                this._mdIconRegistry.getNamedSvgIcon(iconName, namespace).first().subscribe(function (svg) { return _this._setSvgElement(svg); }, function (err) { return console.log(\"Error retrieving icon: \" + err); });\n            }\n        }\n        if (this._usingFontIcon()) {\n            this._updateFontIconClasses();\n        }\n        this._updateAriaLabel();\n    };\n    MdIcon.prototype.ngOnInit = function () {\n        // Update font classes because ngOnChanges won't be called if none of the inputs are present,\n        // e.g. <md-icon>arrow</md-icon>. In this case we need to add a CSS class for the default font.\n        if (this._usingFontIcon()) {\n            this._updateFontIconClasses();\n        }\n    };\n    MdIcon.prototype.ngAfterViewChecked = function () {\n        // Update aria label here because it may depend on the projected text content.\n        // (e.g. <md-icon>home</md-icon> should use 'home').\n        this._updateAriaLabel();\n    };\n    MdIcon.prototype._updateAriaLabel = function () {\n        var ariaLabel = this._getAriaLabel();\n        if (ariaLabel) {\n            this._renderer.setElementAttribute(this._elementRef.nativeElement, 'aria-label', ariaLabel);\n        }\n    };\n    MdIcon.prototype._getAriaLabel = function () {\n        // If the parent provided an aria-label attribute value, use it as-is. Otherwise look for a\n        // reasonable value from the alt attribute, font icon name, SVG icon name, or (for ligatures)\n        // the text content of the directive.\n        var label = this.hostAriaLabel ||\n            this.alt ||\n            this.fontIcon ||\n            this._splitIconName(this.svgIcon)[1];\n        if (label) {\n            return label;\n        }\n        // The \"content\" of an SVG icon is not a useful label.\n        if (this._usingFontIcon()) {\n            var text = this._elementRef.nativeElement.textContent;\n            if (text) {\n                return text;\n            }\n        }\n        // TODO: Warn here in dev mode.\n        return null;\n    };\n    MdIcon.prototype._usingFontIcon = function () {\n        return !this.svgIcon;\n    };\n    MdIcon.prototype._setSvgElement = function (svg) {\n        var layoutElement = this._elementRef.nativeElement;\n        // Remove existing child nodes and add the new SVG element.\n        // We would use renderer.detachView(Array.from(layoutElement.childNodes)) here,\n        // but it fails in IE11: https://github.com/angular/angular/issues/6327\n        layoutElement.innerHTML = '';\n        this._renderer.projectNodes(layoutElement, [svg]);\n    };\n    MdIcon.prototype._updateFontIconClasses = function () {\n        if (!this._usingFontIcon()) {\n            return;\n        }\n        var elem = this._elementRef.nativeElement;\n        var fontSetClass = this.fontSet ?\n            this._mdIconRegistry.classNameForFontAlias(this.fontSet) :\n            this._mdIconRegistry.getDefaultFontSetClass();\n        if (fontSetClass != this._previousFontSetClass) {\n            if (this._previousFontSetClass) {\n                this._renderer.setElementClass(elem, this._previousFontSetClass, false);\n            }\n            if (fontSetClass) {\n                this._renderer.setElementClass(elem, fontSetClass, true);\n            }\n            this._previousFontSetClass = fontSetClass;\n        }\n        if (this.fontIcon != this._previousFontIconClass) {\n            if (this._previousFontIconClass) {\n                this._renderer.setElementClass(elem, this._previousFontIconClass, false);\n            }\n            if (this.fontIcon) {\n                this._renderer.setElementClass(elem, this.fontIcon, true);\n            }\n            this._previousFontIconClass = this.fontIcon;\n        }\n    };\n    __decorate$41([\n        _angular_core.Input(), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"svgIcon\", void 0);\n    __decorate$41([\n        _angular_core.Input(), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"fontSet\", void 0);\n    __decorate$41([\n        _angular_core.Input(), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"fontIcon\", void 0);\n    __decorate$41([\n        _angular_core.Input(), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"alt\", void 0);\n    __decorate$41([\n        _angular_core.Input('aria-label'), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"hostAriaLabel\", void 0);\n    __decorate$41([\n        _angular_core.Input(), \n        __metadata$41('design:type', String)\n    ], MdIcon.prototype, \"color\", null);\n    MdIcon = __decorate$41([\n        _angular_core.Component({template: '<ng-content></ng-content>',\n            selector: 'md-icon, mat-icon',\n            styles: [\"md-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}\"],\n            host: {\n                'role': 'img',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$41('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer, MdIconRegistry])\n    ], MdIcon);\n    return MdIcon;\n}());\nvar MdIconModule = (function () {\n    function MdIconModule() {\n    }\n    MdIconModule.forRoot = function () {\n        return {\n            ngModule: MdIconModule,\n            providers: [MdIconRegistry],\n        };\n    };\n    MdIconModule = __decorate$41([\n        _angular_core.NgModule({\n            imports: [_angular_http.HttpModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdIcon, DefaultStyleCompatibilityModeModule],\n            declarations: [MdIcon],\n        }), \n        __metadata$41('design:paramtypes', [])\n    ], MdIconModule);\n    return MdIconModule;\n}());\n\nvar __extends$12 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$43 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$43 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// TODO(josephperrott): Benchpress tests.\n/** A single degree in radians. */\nvar DEGREE_IN_RADIANS = Math.PI / 180;\n/** Duration of the indeterminate animation. */\nvar DURATION_INDETERMINATE = 667;\n/** Duration of the indeterminate animation. */\nvar DURATION_DETERMINATE = 225;\n/** Start animation value of the indeterminate animation */\nvar startIndeterminate = 3;\n/** End animation value of the indeterminate animation */\nvar endIndeterminate = 80;\n/* Maximum angle for the arc. The angle can't be exactly 360, because the arc becomes hidden. */\nvar MAX_ANGLE = 359.99 / 100;\n/**\n * <md-progress-spinner> component.\n */\nvar MdProgressSpinner = (function () {\n    function MdProgressSpinner(_changeDetectorRef, _ngZone, _elementRef) {\n        this._changeDetectorRef = _changeDetectorRef;\n        this._ngZone = _ngZone;\n        this._elementRef = _elementRef;\n        /** The id of the last requested animation. */\n        this._lastAnimationId = 0;\n        this._mode = 'determinate';\n        this.color = 'primary';\n    }\n    Object.defineProperty(MdProgressSpinner.prototype, \"_ariaValueMin\", {\n        /**\n         * Values for aria max and min are only defined as numbers when in a determinate mode.  We do this\n         * because voiceover does not report the progress indicator as indeterminate if the aria min\n         * and/or max value are number values.\n         */\n        get: function () {\n            return this.mode == 'determinate' ? 0 : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdProgressSpinner.prototype, \"_ariaValueMax\", {\n        get: function () {\n            return this.mode == 'determinate' ? 100 : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdProgressSpinner.prototype, \"interdeterminateInterval\", {\n        /** @docs-private */\n        get: function () {\n            return this._interdeterminateInterval;\n        },\n        /** @docs-private */\n        set: function (interval) {\n            clearInterval(this._interdeterminateInterval);\n            this._interdeterminateInterval = interval;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Clean up any animations that were running.\n     */\n    MdProgressSpinner.prototype.ngOnDestroy = function () {\n        this._cleanupIndeterminateAnimation();\n    };\n    Object.defineProperty(MdProgressSpinner.prototype, \"value\", {\n        get: function () {\n            if (this.mode == 'determinate') {\n                return this._value;\n            }\n        },\n        set: function (v) {\n            if (v != null && this.mode == 'determinate') {\n                var newValue = clamp(v);\n                this._animateCircle((this.value || 0), newValue, linearEase, DURATION_DETERMINATE, 0);\n                this._value = newValue;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdProgressSpinner.prototype, \"mode\", {\n        /**\n         * Mode of the progress circle\n         *\n         * Input must be one of the values from ProgressMode, defaults to 'determinate'.\n         * mode is bound to the host as the attribute host.\n         */\n        get: function () {\n            return this._mode;\n        },\n        set: function (m) {\n            if (m == 'indeterminate') {\n                this._startIndeterminateAnimation();\n            }\n            else {\n                this._cleanupIndeterminateAnimation();\n            }\n            this._mode = m;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Animates the circle from one percentage value to another.\n     *\n     * @param animateFrom The percentage of the circle filled starting the animation.\n     * @param animateTo The percentage of the circle filled ending the animation.\n     * @param ease The easing function to manage the pace of change in the animation.\n     * @param duration The length of time to show the animation, in milliseconds.\n     * @param rotation The starting angle of the circle fill, with 0° represented at the top center\n     *    of the circle.\n     */\n    MdProgressSpinner.prototype._animateCircle = function (animateFrom, animateTo, ease, duration, rotation) {\n        var _this = this;\n        var id = ++this._lastAnimationId;\n        var startTime = Date.now();\n        var changeInValue = animateTo - animateFrom;\n        // No need to animate it if the values are the same\n        if (animateTo === animateFrom) {\n            this._renderArc(animateTo, rotation);\n        }\n        else {\n            var animation_1 = function () {\n                var elapsedTime = Math.max(0, Math.min(Date.now() - startTime, duration));\n                _this._renderArc(ease(elapsedTime, animateFrom, changeInValue, duration), rotation);\n                // Prevent overlapping animations by checking if a new animation has been called for and\n                // if the animation has lasted longer than the animation duration.\n                if (id === _this._lastAnimationId && elapsedTime < duration) {\n                    requestAnimationFrame(animation_1);\n                }\n            };\n            // Run the animation outside of Angular's zone, in order to avoid\n            // hitting ZoneJS and change detection on each frame.\n            this._ngZone.runOutsideAngular(animation_1);\n        }\n    };\n    /**\n     * Starts the indeterminate animation interval, if it is not already running.\n     */\n    MdProgressSpinner.prototype._startIndeterminateAnimation = function () {\n        var _this = this;\n        var rotationStartPoint = 0;\n        var start = startIndeterminate;\n        var end = endIndeterminate;\n        var duration = DURATION_INDETERMINATE;\n        var animate$$1 = function () {\n            _this._animateCircle(start, end, materialEase, duration, rotationStartPoint);\n            // Prevent rotation from reaching Number.MAX_SAFE_INTEGER.\n            rotationStartPoint = (rotationStartPoint + end) % 100;\n            var temp = start;\n            start = -end;\n            end = -temp;\n        };\n        if (!this.interdeterminateInterval) {\n            this._ngZone.runOutsideAngular(function () {\n                _this.interdeterminateInterval = setInterval(animate$$1, duration + 50, 0, false);\n                animate$$1();\n            });\n        }\n    };\n    /**\n     * Removes interval, ending the animation.\n     */\n    MdProgressSpinner.prototype._cleanupIndeterminateAnimation = function () {\n        this.interdeterminateInterval = null;\n    };\n    /**\n     * Renders the arc onto the SVG element. Proxies `getArc` while setting the proper\n     * DOM attribute on the `<path>`.\n     */\n    MdProgressSpinner.prototype._renderArc = function (currentValue, rotation) {\n        // Caches the path reference so it doesn't have to be looked up every time.\n        var path = this._path = this._path || this._elementRef.nativeElement.querySelector('path');\n        // Ensure that the path was found. This may not be the case if the\n        // animation function fires too early.\n        if (path) {\n            path.setAttribute('d', getSvgArc(currentValue, rotation));\n        }\n    };\n    __decorate$43([\n        _angular_core.Input(),\n        _angular_core.HostBinding('attr.aria-valuenow'), \n        __metadata$43('design:type', Object)\n    ], MdProgressSpinner.prototype, \"value\", null);\n    __decorate$43([\n        _angular_core.HostBinding('attr.mode'),\n        _angular_core.Input(), \n        __metadata$43('design:type', Object)\n    ], MdProgressSpinner.prototype, \"mode\", null);\n    __decorate$43([\n        _angular_core.Input(), \n        __metadata$43('design:type', Object)\n    ], MdProgressSpinner.prototype, \"color\", void 0);\n    MdProgressSpinner = __decorate$43([\n        _angular_core.Component({selector: 'md-progress-spinner, mat-progress-spinner, md-progress-circle, mat-progress-circle',\n            host: {\n                'role': 'progressbar',\n                '[attr.aria-valuemin]': '_ariaValueMin',\n                '[attr.aria-valuemax]': '_ariaValueMax',\n                '[class.md-primary]': 'color == \"primary\"',\n                '[class.md-accent]': 'color == \"accent\"',\n                '[class.md-warn]': 'color == \"warn\"',\n            },\n            template: \"<svg viewBox=\\\"0 0 100 100\\\" preserveAspectRatio=\\\"xMidYMid meet\\\"><path></path></svg>\",\n            styles: [\":host{display:block;height:100px;width:100px;overflow:hidden}:host svg{height:100%;width:100%;transform-origin:center}:host path{fill:transparent;stroke-width:10px}:host[mode=indeterminate] svg{animation-duration:5.25s,2.887s;animation-name:md-progress-spinner-sporadic-rotate,md-progress-spinner-linear-rotate;animation-timing-function:cubic-bezier(.35,0,.25,1),linear;animation-iteration-count:infinite;transition:none}@keyframes md-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes md-progress-spinner-sporadic-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}\"],\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$43('design:paramtypes', [_angular_core.ChangeDetectorRef, _angular_core.NgZone, _angular_core.ElementRef])\n    ], MdProgressSpinner);\n    return MdProgressSpinner;\n}());\n/**\n * <md-spinner> component.\n *\n * This is a component definition to be used as a convenience reference to create an\n * indeterminate <md-progress-spinner> instance.\n */\nvar MdSpinner = (function (_super) {\n    __extends$12(MdSpinner, _super);\n    function MdSpinner(changeDetectorRef, elementRef, ngZone) {\n        _super.call(this, changeDetectorRef, ngZone, elementRef);\n        this.mode = 'indeterminate';\n    }\n    MdSpinner.prototype.ngOnDestroy = function () {\n        // The `ngOnDestroy` from `MdProgressSpinner` should be called explicitly, because\n        // in certain cases Angular won't call it (e.g. when using AoT and in unit tests).\n        _super.prototype.ngOnDestroy.call(this);\n    };\n    MdSpinner = __decorate$43([\n        _angular_core.Component({selector: 'md-spinner, mat-spinner',\n            host: {\n                'role': 'progressbar',\n                'mode': 'indeterminate',\n            },\n            template: \"<svg viewBox=\\\"0 0 100 100\\\" preserveAspectRatio=\\\"xMidYMid meet\\\"><path></path></svg>\",\n            styles: [\":host{display:block;height:100px;width:100px;overflow:hidden}:host svg{height:100%;width:100%;transform-origin:center}:host path{fill:transparent;stroke-width:10px}:host[mode=indeterminate] svg{animation-duration:5.25s,2.887s;animation-name:md-progress-spinner-sporadic-rotate,md-progress-spinner-linear-rotate;animation-timing-function:cubic-bezier(.35,0,.25,1),linear;animation-iteration-count:infinite;transition:none}@keyframes md-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes md-progress-spinner-sporadic-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}\"],\n        }), \n        __metadata$43('design:paramtypes', [_angular_core.ChangeDetectorRef, _angular_core.ElementRef, _angular_core.NgZone])\n    ], MdSpinner);\n    return MdSpinner;\n}(MdProgressSpinner));\n/**\n * Module functions.\n */\n/** Clamps a value to be between 0 and 100. */\nfunction clamp(v) {\n    return Math.max(0, Math.min(100, v));\n}\n/**\n * Converts Polar coordinates to Cartesian.\n */\nfunction polarToCartesian(radius, pathRadius, angleInDegrees) {\n    var angleInRadians = (angleInDegrees - 90) * DEGREE_IN_RADIANS;\n    return (radius + (pathRadius * Math.cos(angleInRadians))) +\n        ',' + (radius + (pathRadius * Math.sin(angleInRadians)));\n}\n/**\n * Easing function for linear animation.\n */\nfunction linearEase(currentTime, startValue, changeInValue, duration) {\n    return changeInValue * currentTime / duration + startValue;\n}\n/**\n * Easing function to match material design indeterminate animation.\n */\nfunction materialEase(currentTime, startValue, changeInValue, duration) {\n    var time = currentTime / duration;\n    var timeCubed = Math.pow(time, 3);\n    var timeQuad = Math.pow(time, 4);\n    var timeQuint = Math.pow(time, 5);\n    return startValue + changeInValue * ((6 * timeQuint) + (-15 * timeQuad) + (10 * timeCubed));\n}\n/**\n * Determines the path value to define the arc.  Converting percentage values to to polar\n * coordinates on the circle, and then to cartesian coordinates in the viewport.\n *\n * @param currentValue The current percentage value of the progress circle, the percentage of the\n *    circle to fill.\n * @param rotation The starting point of the circle with 0 being the 0 degree point.\n * @return A string for an SVG path representing a circle filled from the starting point to the\n *    percentage value provided.\n */\nfunction getSvgArc(currentValue, rotation) {\n    var startPoint = rotation || 0;\n    var radius = 50;\n    var pathRadius = 40;\n    var startAngle = startPoint * MAX_ANGLE;\n    var endAngle = currentValue * MAX_ANGLE;\n    var start = polarToCartesian(radius, pathRadius, startAngle);\n    var end = polarToCartesian(radius, pathRadius, endAngle + startAngle);\n    var arcSweep = endAngle < 0 ? 0 : 1;\n    var largeArcFlag;\n    if (endAngle < 0) {\n        largeArcFlag = endAngle >= -180 ? 0 : 1;\n    }\n    else {\n        largeArcFlag = endAngle <= 180 ? 0 : 1;\n    }\n    return \"M\" + start + \"A\" + pathRadius + \",\" + pathRadius + \" 0 \" + largeArcFlag + \",\" + arcSweep + \" \" + end;\n}\nvar MdProgressSpinnerModule = (function () {\n    function MdProgressSpinnerModule() {\n    }\n    MdProgressSpinnerModule.forRoot = function () {\n        return {\n            ngModule: MdProgressSpinnerModule,\n            providers: []\n        };\n    };\n    MdProgressSpinnerModule = __decorate$43([\n        _angular_core.NgModule({\n            imports: [DefaultStyleCompatibilityModeModule],\n            exports: [MdProgressSpinner, MdSpinner, DefaultStyleCompatibilityModeModule],\n            declarations: [MdProgressSpinner, MdSpinner],\n        }), \n        __metadata$43('design:paramtypes', [])\n    ], MdProgressSpinnerModule);\n    return MdProgressSpinnerModule;\n}());\n\n/** @deprecated */\n\nvar __decorate$44 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$44 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// TODO(josephperrott): Benchpress tests.\n// TODO(josephperrott): Add ARIA attributes for progressbar \"for\".\n/**\n * <md-progress-bar> component.\n */\nvar MdProgressBar = (function () {\n    function MdProgressBar() {\n        /** Color of the progress bar. */\n        this.color = 'primary';\n        this._value = 0;\n        this._bufferValue = 0;\n        /**\n         * Mode of the progress bar.\n         *\n         * Input must be one of these values: determinate, indeterminate, buffer, query, defaults to\n         * 'determinate'.\n         * Mirrored to mode attribute.\n         */\n        this.mode = 'determinate';\n    }\n    Object.defineProperty(MdProgressBar.prototype, \"value\", {\n        /** Value of the progressbar. Defaults to zero. Mirrored to aria-valuenow. */\n        get: function () { return this._value; },\n        set: function (v) { this._value = clamp$1(v || 0); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdProgressBar.prototype, \"bufferValue\", {\n        /** Buffer value of the progress bar. Defaults to zero. */\n        get: function () { return this._bufferValue; },\n        set: function (v) { this._bufferValue = clamp$1(v || 0); },\n        enumerable: true,\n        configurable: true\n    });\n    /** Gets the current transform value for the progress bar's primary indicator. */\n    MdProgressBar.prototype._primaryTransform = function () {\n        var scale = this.value / 100;\n        return { transform: \"scaleX(\" + scale + \")\" };\n    };\n    /**\n     * Gets the current transform value for the progress bar's buffer indicator.  Only used if the\n     * progress mode is set to buffer, otherwise returns an undefined, causing no transformation.\n     */\n    MdProgressBar.prototype._bufferTransform = function () {\n        if (this.mode == 'buffer') {\n            var scale = this.bufferValue / 100;\n            return { transform: \"scaleX(\" + scale + \")\" };\n        }\n    };\n    __decorate$44([\n        _angular_core.Input(), \n        __metadata$44('design:type', Object)\n    ], MdProgressBar.prototype, \"color\", void 0);\n    __decorate$44([\n        _angular_core.Input(),\n        _angular_core.HostBinding('attr.aria-valuenow'), \n        __metadata$44('design:type', Object)\n    ], MdProgressBar.prototype, \"value\", null);\n    __decorate$44([\n        _angular_core.Input(), \n        __metadata$44('design:type', Object)\n    ], MdProgressBar.prototype, \"bufferValue\", null);\n    __decorate$44([\n        _angular_core.Input(),\n        _angular_core.HostBinding('attr.mode'), \n        __metadata$44('design:type', Object)\n    ], MdProgressBar.prototype, \"mode\", void 0);\n    MdProgressBar = __decorate$44([\n        _angular_core.Component({selector: 'md-progress-bar, mat-progress-bar',\n            host: {\n                'role': 'progressbar',\n                'aria-valuemin': '0',\n                'aria-valuemax': '100',\n                '[class.md-primary]': 'color == \"primary\"',\n                '[class.md-accent]': 'color == \"accent\"',\n                '[class.md-warn]': 'color == \"warn\"',\n            },\n            template: \"<div class=\\\"md-progress-bar-background\\\"></div><div class=\\\"md-progress-bar-buffer\\\" [ngStyle]=\\\"_bufferTransform()\\\"></div><div class=\\\"md-progress-bar-primary md-progress-bar-fill\\\" [ngStyle]=\\\"_primaryTransform()\\\"></div><div class=\\\"md-progress-bar-secondary md-progress-bar-fill\\\"></div>\",\n            styles: [\":host{display:block;height:5px;overflow:hidden;position:relative;transform:translateZ(0);transition:opacity 250ms linear;width:100%}:host .md-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;height:100%;position:absolute;visibility:hidden;width:100%}:host .md-progress-bar-buffer{height:100%;position:absolute;transform-origin:top left;transition:transform 250ms ease;width:100%}:host .md-progress-bar-secondary{visibility:hidden}:host .md-progress-bar-fill{animation:none;height:100%;position:absolute;transform-origin:top left;transition:transform 250ms ease;width:100%}:host .md-progress-bar-fill::after{animation:none;content:'';display:inline-block;height:100%;position:absolute;width:100%;left:0}:host[mode=query]{transform:rotateZ(180deg)}:host[mode=query] .md-progress-bar-fill,:host[mode=indeterminate] .md-progress-bar-fill{transition:none}:host[mode=query] .md-progress-bar-primary,:host[mode=indeterminate] .md-progress-bar-primary{animation:md-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}:host[mode=query] .md-progress-bar-primary.md-progress-bar-fill::after,:host[mode=indeterminate] .md-progress-bar-primary.md-progress-bar-fill::after{animation:md-progress-bar-primary-indeterminate-scale 2s infinite linear}:host[mode=query] .md-progress-bar-secondary,:host[mode=indeterminate] .md-progress-bar-secondary{animation:md-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;visibility:visible}:host[mode=query] .md-progress-bar-secondary.md-progress-bar-fill::after,:host[mode=indeterminate] .md-progress-bar-secondary.md-progress-bar-fill::after{animation:md-progress-bar-secondary-indeterminate-scale 2s infinite linear}:host[mode=buffer] .md-progress-bar-background{animation:md-progress-bar-background-scroll 250ms infinite linear;visibility:visible}:host-context([dir=rtl]){transform:rotateY(180deg)}@keyframes md-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes md-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes md-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes md-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes md-progress-bar-background-scroll{to{transform:translateX(-10px)}}\"],\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n        }), \n        __metadata$44('design:paramtypes', [])\n    ], MdProgressBar);\n    return MdProgressBar;\n}());\n/** Clamps a value to be between two numbers, by default 0 and 100. */\nfunction clamp$1(v, min, max) {\n    if (min === void 0) { min = 0; }\n    if (max === void 0) { max = 100; }\n    return Math.max(min, Math.min(max, v));\n}\nvar MdProgressBarModule = (function () {\n    function MdProgressBarModule() {\n    }\n    MdProgressBarModule.forRoot = function () {\n        return {\n            ngModule: MdProgressBarModule,\n            providers: []\n        };\n    };\n    MdProgressBarModule = __decorate$44([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdProgressBar, DefaultStyleCompatibilityModeModule],\n            declarations: [MdProgressBar],\n        }), \n        __metadata$44('design:paramtypes', [])\n    ], MdProgressBarModule);\n    return MdProgressBarModule;\n}());\n\nvar __decorate$45 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$45 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive to automatically resize a textarea to fit its content.\n */\nvar MdTextareaAutosize = (function () {\n    function MdTextareaAutosize(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n    Object.defineProperty(MdTextareaAutosize.prototype, \"_minHeight\", {\n        /** The minimum height of the textarea as determined by minRows. */\n        get: function () {\n            return this.minRows ? this.minRows * this._cachedLineHeight + \"px\" : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTextareaAutosize.prototype, \"_maxHeight\", {\n        /** The maximum height of the textarea as determined by maxRows. */\n        get: function () {\n            return this.maxRows ? this.maxRows * this._cachedLineHeight + \"px\" : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdTextareaAutosize.prototype.ngOnInit = function () {\n        this._cacheTextareaLineHeight();\n        this.resizeToFitContent();\n    };\n    /**\n     * Cache the height of a single-row textarea.\n     *\n     * We need to know how large a single \"row\" of a textarea is in order to apply minRows and\n     * maxRows. For the initial version, we will assume that the height of a single line in the\n     * textarea does not ever change.\n     */\n    MdTextareaAutosize.prototype._cacheTextareaLineHeight = function () {\n        var textarea = this._elementRef.nativeElement;\n        // Use a clone element because we have to override some styles.\n        var textareaClone = textarea.cloneNode(false);\n        textareaClone.rows = 1;\n        // Use `position: absolute` so that this doesn't cause a browser layout and use\n        // `visibility: hidden` so that nothing is rendered. Clear any other styles that\n        // would affect the height.\n        textareaClone.style.position = 'absolute';\n        textareaClone.style.visibility = 'hidden';\n        textareaClone.style.border = 'none';\n        textareaClone.style.padding = '';\n        textareaClone.style.height = '';\n        textareaClone.style.minHeight = '';\n        textareaClone.style.maxHeight = '';\n        textarea.parentNode.appendChild(textareaClone);\n        this._cachedLineHeight = textareaClone.offsetHeight;\n        textarea.parentNode.removeChild(textareaClone);\n    };\n    /** Resize the textarea to fit its content. */\n    MdTextareaAutosize.prototype.resizeToFitContent = function () {\n        var textarea = this._elementRef.nativeElement;\n        // Reset the textarea height to auto in order to shrink back to its default size.\n        textarea.style.height = 'auto';\n        // Use the scrollHeight to know how large the textarea *would* be if fit its entire value.\n        textarea.style.height = textarea.scrollHeight + \"px\";\n    };\n    __decorate$45([\n        _angular_core.Input(), \n        __metadata$45('design:type', Number)\n    ], MdTextareaAutosize.prototype, \"minRows\", void 0);\n    __decorate$45([\n        _angular_core.Input(), \n        __metadata$45('design:type', Number)\n    ], MdTextareaAutosize.prototype, \"maxRows\", void 0);\n    MdTextareaAutosize = __decorate$45([\n        _angular_core.Directive({\n            selector: 'textarea[md-autosize], textarea[mat-autosize]',\n            host: {\n                '(input)': 'resizeToFitContent()',\n                '[style.min-height]': '_minHeight',\n                '[style.max-height]': '_maxHeight',\n            },\n        }), \n        __metadata$45('design:paramtypes', [_angular_core.ElementRef])\n    ], MdTextareaAutosize);\n    return MdTextareaAutosize;\n}());\n\nvar __extends$14 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/** @docs-private */\nvar MdInputContainerPlaceholderConflictError = (function (_super) {\n    __extends$14(MdInputContainerPlaceholderConflictError, _super);\n    function MdInputContainerPlaceholderConflictError() {\n        _super.call(this, 'Placeholder attribute and child element were both specified.');\n    }\n    return MdInputContainerPlaceholderConflictError;\n}(MdError));\n/** @docs-private */\nvar MdInputContainerUnsupportedTypeError = (function (_super) {\n    __extends$14(MdInputContainerUnsupportedTypeError, _super);\n    function MdInputContainerUnsupportedTypeError(type) {\n        _super.call(this, \"Input type \\\"\" + type + \"\\\" isn't supported by md-input-container.\");\n    }\n    return MdInputContainerUnsupportedTypeError;\n}(MdError));\n/** @docs-private */\nvar MdInputContainerDuplicatedHintError = (function (_super) {\n    __extends$14(MdInputContainerDuplicatedHintError, _super);\n    function MdInputContainerDuplicatedHintError(align) {\n        _super.call(this, \"A hint was already declared for 'align=\\\"\" + align + \"\\\"'.\");\n    }\n    return MdInputContainerDuplicatedHintError;\n}(MdError));\n/** @docs-private */\nvar MdInputContainerMissingMdInputError = (function (_super) {\n    __extends$14(MdInputContainerMissingMdInputError, _super);\n    function MdInputContainerMissingMdInputError() {\n        _super.call(this, 'md-input-container must contain an md-input directive. Did you forget to add md-input ' +\n            'to the native input or textarea element?');\n    }\n    return MdInputContainerMissingMdInputError;\n}(MdError));\n\nvar __decorate$47 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$47 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$10 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n// Invalid input type. Using one of these will throw an MdInputContainerUnsupportedTypeError.\nvar MD_INPUT_INVALID_TYPES = [\n    'button',\n    'checkbox',\n    'color',\n    'file',\n    'hidden',\n    'image',\n    'radio',\n    'range',\n    'reset',\n    'submit'\n];\nvar nextUniqueId$2 = 0;\n/**\n * The placeholder directive. The content can declare this to implement more\n * complex placeholders.\n */\nvar MdPlaceholder = (function () {\n    function MdPlaceholder() {\n    }\n    MdPlaceholder = __decorate$47([\n        _angular_core.Directive({\n            selector: 'md-placeholder, mat-placeholder'\n        }), \n        __metadata$47('design:paramtypes', [])\n    ], MdPlaceholder);\n    return MdPlaceholder;\n}());\n/** The hint directive, used to tag content as hint labels (going under the input). */\nvar MdHint = (function () {\n    function MdHint() {\n        // Whether to align the hint label at the start or end of the line.\n        this.align = 'start';\n    }\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdHint.prototype, \"align\", void 0);\n    MdHint = __decorate$47([\n        _angular_core.Directive({\n            selector: 'md-hint, mat-hint',\n            host: {\n                'class': 'md-hint',\n                '[class.md-right]': 'align == \"end\"',\n            }\n        }), \n        __metadata$47('design:paramtypes', [])\n    ], MdHint);\n    return MdHint;\n}());\n/** The input directive, used to mark the input that `MdInputContainer` is wrapping. */\nvar MdInputDirective = (function () {\n    function MdInputDirective(_elementRef, _renderer, _ngControl) {\n        var _this = this;\n        this._elementRef = _elementRef;\n        this._renderer = _renderer;\n        this._ngControl = _ngControl;\n        this._disabled = false;\n        this._placeholder = '';\n        this._required = false;\n        this._type = 'text';\n        /**\n         * Emits an event when the placeholder changes so that the `md-input-container` can re-validate.\n         */\n        this._placeholderChange = new _angular_core.EventEmitter();\n        this.focused = false;\n        this._neverEmptyInputTypes = [\n            'date',\n            'datetime',\n            'datetime-local',\n            'month',\n            'time',\n            'week'\n        ].filter(function (t) { return getSupportedInputTypes().has(t); });\n        // Force setter to be called in case id was not specified.\n        this.id = this.id;\n        if (this._ngControl && this._ngControl.valueChanges) {\n            this._ngControl.valueChanges.subscribe(function (value) {\n                _this.value = value;\n            });\n        }\n    }\n    Object.defineProperty(MdInputDirective.prototype, \"disabled\", {\n        /** Whether the element is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputDirective.prototype, \"id\", {\n        /** Unique id of the element. */\n        get: function () { return this._id; },\n        set: function (value) { this._id = value || this._uid; },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdInputDirective.prototype, \"placeholder\", {\n        /** Placeholder attribute of the element. */\n        get: function () { return this._placeholder; },\n        set: function (value) {\n            if (this._placeholder != value) {\n                this._placeholder = value;\n                this._placeholderChange.emit(this._placeholder);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputDirective.prototype, \"required\", {\n        /** Whether the element is required. */\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputDirective.prototype, \"type\", {\n        /** Input type of the element. */\n        get: function () { return this._type; },\n        set: function (value) {\n            this._type = value || 'text';\n            this._validateType();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputDirective.prototype, \"empty\", {\n        get: function () { return (this.value == null || this.value === '') && !this._isNeverEmpty(); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputDirective.prototype, \"_uid\", {\n        get: function () { return this._cachedUid = this._cachedUid || \"md-input-\" + nextUniqueId$2++; },\n        enumerable: true,\n        configurable: true\n    });\n    MdInputDirective.prototype.ngAfterContentInit = function () {\n        this.value = this._elementRef.nativeElement.value;\n    };\n    /** Focuses the input element. */\n    MdInputDirective.prototype.focus = function () { this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus'); };\n    MdInputDirective.prototype._onFocus = function () { this.focused = true; };\n    MdInputDirective.prototype._onBlur = function () { this.focused = false; };\n    MdInputDirective.prototype._onInput = function () { this.value = this._elementRef.nativeElement.value; };\n    /** Make sure the input is a supported type. */\n    MdInputDirective.prototype._validateType = function () {\n        if (MD_INPUT_INVALID_TYPES.indexOf(this._type) != -1) {\n            throw new MdInputContainerUnsupportedTypeError(this._type);\n        }\n    };\n    MdInputDirective.prototype._isNeverEmpty = function () { return this._neverEmptyInputTypes.indexOf(this._type) != -1; };\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"disabled\", null);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"id\", null);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"placeholder\", null);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"required\", null);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"type\", null);\n    __decorate$47([\n        _angular_core.Output(), \n        __metadata$47('design:type', Object)\n    ], MdInputDirective.prototype, \"_placeholderChange\", void 0);\n    MdInputDirective = __decorate$47([\n        _angular_core.Directive({\n            selector: 'input[md-input], textarea[md-input], input[mat-input], textarea[mat-input]',\n            host: {\n                'class': 'md-input-element',\n                '[id]': 'id',\n                '(blur)': '_onBlur()',\n                '(focus)': '_onFocus()',\n                '(input)': '_onInput()',\n            }\n        }),\n        __param$10(2, _angular_core.Optional()), \n        __metadata$47('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer, _angular_forms.NgControl])\n    ], MdInputDirective);\n    return MdInputDirective;\n}());\n/**\n * Component that represents a text input. It encapsulates the <input> HTMLElement and\n * improve on its behaviour, along with styling it according to the Material Design.\n */\nvar MdInputContainer = (function () {\n    function MdInputContainer() {\n        /** Alignment of the input container's content. */\n        this.align = 'start';\n        /** Color of the input divider, based on the theme. */\n        this.dividerColor = 'primary';\n        this._hintLabel = '';\n        this._floatingPlaceholder = true;\n    }\n    Object.defineProperty(MdInputContainer.prototype, \"hintLabel\", {\n        /** Text for the input hint. */\n        get: function () { return this._hintLabel; },\n        set: function (value) {\n            this._hintLabel = value;\n            this._validateHints();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInputContainer.prototype, \"floatingPlaceholder\", {\n        /** Text or the floating placeholder. */\n        get: function () { return this._floatingPlaceholder; },\n        set: function (value) { this._floatingPlaceholder = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdInputContainer.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        if (!this._mdInputChild) {\n            throw new MdInputContainerMissingMdInputError();\n        }\n        this._validateHints();\n        this._validatePlaceholders();\n        // Re-validate when things change.\n        this._hintChildren.changes.subscribe(function () {\n            _this._validateHints();\n        });\n        this._mdInputChild._placeholderChange.subscribe(function () {\n            _this._validatePlaceholders();\n        });\n    };\n    MdInputContainer.prototype._isUntouched = function () { return this._hasNgControl() && this._mdInputChild._ngControl.untouched; };\n    MdInputContainer.prototype._isTouched = function () { return this._hasNgControl() && this._mdInputChild._ngControl.touched; };\n    MdInputContainer.prototype._isPristine = function () { return this._hasNgControl() && this._mdInputChild._ngControl.pristine; };\n    MdInputContainer.prototype._isDirty = function () { return this._hasNgControl() && this._mdInputChild._ngControl.dirty; };\n    MdInputContainer.prototype._isValid = function () { return this._hasNgControl() && this._mdInputChild._ngControl.valid; };\n    MdInputContainer.prototype._isInvalid = function () { return this._hasNgControl() && this._mdInputChild._ngControl.invalid; };\n    MdInputContainer.prototype._isPending = function () { return this._hasNgControl() && this._mdInputChild._ngControl.pending; };\n    /** Whether the input has a placeholder. */\n    MdInputContainer.prototype._hasPlaceholder = function () { return !!(this._mdInputChild.placeholder || this._placeholderChild); };\n    MdInputContainer.prototype._focusInput = function () { this._mdInputChild.focus(); };\n    MdInputContainer.prototype._hasNgControl = function () { return !!(this._mdInputChild && this._mdInputChild._ngControl); };\n    /**\n     * Ensure that there is only one placeholder (either `input` attribute or child element with the\n     * `md-placeholder` attribute.\n     */\n    MdInputContainer.prototype._validatePlaceholders = function () {\n        if (this._mdInputChild.placeholder && this._placeholderChild) {\n            throw new MdInputContainerPlaceholderConflictError();\n        }\n    };\n    /**\n     * Ensure that there is a maximum of one of each `<md-hint>` alignment specified, with the\n     * attribute being considered as `align=\"start\"`.\n     */\n    MdInputContainer.prototype._validateHints = function () {\n        var _this = this;\n        if (this._hintChildren) {\n            var startHint_1 = null;\n            var endHint_1 = null;\n            this._hintChildren.forEach(function (hint) {\n                if (hint.align == 'start') {\n                    if (startHint_1 || _this.hintLabel) {\n                        throw new MdInputContainerDuplicatedHintError('start');\n                    }\n                    startHint_1 = hint;\n                }\n                else if (hint.align == 'end') {\n                    if (endHint_1) {\n                        throw new MdInputContainerDuplicatedHintError('end');\n                    }\n                    endHint_1 = hint;\n                }\n            });\n        }\n    };\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputContainer.prototype, \"align\", void 0);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputContainer.prototype, \"dividerColor\", void 0);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Object)\n    ], MdInputContainer.prototype, \"hintLabel\", null);\n    __decorate$47([\n        _angular_core.Input(), \n        __metadata$47('design:type', Boolean)\n    ], MdInputContainer.prototype, \"floatingPlaceholder\", null);\n    __decorate$47([\n        _angular_core.ContentChild(MdInputDirective), \n        __metadata$47('design:type', MdInputDirective)\n    ], MdInputContainer.prototype, \"_mdInputChild\", void 0);\n    __decorate$47([\n        _angular_core.ContentChild(MdPlaceholder), \n        __metadata$47('design:type', MdPlaceholder)\n    ], MdInputContainer.prototype, \"_placeholderChild\", void 0);\n    __decorate$47([\n        _angular_core.ContentChildren(MdHint), \n        __metadata$47('design:type', _angular_core.QueryList)\n    ], MdInputContainer.prototype, \"_hintChildren\", void 0);\n    MdInputContainer = __decorate$47([\n        _angular_core.Component({selector: 'md-input-container, mat-input-container',\n            template: \"<div class=\\\"md-input-wrapper\\\"><div class=\\\"md-input-table\\\"><div class=\\\"md-input-prefix\\\"><ng-content select=\\\"[md-prefix]\\\"></ng-content></div><div class=\\\"md-input-infix\\\" [class.md-end]=\\\"align == 'end'\\\"><ng-content selector=\\\"input, textarea\\\"></ng-content><label class=\\\"md-input-placeholder\\\" [attr.for]=\\\"_mdInputChild.id\\\" [class.md-empty]=\\\"_mdInputChild.empty\\\" [class.md-focused]=\\\"_mdInputChild.focused\\\" [class.md-float]=\\\"floatingPlaceholder\\\" [class.md-accent]=\\\"dividerColor == 'accent'\\\" [class.md-warn]=\\\"dividerColor == 'warn'\\\" *ngIf=\\\"_hasPlaceholder()\\\"><ng-content select=\\\"md-placeholder\\\"></ng-content>{{_mdInputChild.placeholder}} <span class=\\\"md-placeholder-required\\\" *ngIf=\\\"_mdInputChild.required\\\">*</span></label></div><div class=\\\"md-input-suffix\\\"><ng-content select=\\\"[md-suffix]\\\"></ng-content></div></div><div class=\\\"md-input-underline\\\" [class.md-disabled]=\\\"_mdInputChild.disabled\\\"><span class=\\\"md-input-ripple\\\" [class.md-focused]=\\\"_mdInputChild.focused\\\" [class.md-accent]=\\\"dividerColor == 'accent'\\\" [class.md-warn]=\\\"dividerColor == 'warn'\\\"></span></div><div *ngIf=\\\"hintLabel != ''\\\" class=\\\"md-hint\\\">{{hintLabel}}</div><ng-content select=\\\"md-hint\\\"></ng-content></div>\",\n            styles: [\"md-input,md-textarea{display:inline-block;position:relative;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;line-height:normal;text-align:left}.md-input-element.md-end,[dir=rtl] md-input,[dir=rtl] md-textarea{text-align:right}.md-input-wrapper{margin:16px 0}.md-input-table{display:inline-table;flex-flow:column;vertical-align:bottom;width:100%}.md-input-table>*{display:table-cell}.md-input-infix{position:relative}.md-input-element{font:inherit;background:0 0;color:currentColor;border:none;outline:0;padding:0;width:100%}[dir=rtl] .md-input-element.md-end{text-align:left}.md-input-element:-moz-ui-invalid{box-shadow:none}.md-input-element:-webkit-autofill+.md-input-placeholder.md-float{display:block;padding-bottom:5px;transform:translateY(-100%) scale(.75);width:133.33333%}.md-input-placeholder{position:absolute;left:0;top:0;font-size:100%;pointer-events:none;z-index:1;width:100%;display:none;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden;transform:translateY(0);transform-origin:bottom left;transition:transform .4s cubic-bezier(.25,.8,.25,1),scale .4s cubic-bezier(.25,.8,.25,1),color .4s cubic-bezier(.25,.8,.25,1),width .4s cubic-bezier(.25,.8,.25,1)}.md-input-placeholder.md-empty{display:block;cursor:text}.md-input-placeholder.md-float.md-focused,.md-input-placeholder.md-float:not(.md-empty){display:block;padding-bottom:5px;transform:translateY(-100%) scale(.75);width:133.33333%}[dir=rtl] .md-input-placeholder{transform-origin:bottom right;left:auto;right:0}.md-input-underline{position:absolute;height:1px;width:100%;margin-top:4px;border-top-width:1px;border-top-style:solid}.md-input-underline.md-disabled{background-image:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x;border-top:0;background-position:0}.md-input-underline .md-input-ripple{position:absolute;height:2px;z-index:1;top:-1px;width:100%;transform-origin:top;opacity:0;transform:scaleY(0);transition:transform .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.md-input-underline .md-input-ripple.md-focused{opacity:1;transform:scaleY(1)}.md-hint{display:block;position:absolute;font-size:75%;bottom:-.5em}.md-hint.md-right{right:0}[dir=rtl] .md-hint{right:0;left:auto}[dir=rtl] .md-hint.md-right{right:auto;left:0}\",\n\"md-input-container{display:inline-block;position:relative;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;line-height:normal;text-align:left}.md-end .md-input-element,[dir=rtl] md-input-container{text-align:right}.md-input-element::-webkit-input-placeholder{color:transparent}.md-input-element::-moz-placeholder{color:transparent}.md-input-element:-ms-input-placeholder{color:transparent}.md-input-element::placeholder{color:transparent}[dir=rtl] .md-end .md-input-element{text-align:left}\"],\n            host: {\n                // Remove align attribute to prevent it from interfering with layout.\n                '[attr.align]': 'null',\n                '[class.ng-untouched]': '_isUntouched()',\n                '[class.ng-touched]': '_isTouched()',\n                '[class.ng-pristine]': '_isPristine()',\n                '[class.ng-dirty]': '_isDirty()',\n                '[class.ng-valid]': '_isValid()',\n                '[class.ng-invalid]': '_isInvalid()',\n                '[class.ng-pending]': '_isPending()',\n                '(click)': '_focusInput()',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$47('design:paramtypes', [])\n    ], MdInputContainer);\n    return MdInputContainer;\n}());\n\nvar __extends$13 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$46 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$46 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar noop = function () { };\nvar MD_INPUT_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdInput; }),\n    multi: true\n};\n// Invalid input type. Using one of these will throw an MdInputUnsupportedTypeError.\nvar MD_INPUT_INVALID_INPUT_TYPE = [\n    'file',\n    'radio',\n    'checkbox',\n];\nvar nextUniqueId$1 = 0;\n/** @docs-private */\nvar MdInputPlaceholderConflictError = (function (_super) {\n    __extends$13(MdInputPlaceholderConflictError, _super);\n    function MdInputPlaceholderConflictError() {\n        _super.call(this, 'Placeholder attribute and child element were both specified.');\n    }\n    return MdInputPlaceholderConflictError;\n}(MdError));\n/** @docs-private */\nvar MdInputUnsupportedTypeError = (function (_super) {\n    __extends$13(MdInputUnsupportedTypeError, _super);\n    function MdInputUnsupportedTypeError(type) {\n        _super.call(this, \"Input type \\\"\" + type + \"\\\" isn't supported by md-input.\");\n    }\n    return MdInputUnsupportedTypeError;\n}(MdError));\n/** @docs-private */\nvar MdInputDuplicatedHintError = (function (_super) {\n    __extends$13(MdInputDuplicatedHintError, _super);\n    function MdInputDuplicatedHintError(align) {\n        _super.call(this, \"A hint was already declared for 'align=\\\"\" + align + \"\\\"'.\");\n    }\n    return MdInputDuplicatedHintError;\n}(MdError));\n/**\n * Component that represents a text input. It encapsulates the <input> HTMLElement and\n * improve on its behaviour, along with styling it according to the Material Design.\n * @deprecated\n * @docs-private\n */\nvar MdInput = (function () {\n    function MdInput(elementRef, _renderer) {\n        this._renderer = _renderer;\n        this._focused = false;\n        this._value = '';\n        /** Callback registered via registerOnTouched (ControlValueAccessor) */\n        this._onTouchedCallback = noop;\n        /** Callback registered via registerOnChange (ControlValueAccessor) */\n        this._onChangeCallback = noop;\n        /** Alignment of the input container's content. */\n        this.align = 'start';\n        /** Color of the input divider, based on the theme. */\n        this.dividerColor = 'primary';\n        /** Text for the input hint. */\n        this.hintLabel = '';\n        /** Unique id for the input element. */\n        this.id = \"md-input-\" + nextUniqueId$1++;\n        /** Mirrors the native `list` attribute. */\n        this.list = null;\n        /** Mirrors the native `max` attribute. */\n        this.max = null;\n        /** Mirrors the native `maxlength` attribute. */\n        this.maxlength = null;\n        /** Mirrors the native `min` attribute. */\n        this.min = null;\n        /** Mirrors the native `minlength` attribute. */\n        this.minlength = null;\n        /** Mirrors the native `placeholder` attribute. */\n        this.placeholder = null;\n        /** Mirrors the native `step` attribute. */\n        this.step = null;\n        /** Mirrors the native `tabindex` attribute. */\n        this.tabindex = null;\n        /** Mirrors the native `type` attribute. */\n        this.type = 'text';\n        /** Mirrors the native `name` attribute. */\n        this.name = null;\n        // textarea-specific\n        /** Mirrors the native `rows` attribute. */\n        this.rows = null;\n        /** Mirrors the native `cols` attribute. */\n        this.cols = null;\n        /** Whether to do a soft or hard wrap of the text.. */\n        this.wrap = null;\n        this._floatingPlaceholder = true;\n        this._autofocus = false;\n        this._disabled = false;\n        this._readonly = false;\n        this._required = false;\n        this._spellcheck = false;\n        this._blurEmitter = new _angular_core.EventEmitter();\n        this._focusEmitter = new _angular_core.EventEmitter();\n        // Set the element type depending on normalized selector used(md-input / md-textarea)\n        this._elementType = elementRef.nativeElement.nodeName.toLowerCase() === 'md-input' ?\n            'input' :\n            'textarea';\n    }\n    Object.defineProperty(MdInput.prototype, \"ariaDisabled\", {\n        /** Mirrors the native `aria-disabled` attribute. */\n        get: function () { return this._ariaDisabled; },\n        set: function (value) { this._ariaDisabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"ariaRequired\", {\n        /** Mirrors the native `aria-required` attribute. */\n        get: function () { return this._ariaRequired; },\n        set: function (value) { this._ariaRequired = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"ariaInvalid\", {\n        /** Mirrors the native `aria-invalid` attribute. */\n        get: function () { return this._ariaInvalid; },\n        set: function (value) { this._ariaInvalid = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"focused\", {\n        /** Readonly properties. */\n        /** Whether the element is focused. */\n        get: function () { return this._focused; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"empty\", {\n        /** Whether the element is empty. */\n        get: function () { return (this._value == null || this._value === '') && this.type !== 'date'; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"characterCount\", {\n        /** Amount of characters inside the element. */\n        get: function () {\n            return this.empty ? 0 : ('' + this._value).length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"inputId\", {\n        /** Unique element id. */\n        get: function () { return this.id + \"-input\"; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"floatingPlaceholder\", {\n        /** Text for the floating placeholder. */\n        get: function () { return this._floatingPlaceholder; },\n        set: function (value) { this._floatingPlaceholder = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"autofocus\", {\n        /** Whether to automatically focus the input. */\n        get: function () { return this._autofocus; },\n        set: function (value) { this._autofocus = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"disabled\", {\n        /** Whether the input is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"readonly\", {\n        /** Whether the input is readonly. */\n        get: function () { return this._readonly; },\n        set: function (value) { this._readonly = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"required\", {\n        /** Whether the input is required. */\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"spellcheck\", {\n        /** Whether spellchecking is enable on the input. */\n        get: function () { return this._spellcheck; },\n        set: function (value) { this._spellcheck = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"onBlur\", {\n        /** Event emitted when the input is blurred. */\n        get: function () {\n            return this._blurEmitter.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"onFocus\", {\n        /** Event emitted when the input is focused. */\n        get: function () {\n            return this._focusEmitter.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdInput.prototype, \"value\", {\n        /** Value of the input. */\n        get: function () { return this._value; },\n        set: function (v) {\n            v = this._convertValueForInputType(v);\n            if (v !== this._value) {\n                this._value = v;\n                this._onChangeCallback(v);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    \n    Object.defineProperty(MdInput.prototype, \"_align\", {\n        // This is to remove the `align` property of the `md-input` itself. Otherwise HTML5\n        // might place it as RTL when we don't want to. We still want to use `align` as an\n        // Input though, so we use HostBinding.\n        get: function () { return null; },\n        enumerable: true,\n        configurable: true\n    });\n    /** Set focus on input */\n    MdInput.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');\n    };\n    MdInput.prototype._handleFocus = function (event) {\n        this._focused = true;\n        this._focusEmitter.emit(event);\n    };\n    MdInput.prototype._handleBlur = function (event) {\n        this._focused = false;\n        this._onTouchedCallback();\n        this._blurEmitter.emit(event);\n    };\n    MdInput.prototype._handleChange = function (event) {\n        this.value = event.target.value;\n        this._onTouchedCallback();\n    };\n    MdInput.prototype._hasPlaceholder = function () {\n        return !!this.placeholder || this._placeholderChild != null;\n    };\n    /**\n     * Sets the model value of the input. Implemented as part of ControlValueAccessor.\n     * @param value Value to be set.\n     */\n    MdInput.prototype.writeValue = function (value) {\n        this._value = value;\n    };\n    /**\n     * Registers a callback to be triggered when the input value has changed.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdInput.prototype.registerOnChange = function (fn) {\n        this._onChangeCallback = fn;\n    };\n    /**\n     * Registers a callback to be triggered when the input has been touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    MdInput.prototype.registerOnTouched = function (fn) {\n        this._onTouchedCallback = fn;\n    };\n    /**\n     * Sets whether the input is disabled.\n     * Implemented as a part of ControlValueAccessor.\n     * @param isDisabled Whether the input should be disabled.\n     */\n    MdInput.prototype.setDisabledState = function (isDisabled) {\n        this.disabled = isDisabled;\n    };\n    MdInput.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        this._validateConstraints();\n        // Trigger validation when the hint children change.\n        this._hintChildren.changes.subscribe(function () {\n            _this._validateConstraints();\n        });\n    };\n    MdInput.prototype.ngOnChanges = function (changes) {\n        this._validateConstraints();\n    };\n    /**\n     * Convert the value passed in to a value that is expected from the type of the md-input.\n     * This is normally performed by the *_VALUE_ACCESSOR in forms, but since the type is bound\n     * on our internal input it won't work locally.\n     * @private\n     */\n    MdInput.prototype._convertValueForInputType = function (v) {\n        switch (this.type) {\n            case 'number': return parseFloat(v);\n            default: return v;\n        }\n    };\n    /**\n     * Ensure that all constraints defined by the API are validated, or throw errors otherwise.\n     * Constraints for now:\n     *   - placeholder attribute and <md-placeholder> are mutually exclusive.\n     *   - type attribute is not one of the forbidden types (see constant at the top).\n     *   - Maximum one of each `<md-hint>` alignment specified, with the attribute being\n     *     considered as align=\"start\".\n     * @private\n     */\n    MdInput.prototype._validateConstraints = function () {\n        var _this = this;\n        if (this.placeholder != '' && this.placeholder != null && this._placeholderChild != null) {\n            throw new MdInputPlaceholderConflictError();\n        }\n        if (MD_INPUT_INVALID_INPUT_TYPE.indexOf(this.type) != -1) {\n            throw new MdInputUnsupportedTypeError(this.type);\n        }\n        if (this._hintChildren) {\n            // Validate the hint labels.\n            var startHint_1 = null;\n            var endHint_1 = null;\n            this._hintChildren.forEach(function (hint) {\n                if (hint.align == 'start') {\n                    if (startHint_1 || _this.hintLabel) {\n                        throw new MdInputDuplicatedHintError('start');\n                    }\n                    startHint_1 = hint;\n                }\n                else if (hint.align == 'end') {\n                    if (endHint_1) {\n                        throw new MdInputDuplicatedHintError('end');\n                    }\n                    endHint_1 = hint;\n                }\n            });\n        }\n    };\n    __decorate$46([\n        _angular_core.Input('aria-label'), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"ariaLabel\", void 0);\n    __decorate$46([\n        _angular_core.Input('aria-labelledby'), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"ariaLabelledBy\", void 0);\n    __decorate$46([\n        _angular_core.Input('aria-disabled'), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"ariaDisabled\", null);\n    __decorate$46([\n        _angular_core.Input('aria-required'), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"ariaRequired\", null);\n    __decorate$46([\n        _angular_core.Input('aria-invalid'), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"ariaInvalid\", null);\n    __decorate$46([\n        _angular_core.ContentChild(MdPlaceholder), \n        __metadata$46('design:type', MdPlaceholder)\n    ], MdInput.prototype, \"_placeholderChild\", void 0);\n    __decorate$46([\n        _angular_core.ContentChildren(MdHint), \n        __metadata$46('design:type', _angular_core.QueryList)\n    ], MdInput.prototype, \"_hintChildren\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"align\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"dividerColor\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"hintLabel\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"autocomplete\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"autocorrect\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"autocapitalize\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"id\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"list\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"max\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"maxlength\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"min\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"minlength\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"placeholder\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"step\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"tabindex\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"type\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', String)\n    ], MdInput.prototype, \"name\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"rows\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Number)\n    ], MdInput.prototype, \"cols\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"wrap\", void 0);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"floatingPlaceholder\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"autofocus\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"disabled\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"readonly\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"required\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Boolean)\n    ], MdInput.prototype, \"spellcheck\", null);\n    __decorate$46([\n        _angular_core.Output('blur'), \n        __metadata$46('design:type', rxjs_Observable.Observable)\n    ], MdInput.prototype, \"onBlur\", null);\n    __decorate$46([\n        _angular_core.Output('focus'), \n        __metadata$46('design:type', rxjs_Observable.Observable)\n    ], MdInput.prototype, \"onFocus\", null);\n    __decorate$46([\n        _angular_core.Input(), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"value\", null);\n    __decorate$46([\n        _angular_core.HostBinding('attr.align'), \n        __metadata$46('design:type', Object)\n    ], MdInput.prototype, \"_align\", null);\n    __decorate$46([\n        _angular_core.ViewChild('input'), \n        __metadata$46('design:type', _angular_core.ElementRef)\n    ], MdInput.prototype, \"_inputElement\", void 0);\n    MdInput = __decorate$46([\n        _angular_core.Component({selector: 'md-input, md-textarea',\n            template: \"<div class=\\\"md-input-wrapper\\\"><div class=\\\"md-input-table\\\"><div class=\\\"md-input-prefix\\\"><ng-content select=\\\"[md-prefix]\\\"></ng-content></div><div class=\\\"md-input-infix\\\"><input #input *ngIf=\\\"_elementType === 'input'\\\" class=\\\"md-input-element\\\" [class.md-end]=\\\"align == 'end'\\\" [attr.aria-label]=\\\"ariaLabel\\\" [attr.aria-labelledby]=\\\"ariaLabelledBy\\\" [attr.aria-disabled]=\\\"ariaDisabled\\\" [attr.aria-required]=\\\"ariaRequired\\\" [attr.aria-invalid]=\\\"ariaInvalid\\\" [attr.autocomplete]=\\\"autocomplete\\\" [attr.autocorrect]=\\\"autocorrect\\\" [attr.autocapitalize]=\\\"autocapitalize\\\" [autofocus]=\\\"autofocus\\\" [disabled]=\\\"disabled\\\" [id]=\\\"inputId\\\" [attr.list]=\\\"list\\\" [attr.max]=\\\"max\\\" [attr.maxlength]=\\\"maxlength\\\" [attr.min]=\\\"min\\\" [attr.minlength]=\\\"minlength\\\" [readonly]=\\\"readonly\\\" [required]=\\\"required\\\" [spellcheck]=\\\"spellcheck\\\" [attr.step]=\\\"step\\\" [attr.tabindex]=\\\"tabindex\\\" [type]=\\\"type\\\" [attr.name]=\\\"name\\\" (focus)=\\\"_handleFocus($event)\\\" (blur)=\\\"_handleBlur($event)\\\" [(ngModel)]=\\\"value\\\" (change)=\\\"_handleChange($event)\\\"><textarea #input *ngIf=\\\"_elementType === 'textarea'\\\" class=\\\"md-input-element md-input-element-textarea\\\" [class.md-end]=\\\"align == 'end'\\\" [attr.aria-label]=\\\"ariaLabel\\\" [attr.aria-labelledby]=\\\"ariaLabelledBy\\\" [attr.aria-disabled]=\\\"ariaDisabled\\\" [attr.aria-required]=\\\"ariaRequired\\\" [attr.aria-invalid]=\\\"ariaInvalid\\\" [attr.autocomplete]=\\\"autocomplete\\\" [attr.autocapitalize]=\\\"autocapitalize\\\" [attr.cols]=\\\"cols\\\" [attr.rows]=\\\"rows\\\" [attr.wrap]=\\\"wrap\\\" [autofocus]=\\\"autofocus\\\" [disabled]=\\\"disabled\\\" [id]=\\\"inputId\\\" [attr.maxlength]=\\\"maxlength\\\" [attr.minlength]=\\\"minlength\\\" [readonly]=\\\"readonly\\\" [required]=\\\"required\\\" [spellcheck]=\\\"spellcheck\\\" [attr.tabindex]=\\\"tabindex\\\" [attr.name]=\\\"name\\\" (focus)=\\\"_handleFocus($event)\\\" (blur)=\\\"_handleBlur($event)\\\" [(ngModel)]=\\\"value\\\" (change)=\\\"_handleChange($event)\\\"></textarea><label class=\\\"md-input-placeholder\\\" [attr.for]=\\\"inputId\\\" [class.md-empty]=\\\"empty\\\" [class.md-focused]=\\\"focused\\\" [class.md-float]=\\\"floatingPlaceholder\\\" [class.md-accent]=\\\"dividerColor == 'accent'\\\" [class.md-warn]=\\\"dividerColor == 'warn'\\\" *ngIf=\\\"_hasPlaceholder()\\\"><ng-content select=\\\"md-placeholder\\\"></ng-content>{{placeholder}} <span class=\\\"md-placeholder-required\\\" *ngIf=\\\"required\\\">*</span></label></div><div class=\\\"md-input-suffix\\\"><ng-content select=\\\"[md-suffix]\\\"></ng-content></div></div><div class=\\\"md-input-underline\\\" [class.md-disabled]=\\\"disabled\\\"><span class=\\\"md-input-ripple\\\" [class.md-focused]=\\\"focused\\\" [class.md-accent]=\\\"dividerColor == 'accent'\\\" [class.md-warn]=\\\"dividerColor == 'warn'\\\"></span></div><div *ngIf=\\\"hintLabel != ''\\\" class=\\\"md-hint\\\">{{hintLabel}}</div><ng-content select=\\\"md-hint\\\"></ng-content></div>\",\n            styles: [\"md-input,md-textarea{display:inline-block;position:relative;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;line-height:normal;text-align:left}.md-input-element.md-end,[dir=rtl] md-input,[dir=rtl] md-textarea{text-align:right}.md-input-wrapper{margin:16px 0}.md-input-table{display:inline-table;flex-flow:column;vertical-align:bottom;width:100%}.md-input-table>*{display:table-cell}.md-input-infix{position:relative}.md-input-element{font:inherit;background:0 0;color:currentColor;border:none;outline:0;padding:0;width:100%}[dir=rtl] .md-input-element.md-end{text-align:left}.md-input-element:-moz-ui-invalid{box-shadow:none}.md-input-element:-webkit-autofill+.md-input-placeholder.md-float{display:block;padding-bottom:5px;transform:translateY(-100%) scale(.75);width:133.33333%}.md-input-placeholder{position:absolute;left:0;top:0;font-size:100%;pointer-events:none;z-index:1;width:100%;display:none;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden;transform:translateY(0);transform-origin:bottom left;transition:transform .4s cubic-bezier(.25,.8,.25,1),scale .4s cubic-bezier(.25,.8,.25,1),color .4s cubic-bezier(.25,.8,.25,1),width .4s cubic-bezier(.25,.8,.25,1)}.md-input-placeholder.md-empty{display:block;cursor:text}.md-input-placeholder.md-float.md-focused,.md-input-placeholder.md-float:not(.md-empty){display:block;padding-bottom:5px;transform:translateY(-100%) scale(.75);width:133.33333%}[dir=rtl] .md-input-placeholder{transform-origin:bottom right;left:auto;right:0}.md-input-underline{position:absolute;height:1px;width:100%;margin-top:4px;border-top-width:1px;border-top-style:solid}.md-input-underline.md-disabled{background-image:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x;border-top:0;background-position:0}.md-input-underline .md-input-ripple{position:absolute;height:2px;z-index:1;top:-1px;width:100%;transform-origin:top;opacity:0;transform:scaleY(0);transition:transform .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.md-input-underline .md-input-ripple.md-focused{opacity:1;transform:scaleY(1)}.md-hint{display:block;position:absolute;font-size:75%;bottom:-.5em}.md-hint.md-right{right:0}[dir=rtl] .md-hint{right:0;left:auto}[dir=rtl] .md-hint.md-right{right:auto;left:0}\"],\n            providers: [MD_INPUT_CONTROL_VALUE_ACCESSOR],\n            host: { '(click)': 'focus()' },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$46('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdInput);\n    return MdInput;\n}());\nvar MdInputModule = (function () {\n    function MdInputModule() {\n    }\n    MdInputModule.forRoot = function () {\n        return {\n            ngModule: MdInputModule,\n            providers: PlatformModule.forRoot().providers,\n        };\n    };\n    MdInputModule = __decorate$46([\n        _angular_core.NgModule({\n            declarations: [\n                MdInput,\n                MdPlaceholder,\n                MdInputContainer,\n                MdHint,\n                MdTextareaAutosize,\n                MdInputDirective\n            ],\n            imports: [\n                _angular_common.CommonModule,\n                _angular_forms.FormsModule,\n                PlatformModule,\n            ],\n            exports: [\n                MdInput,\n                MdPlaceholder,\n                MdInputContainer,\n                MdHint,\n                MdTextareaAutosize,\n                MdInputDirective\n            ],\n        }), \n        __metadata$46('design:paramtypes', [])\n    ], MdInputModule);\n    return MdInputModule;\n}());\n\n/**\n * Configuration used when opening a snack-bar.\n */\nvar MdSnackBarConfig = (function () {\n    function MdSnackBarConfig() {\n        /** The politeness level for the MdAriaLiveAnnouncer announcement. */\n        this.politeness = 'assertive';\n        /** Message to be announced by the MdAriaLiveAnnouncer */\n        this.announcementMessage = '';\n        /** The view container to place the overlay for the snack bar into. */\n        this.viewContainerRef = null;\n        /** The length of time in milliseconds to wait before automatically dismissing the snack bar. */\n        this.duration = 0;\n    }\n    return MdSnackBarConfig;\n}());\n\n// TODO(josephperrott): Implement onAction observable.\n/**\n * Reference to a snack bar dispatched from the snack bar service.\n */\nvar MdSnackBarRef = (function () {\n    function MdSnackBarRef(instance, containerInstance, _overlayRef) {\n        var _this = this;\n        this._overlayRef = _overlayRef;\n        /** Subject for notifying the user that the snack bar has closed. */\n        this._afterClosed = new rxjs_Subject.Subject();\n        /** Subject for notifying the user that the snack bar action was called. */\n        this._onAction = new rxjs_Subject.Subject();\n        // Sets the readonly instance of the snack bar content component.\n        this._instance = instance;\n        this.containerInstance = containerInstance;\n        // Dismiss snackbar on action.\n        this.onAction().subscribe(function () { return _this.dismiss(); });\n        containerInstance._onExit().subscribe(function () { return _this._finishDismiss(); });\n    }\n    Object.defineProperty(MdSnackBarRef.prototype, \"instance\", {\n        /** The instance of the component making up the content of the snack bar. */\n        get: function () {\n            return this._instance;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** Dismisses the snack bar. */\n    MdSnackBarRef.prototype.dismiss = function () {\n        if (!this._afterClosed.closed) {\n            this.containerInstance.exit();\n        }\n    };\n    /** Marks the snackbar action clicked. */\n    MdSnackBarRef.prototype._action = function () {\n        if (!this._onAction.closed) {\n            this._onAction.next();\n            this._onAction.complete();\n        }\n    };\n    /** Marks the snackbar as opened */\n    MdSnackBarRef.prototype._open = function () {\n        if (!this._afterOpened.closed) {\n            this._afterOpened.next();\n            this._afterOpened.complete();\n        }\n    };\n    /** Cleans up the DOM after closing. */\n    MdSnackBarRef.prototype._finishDismiss = function () {\n        this._overlayRef.dispose();\n        this._afterClosed.next();\n        this._afterClosed.complete();\n    };\n    /** Gets an observable that is notified when the snack bar is finished closing. */\n    MdSnackBarRef.prototype.afterDismissed = function () {\n        return this._afterClosed.asObservable();\n    };\n    /** Gets an observable that is notified when the snack bar has opened and appeared. */\n    MdSnackBarRef.prototype.afterOpened = function () {\n        return this.containerInstance._onEnter();\n    };\n    /** Gets an observable that is notified when the snack bar action is called. */\n    MdSnackBarRef.prototype.onAction = function () {\n        return this._onAction.asObservable();\n    };\n    return MdSnackBarRef;\n}());\n\nvar __extends$16 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Error that is thrown when attempting to attach a snack bar that is already attached.\n * @docs-private\n */\nvar MdSnackBarContentAlreadyAttached = (function (_super) {\n    __extends$16(MdSnackBarContentAlreadyAttached, _super);\n    function MdSnackBarContentAlreadyAttached() {\n        _super.call(this, 'Attempting to attach snack bar content after content is already attached');\n    }\n    return MdSnackBarContentAlreadyAttached;\n}(MdError));\n\nvar __extends$15 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$49 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$49 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// TODO(jelbourn): we can't use constants from animation.ts here because you can't use\n// a text interpolation in anything that is analyzed statically with ngc (for AoT compile).\nvar SHOW_ANIMATION = '225ms cubic-bezier(0.4,0.0,1,1)';\nvar HIDE_ANIMATION = '195ms cubic-bezier(0.0,0.0,0.2,1)';\n/**\n * Internal component that wraps user-provided snack bar content.\n * @docs-private\n */\nvar MdSnackBarContainer = (function (_super) {\n    __extends$15(MdSnackBarContainer, _super);\n    function MdSnackBarContainer(_ngZone) {\n        _super.call(this);\n        this._ngZone = _ngZone;\n        /** Subject for notifying that the snack bar has exited from view. */\n        this.onExit = new rxjs_Subject.Subject();\n        /** Subject for notifying that the snack bar has finished entering the view. */\n        this.onEnter = new rxjs_Subject.Subject();\n        /** The state of the snack bar animations. */\n        this.animationState = 'initial';\n    }\n    /** Attach a component portal as content to this snack bar container. */\n    MdSnackBarContainer.prototype.attachComponentPortal = function (portal) {\n        if (this._portalHost.hasAttached()) {\n            throw new MdSnackBarContentAlreadyAttached();\n        }\n        return this._portalHost.attachComponentPortal(portal);\n    };\n    /** Attach a template portal as content to this snack bar container. */\n    MdSnackBarContainer.prototype.attachTemplatePortal = function (portal) {\n        throw Error('Not yet implemented');\n    };\n    /** Handle end of animations, updating the state of the snackbar. */\n    MdSnackBarContainer.prototype.onAnimationEnd = function (event) {\n        var _this = this;\n        if (event.toState === 'void' || event.toState === 'complete') {\n            this._ngZone.run(function () {\n                _this.onExit.next();\n                _this.onExit.complete();\n            });\n        }\n        if (event.toState === 'visible') {\n            this._ngZone.run(function () {\n                _this.onEnter.next();\n                _this.onEnter.complete();\n            });\n        }\n    };\n    /** Begin animation of snack bar entrance into view. */\n    MdSnackBarContainer.prototype.enter = function () {\n        this.animationState = 'visible';\n    };\n    /** Returns an observable resolving when the enter animation completes.  */\n    MdSnackBarContainer.prototype._onEnter = function () {\n        this.animationState = 'visible';\n        return this.onEnter.asObservable();\n    };\n    /** Begin animation of the snack bar exiting from view. */\n    MdSnackBarContainer.prototype.exit = function () {\n        this.animationState = 'complete';\n        return this._onExit();\n    };\n    /** Returns an observable that completes after the closing animation is done. */\n    MdSnackBarContainer.prototype._onExit = function () {\n        return this.onExit.asObservable();\n    };\n    /**\n     * Makes sure the exit callbacks have been invoked when the element is destroyed.\n     */\n    MdSnackBarContainer.prototype.ngOnDestroy = function () {\n        var _this = this;\n        // Wait for the zone to settle before removing the element. Helps prevent\n        // errors where we end up removing an element which is in the middle of an animation.\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            _this.onExit.next();\n            _this.onExit.complete();\n        });\n    };\n    __decorate$49([\n        _angular_core.ViewChild(PortalHostDirective), \n        __metadata$49('design:type', PortalHostDirective)\n    ], MdSnackBarContainer.prototype, \"_portalHost\", void 0);\n    MdSnackBarContainer = __decorate$49([\n        _angular_core.Component({selector: 'snack-bar-container',\n            template: \"<template cdkPortalHost></template>\",\n            styles: [\":host{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);background:#323232;border-radius:2px;box-sizing:content-box;display:block;height:20px;max-width:568px;min-width:288px;overflow:hidden;padding:14px 24px;transform:translateY(100%)}@media screen and (-ms-high-contrast:active){:host{border:1px solid}}\"],\n            host: {\n                'role': 'alert',\n                '[@state]': 'animationState',\n                '(@state.done)': 'onAnimationEnd($event)'\n            },\n            animations: [\n                _angular_core.trigger('state', [\n                    _angular_core.state('initial', _angular_core.style({ transform: 'translateY(100%)' })),\n                    _angular_core.state('visible', _angular_core.style({ transform: 'translateY(0%)' })),\n                    _angular_core.state('complete', _angular_core.style({ transform: 'translateY(100%)' })),\n                    _angular_core.transition('visible => complete', _angular_core.animate(HIDE_ANIMATION)),\n                    _angular_core.transition('initial => visible, void => visible', _angular_core.animate(SHOW_ANIMATION)),\n                ])\n            ],\n        }), \n        __metadata$49('design:paramtypes', [_angular_core.NgZone])\n    ], MdSnackBarContainer);\n    return MdSnackBarContainer;\n}(BasePortalHost));\n\nvar __decorate$50 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$50 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * A component used to open as the default snack bar, matching material spec.\n * This should only be used internally by the snack bar service.\n */\nvar SimpleSnackBar = (function () {\n    function SimpleSnackBar() {\n    }\n    /** Dismisses the snack bar. */\n    SimpleSnackBar.prototype.dismiss = function () {\n        this.snackBarRef._action();\n    };\n    Object.defineProperty(SimpleSnackBar.prototype, \"hasAction\", {\n        /** If the action button should be shown. */\n        get: function () { return !!this.action; },\n        enumerable: true,\n        configurable: true\n    });\n    SimpleSnackBar = __decorate$50([\n        _angular_core.Component({selector: 'simple-snack-bar',\n            template: \"<span class=\\\"md-simple-snackbar-message\\\">{{message}}</span> <button md-button class=\\\"md-simple-snackbar-action\\\" *ngIf=\\\"hasAction\\\" (click)=\\\"dismiss()\\\">{{action}}</button>\",\n            styles: [\"md-simple-snackbar{display:flex;justify-content:space-between}.md-simple-snackbar-message{box-sizing:border-box;border:none;color:#fff;font-family:Roboto,'Helvetica Neue',sans-serif;font-size:14px;line-height:20px;outline:0;text-decoration:none;word-break:break-all}.md-simple-snackbar-action{box-sizing:border-box;color:#fff;float:right;font-weight:600;line-height:20px;margin:-5px 0 0 48px;min-width:initial;padding:5px;text-transform:uppercase}\"],\n        }), \n        __metadata$50('design:paramtypes', [])\n    ], SimpleSnackBar);\n    return SimpleSnackBar;\n}());\n\n/**\n * Extends an object with the *enumerable* and *own* properties of one or more source objects,\n * similar to Object.assign.\n *\n * @param dest The object which will have properties copied to it.\n * @param sources The source objects from which properties will be copied.\n */\nfunction extendObject(dest) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    if (dest == null) {\n        throw TypeError('Cannot convert undefined or null to object');\n    }\n    for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {\n        var source = sources_1[_a];\n        if (source != null) {\n            for (var key in source) {\n                if (source.hasOwnProperty(key)) {\n                    dest[key] = source[key];\n                }\n            }\n        }\n    }\n    return dest;\n}\n\nvar __decorate$48 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$48 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Service to dispatch Material Design snack bar messages.\n */\nvar MdSnackBar = (function () {\n    function MdSnackBar(_overlay, _live) {\n        this._overlay = _overlay;\n        this._live = _live;\n    }\n    /**\n     * Creates and dispatches a snack bar with a custom component for the content, removing any\n     * currently opened snack bars.\n     *\n     * @param component Component to be instantiated.\n     * @param config Extra configuration for the snack bar.\n     */\n    MdSnackBar.prototype.openFromComponent = function (component, config) {\n        var _this = this;\n        config = _applyConfigDefaults(config);\n        var overlayRef = this._createOverlay();\n        var snackBarContainer = this._attachSnackBarContainer(overlayRef, config);\n        var snackBarRef = this._attachSnackbarContent(component, snackBarContainer, overlayRef);\n        // When the snackbar is dismissed, clear the reference to it.\n        snackBarRef.afterDismissed().subscribe(function () {\n            // Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.\n            if (_this._snackBarRef == snackBarRef) {\n                _this._snackBarRef = null;\n            }\n        });\n        // If a snack bar is already in view, dismiss it and enter the new snack bar after exit\n        // animation is complete.\n        if (this._snackBarRef) {\n            this._snackBarRef.afterDismissed().subscribe(function () {\n                snackBarRef.containerInstance.enter();\n            });\n            this._snackBarRef.dismiss();\n        }\n        else {\n            snackBarRef.containerInstance.enter();\n        }\n        // If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.\n        if (config.duration > 0) {\n            snackBarRef.afterOpened().subscribe(function () {\n                setTimeout(function () { return snackBarRef.dismiss(); }, config.duration);\n            });\n        }\n        this._live.announce(config.announcementMessage, config.politeness);\n        this._snackBarRef = snackBarRef;\n        return this._snackBarRef;\n    };\n    /**\n     * Opens a snackbar with a message and an optional action.\n     * @param message The message to show in the snackbar.\n     * @param action The label for the snackbar action.\n     * @param config Additional configuration options for the snackbar.\n     */\n    MdSnackBar.prototype.open = function (message, action, config) {\n        if (action === void 0) { action = ''; }\n        if (config === void 0) { config = {}; }\n        config.announcementMessage = message;\n        var simpleSnackBarRef = this.openFromComponent(SimpleSnackBar, config);\n        simpleSnackBarRef.instance.snackBarRef = simpleSnackBarRef;\n        simpleSnackBarRef.instance.message = message;\n        simpleSnackBarRef.instance.action = action;\n        return simpleSnackBarRef;\n    };\n    /**\n     * Attaches the snack bar container component to the overlay.\n     */\n    MdSnackBar.prototype._attachSnackBarContainer = function (overlayRef, config) {\n        var containerPortal = new ComponentPortal(MdSnackBarContainer, config.viewContainerRef);\n        var containerRef = overlayRef.attach(containerPortal);\n        containerRef.instance.snackBarConfig = config;\n        return containerRef.instance;\n    };\n    /**\n     * Places a new component as the content of the snack bar container.\n     */\n    MdSnackBar.prototype._attachSnackbarContent = function (component, container, overlayRef) {\n        var portal = new ComponentPortal(component);\n        var contentRef = container.attachComponentPortal(portal);\n        return new MdSnackBarRef(contentRef.instance, container, overlayRef);\n    };\n    /**\n     * Creates a new overlay and places it in the correct location.\n     */\n    MdSnackBar.prototype._createOverlay = function () {\n        var state$$1 = new OverlayState();\n        state$$1.positionStrategy = this._overlay.position().global()\n            .centerHorizontally()\n            .bottom('0');\n        return this._overlay.create(state$$1);\n    };\n    MdSnackBar = __decorate$48([\n        _angular_core.Injectable(), \n        __metadata$48('design:paramtypes', [Overlay, LiveAnnouncer])\n    ], MdSnackBar);\n    return MdSnackBar;\n}());\n/**\n * Applies default options to the snackbar config.\n * @param config The configuration to which the defaults will be applied.\n * @returns The new configuration object with defaults applied.\n */\nfunction _applyConfigDefaults(config) {\n    return extendObject(new MdSnackBarConfig(), config);\n}\nvar MdSnackBarModule = (function () {\n    function MdSnackBarModule() {\n    }\n    MdSnackBarModule.forRoot = function () {\n        return {\n            ngModule: MdSnackBarModule,\n            providers: [MdSnackBar, OVERLAY_PROVIDERS, LiveAnnouncer]\n        };\n    };\n    MdSnackBarModule = __decorate$48([\n        _angular_core.NgModule({\n            imports: [OverlayModule, PortalModule, _angular_common.CommonModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdSnackBarContainer, DefaultStyleCompatibilityModeModule],\n            declarations: [MdSnackBarContainer, SimpleSnackBar],\n            entryComponents: [MdSnackBarContainer, SimpleSnackBar],\n        }), \n        __metadata$48('design:paramtypes', [])\n    ], MdSnackBarModule);\n    return MdSnackBarModule;\n}());\n\nvar __extends$17 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$52 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$52 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Used to flag tab labels for use with the portal directive */\nvar MdTabLabel = (function (_super) {\n    __extends$17(MdTabLabel, _super);\n    function MdTabLabel(templateRef, viewContainerRef) {\n        _super.call(this, templateRef, viewContainerRef);\n    }\n    MdTabLabel = __decorate$52([\n        _angular_core.Directive({\n            selector: '[md-tab-label], [mat-tab-label]',\n        }), \n        __metadata$52('design:paramtypes', [_angular_core.TemplateRef, _angular_core.ViewContainerRef])\n    ], MdTabLabel);\n    return MdTabLabel;\n}(TemplatePortalDirective));\n\nvar __decorate$53 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$53 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Used in the `md-tab-group` view to display tab labels */\nvar MdTabLabelWrapper = (function () {\n    function MdTabLabelWrapper(elementRef, _renderer) {\n        this.elementRef = elementRef;\n        this._renderer = _renderer;\n        /** Whether the tab label is disabled.  */\n        this._disabled = false;\n    }\n    Object.defineProperty(MdTabLabelWrapper.prototype, \"disabled\", {\n        /** Whether the element is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    /** Sets focus on the wrapper element */\n    MdTabLabelWrapper.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this.elementRef.nativeElement, 'focus');\n    };\n    MdTabLabelWrapper.prototype.getOffsetLeft = function () {\n        return this.elementRef.nativeElement.offsetLeft;\n    };\n    MdTabLabelWrapper.prototype.getOffsetWidth = function () {\n        return this.elementRef.nativeElement.offsetWidth;\n    };\n    __decorate$53([\n        _angular_core.Input(), \n        __metadata$53('design:type', Object)\n    ], MdTabLabelWrapper.prototype, \"disabled\", null);\n    MdTabLabelWrapper = __decorate$53([\n        _angular_core.Directive({\n            selector: '[md-tab-label-wrapper], [mat-tab-label-wrapper]',\n            host: {\n                '[class.md-tab-disabled]': 'disabled'\n            }\n        }), \n        __metadata$53('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdTabLabelWrapper);\n    return MdTabLabelWrapper;\n}());\n\nvar __decorate$55 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$55 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** The ink-bar is used to display and animate the line underneath the current active tab label. */\nvar MdInkBar = (function () {\n    function MdInkBar(_renderer, _elementRef) {\n        this._renderer = _renderer;\n        this._elementRef = _elementRef;\n    }\n    /**\n     * Calculates the styles from the provided element in order to align the ink-bar to that element.\n     * Shows the ink bar if previously set as hidden.\n     * @param element\n     */\n    MdInkBar.prototype.alignToElement = function (element) {\n        this.show();\n        this._renderer.setElementStyle(this._elementRef.nativeElement, 'left', this._getLeftPosition(element));\n        this._renderer.setElementStyle(this._elementRef.nativeElement, 'width', this._getElementWidth(element));\n    };\n    /** Shows the ink bar. */\n    MdInkBar.prototype.show = function () {\n        this._renderer.setElementStyle(this._elementRef.nativeElement, 'visibility', 'visible');\n    };\n    /** Hides the ink bar. */\n    MdInkBar.prototype.hide = function () {\n        this._renderer.setElementStyle(this._elementRef.nativeElement, 'visibility', 'hidden');\n    };\n    /**\n     * Generates the pixel distance from the left based on the provided element in string format.\n     * @param element\n     */\n    MdInkBar.prototype._getLeftPosition = function (element) {\n        return element ? element.offsetLeft + 'px' : '0';\n    };\n    /**\n     * Generates the pixel width from the provided element in string format.\n     * @param element\n     */\n    MdInkBar.prototype._getElementWidth = function (element) {\n        return element ? element.offsetWidth + 'px' : '0';\n    };\n    MdInkBar = __decorate$55([\n        _angular_core.Directive({\n            selector: 'md-ink-bar, mat-ink-bar',\n        }), \n        __metadata$55('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdInkBar);\n    return MdInkBar;\n}());\n\nvar __extends$18 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$54 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$54 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\nvar MdTabNavBar = (function () {\n    function MdTabNavBar() {\n    }\n    /** Animates the ink bar to the position of the active link element. */\n    MdTabNavBar.prototype.updateActiveLink = function (element) {\n        this._inkBar.alignToElement(element);\n    };\n    __decorate$54([\n        _angular_core.ViewChild(MdInkBar), \n        __metadata$54('design:type', MdInkBar)\n    ], MdTabNavBar.prototype, \"_inkBar\", void 0);\n    MdTabNavBar = __decorate$54([\n        _angular_core.Component({selector: '[md-tab-nav-bar], [mat-tab-nav-bar]',\n            template: \"<ng-content></ng-content><md-ink-bar></md-ink-bar>\",\n            styles: [\"[md-tab-link],[md-tab-nav-bar]{position:relative;overflow:hidden}[md-tab-nav-bar]{display:flex;flex-direction:row;flex-shrink:0}[md-tab-link]{line-height:48px;height:48px;padding:0 12px;font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500;cursor:pointer;box-sizing:border-box;color:currentColor;opacity:.6;min-width:160px;text-align:center;text-decoration:none}[md-tab-link]:focus{outline:0;opacity:1}@media (max-width:600px){[md-tab-link]{min-width:72px}}md-ink-bar{position:absolute;bottom:0;height:2px;transition:.5s cubic-bezier(.35,0,.25,1)}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$54('design:paramtypes', [])\n    ], MdTabNavBar);\n    return MdTabNavBar;\n}());\n/**\n * Link inside of a `md-tab-nav-bar`.\n */\nvar MdTabLink = (function () {\n    function MdTabLink(_mdTabNavBar, _element) {\n        this._mdTabNavBar = _mdTabNavBar;\n        this._element = _element;\n        this._isActive = false;\n    }\n    Object.defineProperty(MdTabLink.prototype, \"active\", {\n        /** Whether the link is active. */\n        get: function () { return this._isActive; },\n        set: function (value) {\n            this._isActive = value;\n            if (value) {\n                this._mdTabNavBar.updateActiveLink(this._element.nativeElement);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$54([\n        _angular_core.Input(), \n        __metadata$54('design:type', Boolean)\n    ], MdTabLink.prototype, \"active\", null);\n    MdTabLink = __decorate$54([\n        _angular_core.Directive({\n            selector: '[md-tab-link], [mat-tab-link]',\n        }), \n        __metadata$54('design:paramtypes', [MdTabNavBar, _angular_core.ElementRef])\n    ], MdTabLink);\n    return MdTabLink;\n}());\n/**\n * Simple directive that extends the ripple and matches the selector of the MdTabLink. This\n * adds the ripple behavior to nav bar labels.\n */\nvar MdTabLinkRipple = (function (_super) {\n    __extends$18(MdTabLinkRipple, _super);\n    function MdTabLinkRipple(_element, _ngZone, _ruler) {\n        _super.call(this, _element, _ngZone, _ruler);\n        this._element = _element;\n        this._ngZone = _ngZone;\n    }\n    /**\n     * In certain cases the parent destroy handler may not get called. See Angular issue #11606.\n     */\n    MdTabLinkRipple.prototype.ngOnDestroy = function () {\n        _super.prototype.ngOnDestroy.call(this);\n    };\n    MdTabLinkRipple = __decorate$54([\n        _angular_core.Directive({\n            selector: '[md-tab-link], [mat-tab-link]',\n        }), \n        __metadata$54('design:paramtypes', [_angular_core.ElementRef, _angular_core.NgZone, ViewportRuler])\n    ], MdTabLinkRipple);\n    return MdTabLinkRipple;\n}(MdRipple));\n\nvar __decorate$56 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$56 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdTab = (function () {\n    function MdTab(_viewContainerRef) {\n        this._viewContainerRef = _viewContainerRef;\n        /** The plain text label for the tab, used when there is no template label. */\n        this.textLabel = '';\n        /** The portal that will be the hosted content of the tab */\n        this._contentPortal = null;\n        /**\n         * The relatively indexed position where 0 represents the center, negative is left, and positive\n         * represents the right.\n         */\n        this.position = null;\n        /**\n         * The initial relatively index origin of the tab if it was created and selected after there\n         * was already a selected tab. Provides context of what position the tab should originate from.\n         */\n        this.origin = null;\n        this._disabled = false;\n    }\n    Object.defineProperty(MdTab.prototype, \"content\", {\n        get: function () { return this._contentPortal; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTab.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        /** Whether the tab is disabled */\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    MdTab.prototype.ngOnInit = function () {\n        this._contentPortal = new TemplatePortal(this._content, this._viewContainerRef);\n    };\n    __decorate$56([\n        _angular_core.ContentChild(MdTabLabel), \n        __metadata$56('design:type', MdTabLabel)\n    ], MdTab.prototype, \"templateLabel\", void 0);\n    __decorate$56([\n        _angular_core.ViewChild(_angular_core.TemplateRef), \n        __metadata$56('design:type', _angular_core.TemplateRef)\n    ], MdTab.prototype, \"_content\", void 0);\n    __decorate$56([\n        _angular_core.Input('label'), \n        __metadata$56('design:type', String)\n    ], MdTab.prototype, \"textLabel\", void 0);\n    __decorate$56([\n        _angular_core.Input(), \n        __metadata$56('design:type', Boolean), \n        __metadata$56('design:paramtypes', [Boolean])\n    ], MdTab.prototype, \"disabled\", null);\n    MdTab = __decorate$56([\n        _angular_core.Component({selector: 'md-tab',\n            template: \"<template><ng-content></ng-content></template>\",\n        }), \n        __metadata$56('design:paramtypes', [_angular_core.ViewContainerRef])\n    ], MdTab);\n    return MdTab;\n}());\n\nvar __decorate$57 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$57 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$11 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Wrapper for the contents of a tab.\n */\nvar MdTabBody = (function () {\n    function MdTabBody(_elementRef, _dir) {\n        this._elementRef = _elementRef;\n        this._dir = _dir;\n        /** Event emitted when the tab begins to animate towards the center as the active tab. */\n        this.onCentering = new _angular_core.EventEmitter();\n        /** Event emitted when the tab completes its animation towards the center. */\n        this.onCentered = new _angular_core.EventEmitter(true);\n    }\n    Object.defineProperty(MdTabBody.prototype, \"position\", {\n        set: function (position) {\n            if (position < 0) {\n                this._position = this._getLayoutDirection() == 'ltr' ? 'left' : 'right';\n            }\n            else if (position > 0) {\n                this._position = this._getLayoutDirection() == 'ltr' ? 'right' : 'left';\n            }\n            else {\n                this._position = 'center';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabBody.prototype, \"origin\", {\n        /** The origin position from which this tab should appear when it is centered into view. */\n        set: function (origin) {\n            if (origin == null) {\n                return;\n            }\n            var dir = this._getLayoutDirection();\n            if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\n                this._origin = 'left';\n            }\n            else {\n                this._origin = 'right';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * After initialized, check if the content is centered and has an origin. If so, set the\n     * special position states that transition the tab from the left or right before centering.\n     */\n    MdTabBody.prototype.ngOnInit = function () {\n        if (this._position == 'center' && this._origin) {\n            this._position = this._origin == 'left' ? 'left-origin-center' : 'right-origin-center';\n        }\n    };\n    /**\n     * After the view has been set, check if the tab content is set to the center and attach the\n     * content if it is not already attached.\n     */\n    MdTabBody.prototype.ngAfterViewChecked = function () {\n        if (this._isCenterPosition(this._position) && !this._portalHost.hasAttached()) {\n            this._portalHost.attach(this._content);\n        }\n    };\n    MdTabBody.prototype._onTranslateTabStarted = function (e) {\n        if (this._isCenterPosition(e.toState)) {\n            this.onCentering.emit(this._elementRef.nativeElement.clientHeight);\n        }\n    };\n    MdTabBody.prototype._onTranslateTabComplete = function (e) {\n        // If the end state is that the tab is not centered, then detach the content.\n        if (!this._isCenterPosition(e.toState) && !this._isCenterPosition(this._position)) {\n            this._portalHost.detach();\n        }\n        // If the transition to the center is complete, emit an event.\n        if (this._isCenterPosition(e.toState) && this._isCenterPosition(this._position)) {\n            this.onCentered.emit();\n        }\n    };\n    /** The text direction of the containing app. */\n    MdTabBody.prototype._getLayoutDirection = function () {\n        return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n    };\n    /** Whether the provided position state is considered center, regardless of origin. */\n    MdTabBody.prototype._isCenterPosition = function (position) {\n        return position == 'center' ||\n            position == 'left-origin-center' ||\n            position == 'right-origin-center';\n    };\n    __decorate$57([\n        _angular_core.ViewChild(PortalHostDirective), \n        __metadata$57('design:type', PortalHostDirective)\n    ], MdTabBody.prototype, \"_portalHost\", void 0);\n    __decorate$57([\n        _angular_core.Output(), \n        __metadata$57('design:type', _angular_core.EventEmitter)\n    ], MdTabBody.prototype, \"onCentering\", void 0);\n    __decorate$57([\n        _angular_core.Output(), \n        __metadata$57('design:type', _angular_core.EventEmitter)\n    ], MdTabBody.prototype, \"onCentered\", void 0);\n    __decorate$57([\n        _angular_core.Input('content'), \n        __metadata$57('design:type', TemplatePortal)\n    ], MdTabBody.prototype, \"_content\", void 0);\n    __decorate$57([\n        _angular_core.Input('position'), \n        __metadata$57('design:type', Number), \n        __metadata$57('design:paramtypes', [Number])\n    ], MdTabBody.prototype, \"position\", null);\n    __decorate$57([\n        _angular_core.Input('origin'), \n        __metadata$57('design:type', Number), \n        __metadata$57('design:paramtypes', [Number])\n    ], MdTabBody.prototype, \"origin\", null);\n    MdTabBody = __decorate$57([\n        _angular_core.Component({selector: 'md-tab-body',\n            template: \"<div class=\\\"md-tab-body-content\\\" #content [@translateTab]=\\\"_position\\\" (@translateTab.start)=\\\"_onTranslateTabStarted($event)\\\" (@translateTab.done)=\\\"_onTranslateTabComplete($event)\\\"><template cdkPortalHost></template></div>\",\n            animations: [\n                _angular_core.trigger('translateTab', [\n                    _angular_core.state('left', _angular_core.style({ transform: 'translate3d(-100%, 0, 0)' })),\n                    _angular_core.state('left-origin-center', _angular_core.style({ transform: 'translate3d(0, 0, 0)' })),\n                    _angular_core.state('right-origin-center', _angular_core.style({ transform: 'translate3d(0, 0, 0)' })),\n                    _angular_core.state('center', _angular_core.style({ transform: 'translate3d(0, 0, 0)' })),\n                    _angular_core.state('right', _angular_core.style({ transform: 'translate3d(100%, 0, 0)' })),\n                    _angular_core.transition('* => left, * => right, left => center, right => center', _angular_core.animate('500ms cubic-bezier(0.35, 0, 0.25, 1)')),\n                    _angular_core.transition('void => left-origin-center', [\n                        _angular_core.style({ transform: 'translate3d(-100%, 0, 0)' }),\n                        _angular_core.animate('500ms cubic-bezier(0.35, 0, 0.25, 1)')\n                    ]),\n                    _angular_core.transition('void => right-origin-center', [\n                        _angular_core.style({ transform: 'translate3d(100%, 0, 0)' }),\n                        _angular_core.animate('500ms cubic-bezier(0.35, 0, 0.25, 1)')\n                    ])\n                ])\n            ]\n        }),\n        __param$11(1, _angular_core.Optional()), \n        __metadata$57('design:paramtypes', [_angular_core.ElementRef, Dir])\n    ], MdTabBody);\n    return MdTabBody;\n}());\n\nvar __decorate$58 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$58 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$12 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * The distance in pixels that will be overshot when scrolling a tab label into view. This helps\n * provide a small affordance to the label next to it.\n */\nvar EXAGGERATED_OVERSCROLL = 60;\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\n * width of the header container, then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n */\nvar MdTabHeader = (function () {\n    function MdTabHeader(_zone, _elementRef, _dir) {\n        this._zone = _zone;\n        this._elementRef = _elementRef;\n        this._dir = _dir;\n        /** The tab index that is focused. */\n        this._focusIndex = 0;\n        /** The distance in pixels that the tab labels should be translated to the left. */\n        this._scrollDistance = 0;\n        /** Whether the header should scroll to the selected index after the view has been checked. */\n        this._selectedIndexChanged = false;\n        /** Whether the controls for pagination should be displayed */\n        this._showPaginationControls = false;\n        /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n        this._disableScrollAfter = true;\n        /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n        this._disableScrollBefore = true;\n        this._selectedIndex = 0;\n        /** Event emitted when the option is selected. */\n        this.selectFocusedIndex = new _angular_core.EventEmitter();\n        /** Event emitted when a label is focused. */\n        this.indexFocused = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(MdTabHeader.prototype, \"selectedIndex\", {\n        get: function () { return this._selectedIndex; },\n        /** The index of the active tab. */\n        set: function (value) {\n            this._selectedIndexChanged = this._selectedIndex != value;\n            this._selectedIndex = value;\n            this._focusIndex = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdTabHeader.prototype.ngAfterContentChecked = function () {\n        // If the number of tab labels have changed, check if scrolling should be enabled\n        if (this._tabLabelCount != this._labelWrappers.length) {\n            this._updatePagination();\n            this._tabLabelCount = this._labelWrappers.length;\n        }\n        // If the selected index has changed, scroll to the label and check if the scrolling controls\n        // should be disabled.\n        if (this._selectedIndexChanged) {\n            this._scrollToLabel(this._selectedIndex);\n            this._checkScrollingControls();\n            this._selectedIndexChanged = false;\n        }\n        // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\n        // then translate the header to reflect this.\n        if (this._scrollDistanceChanged) {\n            this._updateTabScrollPosition();\n            this._scrollDistanceChanged = false;\n        }\n    };\n    /**\n     * Waits one frame for the view to update, then updates the ink bar and scroll.\n     * Note: This must be run outside of the zone or it will create an infinite change detection loop.\n     */\n    MdTabHeader.prototype.ngAfterViewChecked = function () {\n        var _this = this;\n        this._zone.runOutsideAngular(function () {\n            window.requestAnimationFrame(function () {\n                _this._alignInkBarToSelectedTab();\n            });\n        });\n    };\n    MdTabHeader.prototype._handleKeydown = function (event) {\n        switch (event.keyCode) {\n            case RIGHT_ARROW:\n                this._focusNextTab();\n                break;\n            case LEFT_ARROW:\n                this._focusPreviousTab();\n                break;\n            case ENTER:\n                this.selectFocusedIndex.emit(this.focusIndex);\n                break;\n        }\n    };\n    /**\n     * Updating the view whether pagination should be enabled or not\n     */\n    MdTabHeader.prototype._updatePagination = function () {\n        this._checkPaginationEnabled();\n        this._checkScrollingControls();\n        this._updateTabScrollPosition();\n    };\n    Object.defineProperty(MdTabHeader.prototype, \"focusIndex\", {\n        /** Tracks which element has focus; used for keyboard navigation */\n        get: function () { return this._focusIndex; },\n        /** When the focus index is set, we must manually send focus to the correct label */\n        set: function (value) {\n            if (!this._isValidIndex(value) || this._focusIndex == value) {\n                return;\n            }\n            this._focusIndex = value;\n            this.indexFocused.emit(value);\n            this._setTabFocus(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Determines if an index is valid.  If the tabs are not ready yet, we assume that the user is\n     * providing a valid index and return true.\n     */\n    MdTabHeader.prototype._isValidIndex = function (index) {\n        if (!this._labelWrappers) {\n            return true;\n        }\n        var tab = this._labelWrappers.toArray()[index];\n        return tab && !tab.disabled;\n    };\n    /**\n     * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n     * scrolling is enabled.\n     */\n    MdTabHeader.prototype._setTabFocus = function (tabIndex) {\n        if (this._showPaginationControls) {\n            this._scrollToLabel(tabIndex);\n        }\n        if (this._labelWrappers && this._labelWrappers.length) {\n            this._labelWrappers.toArray()[tabIndex].focus();\n            // Do not let the browser manage scrolling to focus the element, this will be handled\n            // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\n            // should be the full width minus the offset width.\n            var containerEl = this._tabListContainer.nativeElement;\n            var dir = this._getLayoutDirection();\n            if (dir == 'ltr') {\n                containerEl.scrollLeft = 0;\n            }\n            else {\n                containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;\n            }\n        }\n    };\n    /**\n     * Moves the focus towards the beginning or the end of the list depending on the offset provided.\n     * Valid offsets are 1 and -1.\n     */\n    MdTabHeader.prototype._moveFocus = function (offset) {\n        if (this._labelWrappers) {\n            var tabs = this._labelWrappers.toArray();\n            for (var i = this.focusIndex + offset; i < tabs.length && i >= 0; i += offset) {\n                if (this._isValidIndex(i)) {\n                    this.focusIndex = i;\n                    return;\n                }\n            }\n        }\n    };\n    /** Increment the focus index by 1 until a valid tab is found. */\n    MdTabHeader.prototype._focusNextTab = function () {\n        this._moveFocus(this._getLayoutDirection() == 'ltr' ? 1 : -1);\n    };\n    /** Decrement the focus index by 1 until a valid tab is found. */\n    MdTabHeader.prototype._focusPreviousTab = function () {\n        this._moveFocus(this._getLayoutDirection() == 'ltr' ? -1 : 1);\n    };\n    /** The layout direction of the containing app. */\n    MdTabHeader.prototype._getLayoutDirection = function () {\n        return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n    };\n    /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n    MdTabHeader.prototype._updateTabScrollPosition = function () {\n        var translateX = this.scrollDistance + 'px';\n        if (this._getLayoutDirection() == 'ltr') {\n            translateX = '-' + translateX;\n        }\n        applyCssTransform(this._tabList.nativeElement, \"translate3d(\" + translateX + \", 0, 0)\");\n    };\n    Object.defineProperty(MdTabHeader.prototype, \"scrollDistance\", {\n        get: function () { return this._scrollDistance; },\n        /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n        set: function (v) {\n            this._scrollDistance = Math.max(0, Math.min(this._getMaxScrollDistance(), v));\n            // Mark that the scroll distance has changed so that after the view is checked, the CSS\n            // transformation can move the header.\n            this._scrollDistanceChanged = true;\n            this._checkScrollingControls();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n     * the end of the list, respectively). The distance to scroll is computed to be a third of the\n     * length of the tab list view window.\n     *\n     * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n     * should be called sparingly.\n     */\n    MdTabHeader.prototype._scrollHeader = function (scrollDir) {\n        var viewLength = this._tabListContainer.nativeElement.offsetWidth;\n        // Move the scroll distance one-third the length of the tab list's viewport.\n        this.scrollDistance += (scrollDir == 'before' ? -1 : 1) * viewLength / 3;\n    };\n    /**\n     * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n     *\n     * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n     * should be called sparingly.\n     */\n    MdTabHeader.prototype._scrollToLabel = function (labelIndex) {\n        var selectedLabel = this._labelWrappers.toArray()[labelIndex];\n        if (!selectedLabel) {\n            return;\n        }\n        // The view length is the visible width of the tab labels.\n        var viewLength = this._tabListContainer.nativeElement.offsetWidth;\n        var labelBeforePos, labelAfterPos;\n        if (this._getLayoutDirection() == 'ltr') {\n            labelBeforePos = selectedLabel.getOffsetLeft();\n            labelAfterPos = labelBeforePos + selectedLabel.getOffsetWidth();\n        }\n        else {\n            labelAfterPos = this._tabList.nativeElement.offsetWidth - selectedLabel.getOffsetLeft();\n            labelBeforePos = labelAfterPos - selectedLabel.getOffsetWidth();\n        }\n        var beforeVisiblePos = this.scrollDistance;\n        var afterVisiblePos = this.scrollDistance + viewLength;\n        if (labelBeforePos < beforeVisiblePos) {\n            // Scroll header to move label to the before direction\n            this.scrollDistance -= beforeVisiblePos - labelBeforePos + EXAGGERATED_OVERSCROLL;\n        }\n        else if (labelAfterPos > afterVisiblePos) {\n            // Scroll header to move label to the after direction\n            this.scrollDistance += labelAfterPos - afterVisiblePos + EXAGGERATED_OVERSCROLL;\n        }\n    };\n    /**\n     * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n     * tab list is wider than the size of the header container, then the pagination controls should\n     * be shown.\n     *\n     * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n     * should be called sparingly.\n     */\n    MdTabHeader.prototype._checkPaginationEnabled = function () {\n        this._showPaginationControls =\n            this._tabList.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;\n        if (!this._showPaginationControls) {\n            this.scrollDistance = 0;\n        }\n    };\n    /**\n     * Evaluate whether the before and after controls should be enabled or disabled.\n     * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\n     * before button. If the header is at the end of the list (scroll distance is equal to the\n     * maximum distance we can scroll), then disable the after button.\n     *\n     * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n     * should be called sparingly.\n     */\n    MdTabHeader.prototype._checkScrollingControls = function () {\n        // Check if the pagination arrows should be activated.\n        this._disableScrollBefore = this.scrollDistance == 0;\n        this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();\n    };\n    /**\n     * Determines what is the maximum length in pixels that can be set for the scroll distance. This\n     * is equal to the difference in width between the tab list container and tab header container.\n     *\n     * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n     * should be called sparingly.\n     */\n    MdTabHeader.prototype._getMaxScrollDistance = function () {\n        var lengthOfTabList = this._tabList.nativeElement.scrollWidth;\n        var viewLength = this._tabListContainer.nativeElement.offsetWidth;\n        return lengthOfTabList - viewLength;\n    };\n    /** Tells the ink-bar to align itself to the current label wrapper */\n    MdTabHeader.prototype._alignInkBarToSelectedTab = function () {\n        var selectedLabelWrapper = this._labelWrappers && this._labelWrappers.length\n            ? this._labelWrappers.toArray()[this.selectedIndex].elementRef.nativeElement\n            : null;\n        this._inkBar.alignToElement(selectedLabelWrapper);\n    };\n    __decorate$58([\n        _angular_core.ContentChildren(MdTabLabelWrapper), \n        __metadata$58('design:type', _angular_core.QueryList)\n    ], MdTabHeader.prototype, \"_labelWrappers\", void 0);\n    __decorate$58([\n        _angular_core.ViewChild(MdInkBar), \n        __metadata$58('design:type', MdInkBar)\n    ], MdTabHeader.prototype, \"_inkBar\", void 0);\n    __decorate$58([\n        _angular_core.ViewChild('tabListContainer'), \n        __metadata$58('design:type', _angular_core.ElementRef)\n    ], MdTabHeader.prototype, \"_tabListContainer\", void 0);\n    __decorate$58([\n        _angular_core.ViewChild('tabList'), \n        __metadata$58('design:type', _angular_core.ElementRef)\n    ], MdTabHeader.prototype, \"_tabList\", void 0);\n    __decorate$58([\n        _angular_core.Input(), \n        __metadata$58('design:type', Number), \n        __metadata$58('design:paramtypes', [Number])\n    ], MdTabHeader.prototype, \"selectedIndex\", null);\n    __decorate$58([\n        _angular_core.Output(), \n        __metadata$58('design:type', Object)\n    ], MdTabHeader.prototype, \"selectFocusedIndex\", void 0);\n    __decorate$58([\n        _angular_core.Output(), \n        __metadata$58('design:type', Object)\n    ], MdTabHeader.prototype, \"indexFocused\", void 0);\n    MdTabHeader = __decorate$58([\n        _angular_core.Component({selector: 'md-tab-header',\n            template: \"<div class=\\\"md-tab-header-pagination md-tab-header-pagination-before md-elevation-z4\\\" aria-hidden=\\\"true\\\" md-ripple [mdRippleDisabled]=\\\"_disableScrollBefore\\\" [class.md-tab-header-pagination-disabled]=\\\"_disableScrollBefore\\\" (click)=\\\"_scrollHeader('before')\\\"><div class=\\\"md-tab-header-pagination-chevron\\\"></div></div><div class=\\\"md-tab-label-container\\\" #tabListContainer (keydown)=\\\"_handleKeydown($event)\\\"><div class=\\\"md-tab-list\\\" #tabList role=\\\"tablist\\\" (cdkObserveContent)=\\\"_updatePagination()\\\"><ng-content></ng-content><md-ink-bar></md-ink-bar></div></div><div class=\\\"md-tab-header-pagination md-tab-header-pagination-after md-elevation-z4\\\" aria-hidden=\\\"true\\\" md-ripple [mdRippleDisabled]=\\\"_disableScrollAfter\\\" [class.md-tab-header-pagination-disabled]=\\\"_disableScrollAfter\\\" (click)=\\\"_scrollHeader('after')\\\"><div class=\\\"md-tab-header-pagination-chevron\\\"></div></div>\",\n            styles: [\".md-tab-header{overflow:hidden;position:relative;display:flex;flex-direction:row;flex-shrink:0}.md-tab-label{line-height:48px;height:48px;padding:0 12px;font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500;cursor:pointer;box-sizing:border-box;color:currentColor;opacity:.6;min-width:160px;text-align:center;position:relative}.md-tab-label:focus{outline:0;opacity:1}@media (max-width:600px){.md-tab-label{min-width:72px}}md-ink-bar{position:absolute;bottom:0;height:2px;transition:.5s cubic-bezier(.35,0,.25,1)}.md-tab-header-pagination{position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2}.md-tab-header-pagination-controls-enabled .md-tab-header-pagination,.md-tab-list{display:flex}.md-tab-header-pagination-before,.md-tab-header-rtl .md-tab-header-pagination-after{padding-left:4px}.md-tab-header-pagination-before .md-tab-header-pagination-chevron,.md-tab-header-rtl .md-tab-header-pagination-after .md-tab-header-pagination-chevron{transform:rotate(-135deg)}.md-tab-header-pagination-after,.md-tab-header-rtl .md-tab-header-pagination-before{padding-right:4px}.md-tab-header-pagination-after .md-tab-header-pagination-chevron,.md-tab-header-rtl .md-tab-header-pagination-before .md-tab-header-pagination-chevron{transform:rotate(45deg)}.md-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;content:'';height:8px;width:8px}.md-tab-header-pagination-disabled{box-shadow:none;cursor:default}.md-tab-header-pagination-disabled .md-tab-header-pagination-chevron{border-color:#ccc}.md-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.md-tab-list{flex-grow:1;position:relative;transition:transform .5s cubic-bezier(.35,0,.25,1)}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            host: {\n                'class': 'md-tab-header',\n                '[class.md-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n                '[class.md-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n            }\n        }),\n        __param$12(2, _angular_core.Optional()), \n        __metadata$58('design:paramtypes', [_angular_core.NgZone, _angular_core.ElementRef, Dir])\n    ], MdTabHeader);\n    return MdTabHeader;\n}());\n\nvar __decorate$51 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$51 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Used to generate unique ID's for each tab component */\nvar nextId$2 = 0;\n/** A simple change event emitted on focus or selection changes. */\nvar MdTabChangeEvent = (function () {\n    function MdTabChangeEvent() {\n    }\n    return MdTabChangeEvent;\n}());\n/**\n * Material design tab-group component.  Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://www.google.com/design/spec/components/tabs.html\n */\nvar MdTabGroup = (function () {\n    function MdTabGroup(_renderer) {\n        this._renderer = _renderer;\n        /** Whether this component has been initialized. */\n        this._isInitialized = false;\n        /** The tab index that should be selected after the content has been checked. */\n        this._indexToSelect = 0;\n        /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n        this._tabBodyWrapperHeight = null;\n        /** Whether the tab group should grow to the size of the active tab */\n        this._dynamicHeight = false;\n        this._selectedIndex = null;\n        this._onFocusChange = new _angular_core.EventEmitter();\n        this._onSelectChange = new _angular_core.EventEmitter(true);\n        this._groupId = nextId$2++;\n    }\n    Object.defineProperty(MdTabGroup.prototype, \"dynamicHeight\", {\n        get: function () { return this._dynamicHeight; },\n        set: function (value) { this._dynamicHeight = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabGroup.prototype, \"_dynamicHeightDeprecated\", {\n        /** @deprecated */\n        get: function () { return this._dynamicHeight; },\n        set: function (value) { this._dynamicHeight = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabGroup.prototype, \"selectedIndex\", {\n        get: function () { return this._selectedIndex; },\n        /** The index of the active tab. */\n        set: function (value) { this._indexToSelect = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabGroup.prototype, \"selectedIndexChange\", {\n        /** Output to enable support for two-way binding on `selectedIndex`. */\n        get: function () {\n            return this.selectChange.map(function (event) { return event.index; });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabGroup.prototype, \"focusChange\", {\n        /** Event emitted when focus has changed within a tab group. */\n        get: function () {\n            return this._onFocusChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTabGroup.prototype, \"selectChange\", {\n        /** Event emitted when the tab selection has changed. */\n        get: function () {\n            return this._onSelectChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * After the content is checked, this component knows what tabs have been defined\n     * and what the selected index should be. This is where we can know exactly what position\n     * each tab should be in according to the new selected index, and additionally we know how\n     * a new selected tab should transition in (from the left or right).\n     */\n    MdTabGroup.prototype.ngAfterContentChecked = function () {\n        var _this = this;\n        // Clamp the next selected index to the bounds of 0 and the tabs length.\n        this._indexToSelect =\n            Math.min(this._tabs.length - 1, Math.max(this._indexToSelect, 0));\n        // If there is a change in selected index, emit a change event. Should not trigger if\n        // the selected index has not yet been initialized.\n        if (this._selectedIndex != this._indexToSelect && this._selectedIndex != null) {\n            this._onSelectChange.emit(this._createChangeEvent(this._indexToSelect));\n        }\n        // Setup the position for each tab and optionally setup an origin on the next selected tab.\n        this._tabs.forEach(function (tab, index) {\n            tab.position = index - _this._indexToSelect;\n            // If there is already a selected tab, then set up an origin for the next selected tab\n            // if it doesn't have one already.\n            if (_this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n                tab.origin = _this._indexToSelect - _this._selectedIndex;\n            }\n        });\n        this._selectedIndex = this._indexToSelect;\n    };\n    /**\n     * Waits one frame for the view to update, then updates the ink bar\n     * Note: This must be run outside of the zone or it will create an infinite change detection loop.\n     */\n    MdTabGroup.prototype.ngAfterViewChecked = function () {\n        this._isInitialized = true;\n    };\n    MdTabGroup.prototype._focusChanged = function (index) {\n        this._onFocusChange.emit(this._createChangeEvent(index));\n    };\n    MdTabGroup.prototype._createChangeEvent = function (index) {\n        var event = new MdTabChangeEvent;\n        event.index = index;\n        if (this._tabs && this._tabs.length) {\n            event.tab = this._tabs.toArray()[index];\n        }\n        return event;\n    };\n    /** Returns a unique id for each tab label element */\n    MdTabGroup.prototype._getTabLabelId = function (i) {\n        return \"md-tab-label-\" + this._groupId + \"-\" + i;\n    };\n    /** Returns a unique id for each tab content element */\n    MdTabGroup.prototype._getTabContentId = function (i) {\n        return \"md-tab-content-\" + this._groupId + \"-\" + i;\n    };\n    /**\n     * Sets the height of the body wrapper to the height of the activating tab if dynamic\n     * height property is true.\n     */\n    MdTabGroup.prototype._setTabBodyWrapperHeight = function (tabHeight) {\n        if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\n            return;\n        }\n        this._renderer.setElementStyle(this._tabBodyWrapper.nativeElement, 'height', this._tabBodyWrapperHeight + 'px');\n        // This conditional forces the browser to paint the height so that\n        // the animation to the new height can have an origin.\n        if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n            this._renderer.setElementStyle(this._tabBodyWrapper.nativeElement, 'height', tabHeight + 'px');\n        }\n    };\n    /** Removes the height of the tab body wrapper. */\n    MdTabGroup.prototype._removeTabBodyWrapperHeight = function () {\n        this._tabBodyWrapperHeight = this._tabBodyWrapper.nativeElement.clientHeight;\n        this._renderer.setElementStyle(this._tabBodyWrapper.nativeElement, 'height', '');\n    };\n    __decorate$51([\n        _angular_core.ContentChildren(MdTab), \n        __metadata$51('design:type', _angular_core.QueryList)\n    ], MdTabGroup.prototype, \"_tabs\", void 0);\n    __decorate$51([\n        _angular_core.ViewChild('tabBodyWrapper'), \n        __metadata$51('design:type', _angular_core.ElementRef)\n    ], MdTabGroup.prototype, \"_tabBodyWrapper\", void 0);\n    __decorate$51([\n        _angular_core.Input(), \n        __metadata$51('design:type', Boolean)\n    ], MdTabGroup.prototype, \"dynamicHeight\", null);\n    __decorate$51([\n        _angular_core.Input('md-dynamic-height'), \n        __metadata$51('design:type', Boolean)\n    ], MdTabGroup.prototype, \"_dynamicHeightDeprecated\", null);\n    __decorate$51([\n        _angular_core.Input(), \n        __metadata$51('design:type', Number), \n        __metadata$51('design:paramtypes', [Number])\n    ], MdTabGroup.prototype, \"selectedIndex\", null);\n    __decorate$51([\n        _angular_core.Output(), \n        __metadata$51('design:type', rxjs_Observable.Observable)\n    ], MdTabGroup.prototype, \"selectedIndexChange\", null);\n    __decorate$51([\n        _angular_core.Output(), \n        __metadata$51('design:type', rxjs_Observable.Observable)\n    ], MdTabGroup.prototype, \"focusChange\", null);\n    __decorate$51([\n        _angular_core.Output(), \n        __metadata$51('design:type', rxjs_Observable.Observable)\n    ], MdTabGroup.prototype, \"selectChange\", null);\n    MdTabGroup = __decorate$51([\n        _angular_core.Component({selector: 'md-tab-group',\n            template: \"<md-tab-header [selectedIndex]=\\\"selectedIndex\\\" #tabHeader (indexFocused)=\\\"_focusChanged($event)\\\" (selectFocusedIndex)=\\\"selectedIndex = $event\\\"><div class=\\\"md-tab-label\\\" role=\\\"tab\\\" md-tab-label-wrapper md-ripple *ngFor=\\\"let tab of _tabs; let i = index\\\" [id]=\\\"_getTabLabelId(i)\\\" [tabIndex]=\\\"selectedIndex == i ? 0 : -1\\\" [attr.aria-controls]=\\\"_getTabContentId(i)\\\" [attr.aria-selected]=\\\"selectedIndex == i\\\" [class.md-tab-label-active]=\\\"selectedIndex == i\\\" [disabled]=\\\"tab.disabled\\\" (click)=\\\"tabHeader.focusIndex = selectedIndex = i\\\"><template [ngIf]=\\\"tab.templateLabel\\\"><template [cdkPortalHost]=\\\"tab.templateLabel\\\"></template></template><template [ngIf]=\\\"!tab.templateLabel\\\">{{tab.textLabel}}</template></div></md-tab-header><div class=\\\"md-tab-body-wrapper\\\" #tabBodyWrapper><md-tab-body role=\\\"tabpanel\\\" *ngFor=\\\"let tab of _tabs; let i = index\\\" [id]=\\\"_getTabContentId(i)\\\" [attr.aria-labelledby]=\\\"_getTabLabelId(i)\\\" [class.md-tab-body-active]=\\\"selectedIndex == i\\\" [content]=\\\"tab.content\\\" [position]=\\\"tab.position\\\" [origin]=\\\"tab.origin\\\" (onCentered)=\\\"_removeTabBodyWrapperHeight()\\\" (onCentering)=\\\"_setTabBodyWrapperHeight($event)\\\"></md-tab-body></div>\",\n            styles: [\":host{display:flex;flex-direction:column;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif}.md-tab-label{line-height:48px;height:48px;padding:0 12px;font-size:14px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-weight:500;cursor:pointer;box-sizing:border-box;color:currentColor;opacity:.6;min-width:160px;text-align:center;position:relative}.md-tab-label:focus{outline:0;opacity:1}@media (max-width:600px){.md-tab-label{min-width:72px}}:host[md-stretch-tabs] .md-tab-label{flex-basis:0;flex-grow:1}.md-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height .5s cubic-bezier(.35,0,.25,1)}md-tab-body{position:absolute;top:0;left:0;right:0;bottom:0;display:block;overflow:hidden}md-tab-body.md-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}:host.md-tab-group-dynamic-height md-tab-body.md-tab-body-active{overflow-y:hidden}.md-tab-disabled{cursor:default;pointer-events:none}\"],\n            host: { '[class.md-tab-group-dynamic-height]': 'dynamicHeight' }\n        }), \n        __metadata$51('design:paramtypes', [_angular_core.Renderer])\n    ], MdTabGroup);\n    return MdTabGroup;\n}());\nvar MdTabsModule = (function () {\n    function MdTabsModule() {\n    }\n    MdTabsModule.forRoot = function () {\n        return {\n            ngModule: MdTabsModule,\n            providers: [ViewportRuler]\n        };\n    };\n    MdTabsModule = __decorate$51([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, PortalModule, MdRippleModule, ObserveContentModule],\n            // Don't export all components because some are only to be used internally.\n            exports: [MdTabGroup, MdTabLabel, MdTab, MdTabNavBar, MdTabLink, MdTabLinkRipple],\n            declarations: [MdTabGroup, MdTabLabel, MdTab, MdInkBar, MdTabLabelWrapper,\n                MdTabNavBar, MdTabLink, MdTabBody, MdTabLinkRipple, MdTabHeader],\n        }), \n        __metadata$51('design:paramtypes', [])\n    ], MdTabsModule);\n    return MdTabsModule;\n}());\n\nvar __decorate$59 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$59 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdToolbarRow = (function () {\n    function MdToolbarRow() {\n    }\n    MdToolbarRow = __decorate$59([\n        _angular_core.Directive({\n            selector: 'md-toolbar-row, mat-toolbar-row'\n        }), \n        __metadata$59('design:paramtypes', [])\n    ], MdToolbarRow);\n    return MdToolbarRow;\n}());\nvar MdToolbar = (function () {\n    function MdToolbar(elementRef, renderer) {\n        this.elementRef = elementRef;\n        this.renderer = renderer;\n    }\n    Object.defineProperty(MdToolbar.prototype, \"color\", {\n        /** The color of the toolbar. Can be primary, accent, or warn. */\n        get: function () {\n            return this._color;\n        },\n        set: function (value) {\n            this._updateColor(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdToolbar.prototype._updateColor = function (newColor) {\n        this._setElementColor(this._color, false);\n        this._setElementColor(newColor, true);\n        this._color = newColor;\n    };\n    MdToolbar.prototype._setElementColor = function (color, isAdd) {\n        if (color != null && color != '') {\n            this.renderer.setElementClass(this.elementRef.nativeElement, \"md-\" + color, isAdd);\n        }\n    };\n    __decorate$59([\n        _angular_core.Input(), \n        __metadata$59('design:type', String)\n    ], MdToolbar.prototype, \"color\", null);\n    MdToolbar = __decorate$59([\n        _angular_core.Component({selector: 'md-toolbar, mat-toolbar',\n            template: \"<div class=\\\"md-toolbar-layout\\\"><md-toolbar-row><ng-content></ng-content></md-toolbar-row><ng-content select=\\\"md-toolbar-row, mat-toolbar-row\\\"></ng-content></div>\",\n            styles: [\"md-toolbar,md-toolbar md-toolbar-row{display:flex;box-sizing:border-box;width:100%}md-toolbar{font-size:20px;font-weight:400;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;padding:0 16px;flex-direction:column;min-height:64px}md-toolbar md-toolbar-row{flex-direction:row;align-items:center}md-toolbar-row{height:64px}@media (max-width:600px) and (orientation:portrait){md-toolbar{min-height:56px}md-toolbar-row{height:56px}}@media (max-width:960px) and (orientation:landscape){md-toolbar{min-height:48px}md-toolbar-row{height:48px}}\"],\n            changeDetection: _angular_core.ChangeDetectionStrategy.OnPush,\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$59('design:paramtypes', [_angular_core.ElementRef, _angular_core.Renderer])\n    ], MdToolbar);\n    return MdToolbar;\n}());\nvar MdToolbarModule = (function () {\n    function MdToolbarModule() {\n    }\n    MdToolbarModule.forRoot = function () {\n        return {\n            ngModule: MdToolbarModule,\n            providers: []\n        };\n    };\n    MdToolbarModule = __decorate$59([\n        _angular_core.NgModule({\n            imports: [DefaultStyleCompatibilityModeModule],\n            exports: [MdToolbar, MdToolbarRow, DefaultStyleCompatibilityModeModule],\n            declarations: [MdToolbar, MdToolbarRow],\n        }), \n        __metadata$59('design:paramtypes', [])\n    ], MdToolbarModule);\n    return MdToolbarModule;\n}());\n\nvar __extends$19 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Exception thrown when a tooltip has an invalid position.\n * @docs-private\n */\nvar MdTooltipInvalidPositionError = (function (_super) {\n    __extends$19(MdTooltipInvalidPositionError, _super);\n    function MdTooltipInvalidPositionError(position) {\n        _super.call(this, \"Tooltip position \\\"\" + position + \"\\\" is invalid.\");\n    }\n    return MdTooltipInvalidPositionError;\n}(MdError));\n\nvar __decorate$60 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$60 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$13 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/** Time in ms to delay before changing the tooltip visibility to hidden */\nvar TOUCHEND_HIDE_DELAY = 1500;\n/**\n * Directive that attaches a material design tooltip to the host element. Animates the showing and\n * hiding of a tooltip provided position (defaults to below the element).\n *\n * https://material.google.com/components/tooltips.html\n */\nvar MdTooltip = (function () {\n    function MdTooltip(_overlay, _elementRef, _viewContainerRef, _ngZone, _dir) {\n        this._overlay = _overlay;\n        this._elementRef = _elementRef;\n        this._viewContainerRef = _viewContainerRef;\n        this._ngZone = _ngZone;\n        this._dir = _dir;\n        this._position = 'below';\n        /** The default delay in ms before showing the tooltip after show is called */\n        this.showDelay = 0;\n        /** The default delay in ms before hiding the tooltip after hide is called */\n        this.hideDelay = 0;\n    }\n    Object.defineProperty(MdTooltip.prototype, \"position\", {\n        /** Allows the user to define the position of the tooltip relative to the parent element */\n        get: function () { return this._position; },\n        set: function (value) {\n            if (value !== this._position) {\n                this._position = value;\n                // TODO(andrewjs): When the overlay's position can be dynamically changed, do not destroy\n                // the tooltip.\n                if (this._tooltipInstance) {\n                    this._disposeTooltip();\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTooltip.prototype, \"_positionDeprecated\", {\n        /** @deprecated */\n        get: function () { return this._position; },\n        set: function (value) { this._position = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTooltip.prototype, \"message\", {\n        /** The message to be displayed in the tooltip */\n        get: function () { return this._message; },\n        set: function (value) {\n            this._message = value;\n            if (this._tooltipInstance) {\n                this._setTooltipMessage(this._message);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdTooltip.prototype, \"_deprecatedMessage\", {\n        /** @deprecated */\n        get: function () { return this.message; },\n        set: function (v) { this.message = v; },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Dispose the tooltip when destroyed.\n     */\n    MdTooltip.prototype.ngOnDestroy = function () {\n        if (this._tooltipInstance) {\n            this._disposeTooltip();\n        }\n    };\n    /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n    MdTooltip.prototype.show = function (delay) {\n        if (delay === void 0) { delay = this.showDelay; }\n        if (!this._message || !this._message.trim()) {\n            return;\n        }\n        if (!this._tooltipInstance) {\n            this._createTooltip();\n        }\n        this._setTooltipMessage(this._message);\n        this._tooltipInstance.show(this._position, delay);\n    };\n    /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n    MdTooltip.prototype.hide = function (delay) {\n        if (delay === void 0) { delay = this.hideDelay; }\n        if (this._tooltipInstance) {\n            this._tooltipInstance.hide(delay);\n        }\n    };\n    /** Shows/hides the tooltip */\n    MdTooltip.prototype.toggle = function () {\n        this._isTooltipVisible() ? this.hide() : this.show();\n    };\n    /** Returns true if the tooltip is currently visible to the user */\n    MdTooltip.prototype._isTooltipVisible = function () {\n        return this._tooltipInstance && this._tooltipInstance.isVisible();\n    };\n    /** Create the tooltip to display */\n    MdTooltip.prototype._createTooltip = function () {\n        var _this = this;\n        this._createOverlay();\n        var portal = new ComponentPortal(TooltipComponent, this._viewContainerRef);\n        this._tooltipInstance = this._overlayRef.attach(portal).instance;\n        // Dispose the overlay when finished the shown tooltip.\n        this._tooltipInstance.afterHidden().subscribe(function () {\n            // Check first if the tooltip has already been removed through this components destroy.\n            if (_this._tooltipInstance) {\n                _this._disposeTooltip();\n            }\n        });\n    };\n    /** Create the overlay config and position strategy */\n    MdTooltip.prototype._createOverlay = function () {\n        var origin = this._getOrigin();\n        var position = this._getOverlayPosition();\n        var strategy = this._overlay.position().connectedTo(this._elementRef, origin, position);\n        var config = new OverlayState();\n        config.positionStrategy = strategy;\n        this._overlayRef = this._overlay.create(config);\n    };\n    /** Disposes the current tooltip and the overlay it is attached to */\n    MdTooltip.prototype._disposeTooltip = function () {\n        this._overlayRef.dispose();\n        this._overlayRef = null;\n        this._tooltipInstance = null;\n    };\n    /** Returns the origin position based on the user's position preference */\n    MdTooltip.prototype._getOrigin = function () {\n        if (this.position == 'above' || this.position == 'below') {\n            return { originX: 'center', originY: this.position == 'above' ? 'top' : 'bottom' };\n        }\n        var isDirectionLtr = !this._dir || this._dir.value == 'ltr';\n        if (this.position == 'left' ||\n            this.position == 'before' && isDirectionLtr ||\n            this.position == 'after' && !isDirectionLtr) {\n            return { originX: 'start', originY: 'center' };\n        }\n        if (this.position == 'right' ||\n            this.position == 'after' && isDirectionLtr ||\n            this.position == 'before' && !isDirectionLtr) {\n            return { originX: 'end', originY: 'center' };\n        }\n        throw new MdTooltipInvalidPositionError(this.position);\n    };\n    /** Returns the overlay position based on the user's preference */\n    MdTooltip.prototype._getOverlayPosition = function () {\n        if (this.position == 'above') {\n            return { overlayX: 'center', overlayY: 'bottom' };\n        }\n        if (this.position == 'below') {\n            return { overlayX: 'center', overlayY: 'top' };\n        }\n        var isLtr = !this._dir || this._dir.value == 'ltr';\n        if (this.position == 'left' ||\n            this.position == 'before' && isLtr ||\n            this.position == 'after' && !isLtr) {\n            return { overlayX: 'end', overlayY: 'center' };\n        }\n        if (this.position == 'right' ||\n            this.position == 'after' && isLtr ||\n            this.position == 'before' && !isLtr) {\n            return { overlayX: 'start', overlayY: 'center' };\n        }\n        throw new MdTooltipInvalidPositionError(this.position);\n    };\n    /** Updates the tooltip message and repositions the overlay according to the new message length */\n    MdTooltip.prototype._setTooltipMessage = function (message) {\n        var _this = this;\n        // Must wait for the message to be painted to the tooltip so that the overlay can properly\n        // calculate the correct positioning based on the size of the text.\n        this._tooltipInstance.message = message;\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            if (_this._tooltipInstance) {\n                _this._overlayRef.updatePosition();\n            }\n        });\n    };\n    __decorate$60([\n        _angular_core.Input('mdTooltipPosition'), \n        __metadata$60('design:type', String)\n    ], MdTooltip.prototype, \"position\", null);\n    __decorate$60([\n        _angular_core.Input('tooltip-position'), \n        __metadata$60('design:type', String)\n    ], MdTooltip.prototype, \"_positionDeprecated\", null);\n    __decorate$60([\n        _angular_core.Input('mdTooltipShowDelay'), \n        __metadata$60('design:type', Object)\n    ], MdTooltip.prototype, \"showDelay\", void 0);\n    __decorate$60([\n        _angular_core.Input('mdTooltipHideDelay'), \n        __metadata$60('design:type', Object)\n    ], MdTooltip.prototype, \"hideDelay\", void 0);\n    __decorate$60([\n        _angular_core.Input('mdTooltip'), \n        __metadata$60('design:type', Object)\n    ], MdTooltip.prototype, \"message\", null);\n    __decorate$60([\n        _angular_core.Input('md-tooltip'), \n        __metadata$60('design:type', String)\n    ], MdTooltip.prototype, \"_deprecatedMessage\", null);\n    MdTooltip = __decorate$60([\n        _angular_core.Directive({\n            selector: '[md-tooltip], [mat-tooltip], [mdTooltip]',\n            host: {\n                '(longpress)': 'show()',\n                '(touchend)': 'hide(' + TOUCHEND_HIDE_DELAY + ')',\n                '(mouseenter)': 'show()',\n                '(mouseleave)': 'hide()',\n            },\n            exportAs: 'mdTooltip',\n        }),\n        __param$13(4, _angular_core.Optional()), \n        __metadata$60('design:paramtypes', [Overlay, _angular_core.ElementRef, _angular_core.ViewContainerRef, _angular_core.NgZone, Dir])\n    ], MdTooltip);\n    return MdTooltip;\n}());\n/**\n * Internal component that wraps the tooltip's content.\n * @docs-private\n */\nvar TooltipComponent = (function () {\n    function TooltipComponent(_dir) {\n        this._dir = _dir;\n        /** Property watched by the animation framework to show or hide the tooltip */\n        this._visibility = 'initial';\n        /** Whether interactions on the page should close the tooltip */\n        this._closeOnInteraction = false;\n        /** The transform origin used in the animation for showing and hiding the tooltip */\n        this._transformOrigin = 'bottom';\n        /** Subject for notifying that the tooltip has been hidden from the view */\n        this._onHide = new rxjs_Subject.Subject();\n    }\n    /**\n     * Shows the tooltip with an animation originating from the provided origin\n     * @param position Position of the tooltip.\n     * @param delay Amount of milliseconds to the delay showing the tooltip.\n     */\n    TooltipComponent.prototype.show = function (position, delay) {\n        var _this = this;\n        // Cancel the delayed hide if it is scheduled\n        if (this._hideTimeoutId) {\n            clearTimeout(this._hideTimeoutId);\n        }\n        // Body interactions should cancel the tooltip if there is a delay in showing.\n        this._closeOnInteraction = true;\n        this._setTransformOrigin(position);\n        this._showTimeoutId = setTimeout(function () {\n            _this._visibility = 'visible';\n            // If this was set to true immediately, then a body click that triggers show() would\n            // trigger interaction and close the tooltip right after it was displayed.\n            _this._closeOnInteraction = false;\n            setTimeout(function () { _this._closeOnInteraction = true; }, 0);\n        }, delay);\n    };\n    /**\n     * Begins the animation to hide the tooltip after the provided delay in ms.\n     * @param delay Amount of milliseconds to delay showing the tooltip.\n     */\n    TooltipComponent.prototype.hide = function (delay) {\n        var _this = this;\n        // Cancel the delayed show if it is scheduled\n        if (this._showTimeoutId) {\n            clearTimeout(this._showTimeoutId);\n        }\n        this._hideTimeoutId = setTimeout(function () {\n            _this._visibility = 'hidden';\n            _this._closeOnInteraction = false;\n        }, delay);\n    };\n    /**\n     * Returns an observable that notifies when the tooltip has been hidden from view\n     */\n    TooltipComponent.prototype.afterHidden = function () {\n        return this._onHide.asObservable();\n    };\n    /**\n     * Whether the tooltip is being displayed\n     */\n    TooltipComponent.prototype.isVisible = function () {\n        return this._visibility === 'visible';\n    };\n    /** Sets the tooltip transform origin according to the tooltip position */\n    TooltipComponent.prototype._setTransformOrigin = function (value) {\n        var isLtr = !this._dir || this._dir.value == 'ltr';\n        switch (value) {\n            case 'before':\n                this._transformOrigin = isLtr ? 'right' : 'left';\n                break;\n            case 'after':\n                this._transformOrigin = isLtr ? 'left' : 'right';\n                break;\n            case 'left':\n                this._transformOrigin = 'right';\n                break;\n            case 'right':\n                this._transformOrigin = 'left';\n                break;\n            case 'above':\n                this._transformOrigin = 'bottom';\n                break;\n            case 'below':\n                this._transformOrigin = 'top';\n                break;\n            default: throw new MdTooltipInvalidPositionError(value);\n        }\n    };\n    TooltipComponent.prototype._afterVisibilityAnimation = function (e) {\n        if (e.toState === 'hidden' && !this.isVisible()) {\n            this._onHide.next();\n        }\n    };\n    /**\n     * Interactions on the HTML body should close the tooltip immediately as defined in the\n     * material design spec.\n     * https://material.google.com/components/tooltips.html#tooltips-interaction\n     */\n    TooltipComponent.prototype._handleBodyInteraction = function () {\n        if (this._closeOnInteraction) {\n            this.hide(0);\n        }\n    };\n    TooltipComponent = __decorate$60([\n        _angular_core.Component({selector: 'md-tooltip-component, mat-tooltip-component',\n            template: \"<div class=\\\"md-tooltip\\\" [style.transform-origin]=\\\"_transformOrigin\\\" [@state]=\\\"_visibility\\\" (@state.done)=\\\"_afterVisibilityAnimation($event)\\\">{{message}}</div>\",\n            styles: [\":host{pointer-events:none}.md-tooltip{color:#fff;padding:0 8px;border-radius:2px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;font-size:10px;margin:14px;height:22px;line-height:22px}@media screen and (-ms-high-contrast:active){.md-tooltip{outline:solid 1px}}\"],\n            animations: [\n                _angular_core.trigger('state', [\n                    _angular_core.state('void', _angular_core.style({ transform: 'scale(0)' })),\n                    _angular_core.state('initial', _angular_core.style({ transform: 'scale(0)' })),\n                    _angular_core.state('visible', _angular_core.style({ transform: 'scale(1)' })),\n                    _angular_core.state('hidden', _angular_core.style({ transform: 'scale(0)' })),\n                    _angular_core.transition('* => visible', _angular_core.animate('150ms cubic-bezier(0.0, 0.0, 0.2, 1)')),\n                    _angular_core.transition('* => hidden', _angular_core.animate('150ms cubic-bezier(0.4, 0.0, 1, 1)')),\n                ])\n            ],\n            host: {\n                '(body:click)': 'this._handleBodyInteraction()'\n            }\n        }),\n        __param$13(0, _angular_core.Optional()), \n        __metadata$60('design:paramtypes', [Dir])\n    ], TooltipComponent);\n    return TooltipComponent;\n}());\nvar MdTooltipModule = (function () {\n    function MdTooltipModule() {\n    }\n    MdTooltipModule.forRoot = function () {\n        return {\n            ngModule: MdTooltipModule,\n            providers: [OVERLAY_PROVIDERS]\n        };\n    };\n    MdTooltipModule = __decorate$60([\n        _angular_core.NgModule({\n            imports: [OverlayModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdTooltip, TooltipComponent, DefaultStyleCompatibilityModeModule],\n            declarations: [MdTooltip, TooltipComponent],\n            entryComponents: [TooltipComponent],\n        }), \n        __metadata$60('design:paramtypes', [])\n    ], MdTooltipModule);\n    return MdTooltipModule;\n}());\n\nvar __extends$20 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Exception thrown when menu trigger doesn't have a valid md-menu instance\n * @docs-private\n */\nvar MdMenuMissingError = (function (_super) {\n    __extends$20(MdMenuMissingError, _super);\n    function MdMenuMissingError() {\n        _super.call(this, \"md-menu-trigger: must pass in an md-menu instance.\\n\\n    Example:\\n      <md-menu #menu=\\\"mdMenu\\\"></md-menu>\\n      <button [mdMenuTriggerFor]=\\\"menu\\\"></button>\\n    \");\n    }\n    return MdMenuMissingError;\n}(MdError));\n/**\n * Exception thrown when menu's x-position value isn't valid.\n * In other words, it doesn't match 'before' or 'after'.\n * @docs-private\n */\nvar MdMenuInvalidPositionX = (function (_super) {\n    __extends$20(MdMenuInvalidPositionX, _super);\n    function MdMenuInvalidPositionX() {\n        _super.call(this, \"x-position value must be either 'before' or after'.\\n      Example: <md-menu x-position=\\\"before\\\" #menu=\\\"mdMenu\\\"></md-menu>\\n    \");\n    }\n    return MdMenuInvalidPositionX;\n}(MdError));\n/**\n * Exception thrown when menu's y-position value isn't valid.\n * In other words, it doesn't match 'above' or 'below'.\n * @docs-private\n */\nvar MdMenuInvalidPositionY = (function (_super) {\n    __extends$20(MdMenuInvalidPositionY, _super);\n    function MdMenuInvalidPositionY() {\n        _super.call(this, \"y-position value must be either 'above' or below'.\\n      Example: <md-menu y-position=\\\"above\\\" #menu=\\\"mdMenu\\\"></md-menu>\\n    \");\n    }\n    return MdMenuInvalidPositionY;\n}(MdError));\n\nvar __decorate$63 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$63 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * This directive is intended to be used inside an md-menu tag.\n * It exists mostly to set the role attribute.\n */\nvar MdMenuItem = (function () {\n    function MdMenuItem(_renderer, _elementRef) {\n        this._renderer = _renderer;\n        this._elementRef = _elementRef;\n    }\n    MdMenuItem.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus');\n    };\n    Object.defineProperty(MdMenuItem.prototype, \"disabled\", {\n        // this is necessary to support anchors\n        /** Whether the menu item is disabled. */\n        get: function () { return this._disabled; },\n        set: function (value) {\n            this._disabled = (value === false || value === undefined) ? null : true;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdMenuItem.prototype, \"isAriaDisabled\", {\n        /** Sets the aria-disabled property on the menu item. */\n        get: function () { return String(!!this.disabled); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdMenuItem.prototype, \"_tabindex\", {\n        get: function () { return this.disabled ? '-1' : '0'; },\n        enumerable: true,\n        configurable: true\n    });\n    MdMenuItem.prototype._getHostElement = function () {\n        return this._elementRef.nativeElement;\n    };\n    MdMenuItem.prototype._checkDisabled = function (event) {\n        if (this.disabled) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    };\n    __decorate$63([\n        _angular_core.HostBinding('attr.disabled'),\n        _angular_core.Input(), \n        __metadata$63('design:type', Boolean)\n    ], MdMenuItem.prototype, \"disabled\", null);\n    __decorate$63([\n        _angular_core.HostBinding('attr.aria-disabled'), \n        __metadata$63('design:type', String)\n    ], MdMenuItem.prototype, \"isAriaDisabled\", null);\n    MdMenuItem = __decorate$63([\n        _angular_core.Component({selector: '[md-menu-item], [mat-menu-item]',\n            host: {\n                'role': 'menuitem',\n                '(click)': '_checkDisabled($event)',\n                '[attr.tabindex]': '_tabindex'\n            },\n            template: \"<ng-content></ng-content><div class=\\\"md-menu-ripple\\\" *ngIf=\\\"!disabled\\\" md-ripple mdRippleBackgroundColor=\\\"rgba(0,0,0,0)\\\" [mdRippleTrigger]=\\\"_getHostElement()\\\"></div>\",\n            exportAs: 'mdMenuItem'\n        }), \n        __metadata$63('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], MdMenuItem);\n    return MdMenuItem;\n}());\n\n/**\n * Below are all the animations for the md-menu component.\n * Animation duration and timing values are based on Material 1.\n */\n/**\n * This animation controls the menu panel's entry and exit from the page.\n *\n * When the menu panel is added to the DOM, it scales in and fades in its border.\n *\n * When the menu panel is removed from the DOM, it simply fades out after a brief\n * delay to display the ripple.\n */\n// TODO(kara): switch to :enter and :leave once Mobile Safari is sorted out.\nvar transformMenu = _angular_core.trigger('transformMenu', [\n    _angular_core.state('showing', _angular_core.style({\n        opacity: 1,\n        transform: \"scale(1)\"\n    })),\n    _angular_core.transition('void => *', [\n        _angular_core.style({\n            opacity: 0,\n            transform: \"scale(0)\"\n        }),\n        _angular_core.animate(\"200ms cubic-bezier(0.25, 0.8, 0.25, 1)\")\n    ]),\n    _angular_core.transition('* => void', [\n        _angular_core.animate('50ms 100ms linear', _angular_core.style({ opacity: 0 }))\n    ])\n]);\n/**\n * This animation fades in the background color and content of the menu panel\n * after its containing element is scaled in.\n */\nvar fadeInItems = _angular_core.trigger('fadeInItems', [\n    _angular_core.state('showing', _angular_core.style({ opacity: 1 })),\n    _angular_core.transition('void => *', [\n        _angular_core.style({ opacity: 0 }),\n        _angular_core.animate(\"200ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)\")\n    ])\n]);\n\n// TODO(kara): prevent-close functionality\nvar __decorate$62 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$62 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$14 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MdMenu = (function () {\n    function MdMenu(posX, posY) {\n        /** Config object to be passed into the menu's ngClass */\n        this._classList = {};\n        /** Position of the menu in the X axis. */\n        this.positionX = 'after';\n        /** Position of the menu in the Y axis. */\n        this.positionY = 'below';\n        /** Event emitted when the menu is closed. */\n        this.close = new _angular_core.EventEmitter();\n        if (posX) {\n            this._setPositionX(posX);\n        }\n        if (posY) {\n            this._setPositionY(posY);\n        }\n        this.setPositionClasses(this.positionX, this.positionY);\n    }\n    MdMenu.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        this._keyManager = new ListKeyManager(this.items).withFocusWrap();\n        this._tabSubscription = this._keyManager.tabOut.subscribe(function () {\n            _this._emitCloseEvent();\n        });\n    };\n    MdMenu.prototype.ngOnDestroy = function () {\n        this._tabSubscription.unsubscribe();\n    };\n    Object.defineProperty(MdMenu.prototype, \"classList\", {\n        /**\n         * This method takes classes set on the host md-menu element and applies them on the\n         * menu template that displays in the overlay container.  Otherwise, it's difficult\n         * to style the containing menu from outside the component.\n         * @param classes list of class names\n         */\n        set: function (classes) {\n            this._classList = classes.split(' ').reduce(function (obj, className) {\n                obj[className] = true;\n                return obj;\n            }, {});\n            this.setPositionClasses(this.positionX, this.positionY);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Focus the first item in the menu. This method is used by the menu trigger\n     * to focus the first item when the menu is opened by the ENTER key.\n     */\n    MdMenu.prototype.focusFirstItem = function () {\n        this._keyManager.focusFirstItem();\n    };\n    /**\n     * This emits a close event to which the trigger is subscribed. When emitted, the\n     * trigger will close the menu.\n     */\n    MdMenu.prototype._emitCloseEvent = function () {\n        this.close.emit();\n    };\n    MdMenu.prototype._setPositionX = function (pos) {\n        if (pos !== 'before' && pos !== 'after') {\n            throw new MdMenuInvalidPositionX();\n        }\n        this.positionX = pos;\n    };\n    MdMenu.prototype._setPositionY = function (pos) {\n        if (pos !== 'above' && pos !== 'below') {\n            throw new MdMenuInvalidPositionY();\n        }\n        this.positionY = pos;\n    };\n    /**\n     * It's necessary to set position-based classes to ensure the menu panel animation\n     * folds out from the correct direction.\n     */\n    MdMenu.prototype.setPositionClasses = function (posX, posY) {\n        this._classList['md-menu-before'] = posX == 'before';\n        this._classList['md-menu-after'] = posX == 'after';\n        this._classList['md-menu-above'] = posY == 'above';\n        this._classList['md-menu-below'] = posY == 'below';\n    };\n    __decorate$62([\n        _angular_core.ViewChild(_angular_core.TemplateRef), \n        __metadata$62('design:type', _angular_core.TemplateRef)\n    ], MdMenu.prototype, \"templateRef\", void 0);\n    __decorate$62([\n        _angular_core.ContentChildren(MdMenuItem), \n        __metadata$62('design:type', _angular_core.QueryList)\n    ], MdMenu.prototype, \"items\", void 0);\n    __decorate$62([\n        _angular_core.Input('class'), \n        __metadata$62('design:type', String), \n        __metadata$62('design:paramtypes', [String])\n    ], MdMenu.prototype, \"classList\", null);\n    __decorate$62([\n        _angular_core.Output(), \n        __metadata$62('design:type', Object)\n    ], MdMenu.prototype, \"close\", void 0);\n    MdMenu = __decorate$62([\n        _angular_core.Component({selector: 'md-menu, mat-menu',\n            host: { 'role': 'menu' },\n            template: \"<template><div class=\\\"md-menu-panel\\\" [ngClass]=\\\"_classList\\\" (keydown)=\\\"_keyManager.onKeydown($event)\\\" (click)=\\\"_emitCloseEvent()\\\" [@transformMenu]=\\\"'showing'\\\"><div class=\\\"md-menu-content\\\" [@fadeInItems]=\\\"'showing'\\\"><ng-content></ng-content></div></div></template>\",\n            styles: [\".md-menu-panel{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh + 48px)}.md-menu-panel.md-menu-after.md-menu-below{transform-origin:left top}.md-menu-panel.md-menu-after.md-menu-above{transform-origin:left bottom}.md-menu-panel.md-menu-before.md-menu-below{transform-origin:right top}.md-menu-panel.md-menu-before.md-menu-above{transform-origin:right bottom}[dir=rtl] .md-menu-panel.md-menu-after.md-menu-below{transform-origin:right top}[dir=rtl] .md-menu-panel.md-menu-after.md-menu-above{transform-origin:right bottom}[dir=rtl] .md-menu-panel.md-menu-before.md-menu-below{transform-origin:left top}[dir=rtl] .md-menu-panel.md-menu-before.md-menu-above{transform-origin:left bottom}@media screen and (-ms-high-contrast:active){.md-menu-panel{outline:solid 1px}}.md-menu-content{padding-top:8px;padding-bottom:8px}[md-menu-item]{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;border:none;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display:flex;flex-direction:row;align-items:center;height:48px;padding:0 16px;font-size:16px;font-family:Roboto,\\\"Helvetica Neue\\\",sans-serif;text-align:start;text-decoration:none;position:relative}[md-menu-item][disabled]{cursor:default}[md-menu-item] md-icon{margin-right:16px}[dir=rtl] [md-menu-item] md-icon{margin-left:16px}button[md-menu-item]{width:100%}.md-menu-ripple{position:absolute;top:0;left:0;bottom:0;right:0}\"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            animations: [\n                transformMenu,\n                fadeInItems\n            ],\n            exportAs: 'mdMenu'\n        }),\n        __param$14(0, _angular_core.Attribute('x-position')),\n        __param$14(1, _angular_core.Attribute('y-position')), \n        __metadata$62('design:paramtypes', [String, String])\n    ], MdMenu);\n    return MdMenu;\n}());\n\nvar __decorate$64 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$64 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$15 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * This directive is intended to be used in conjunction with an md-menu tag.  It is\n * responsible for toggling the display of the provided menu instance.\n */\nvar MdMenuTrigger = (function () {\n    function MdMenuTrigger(_overlay, _element, _viewContainerRef, _renderer, _dir) {\n        this._overlay = _overlay;\n        this._element = _element;\n        this._viewContainerRef = _viewContainerRef;\n        this._renderer = _renderer;\n        this._dir = _dir;\n        this._menuOpen = false;\n        // tracking input type is necessary so it's possible to only auto-focus\n        // the first item of the list when the menu is opened via the keyboard\n        this._openedByMouse = false;\n        /** Event emitted when the associated menu is opened. */\n        this.onMenuOpen = new _angular_core.EventEmitter();\n        /** Event emitted when the associated menu is closed. */\n        this.onMenuClose = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(MdMenuTrigger.prototype, \"_deprecatedMenuTriggerFor\", {\n        /** @deprecated */\n        get: function () { return this.menu; },\n        set: function (v) { this.menu = v; },\n        enumerable: true,\n        configurable: true\n    });\n    MdMenuTrigger.prototype.ngAfterViewInit = function () {\n        var _this = this;\n        this._checkMenu();\n        this.menu.close.subscribe(function () { return _this.closeMenu(); });\n    };\n    MdMenuTrigger.prototype.ngOnDestroy = function () { this.destroyMenu(); };\n    Object.defineProperty(MdMenuTrigger.prototype, \"menuOpen\", {\n        /** Whether the menu is open. */\n        get: function () { return this._menuOpen; },\n        enumerable: true,\n        configurable: true\n    });\n    /** Toggles the menu between the open and closed states. */\n    MdMenuTrigger.prototype.toggleMenu = function () {\n        return this._menuOpen ? this.closeMenu() : this.openMenu();\n    };\n    /** Opens the menu. */\n    MdMenuTrigger.prototype.openMenu = function () {\n        if (!this._menuOpen) {\n            this._createOverlay();\n            this._overlayRef.attach(this._portal);\n            this._subscribeToBackdrop();\n            this._initMenu();\n        }\n    };\n    /** Closes the menu. */\n    MdMenuTrigger.prototype.closeMenu = function () {\n        if (this._overlayRef) {\n            this._overlayRef.detach();\n            this._backdropSubscription.unsubscribe();\n            this._resetMenu();\n        }\n    };\n    /** Removes the menu from the DOM. */\n    MdMenuTrigger.prototype.destroyMenu = function () {\n        if (this._overlayRef) {\n            this._overlayRef.dispose();\n            this._overlayRef = null;\n            this._cleanUpSubscriptions();\n        }\n    };\n    /** Focuses the menu trigger. */\n    MdMenuTrigger.prototype.focus = function () {\n        this._renderer.invokeElementMethod(this._element.nativeElement, 'focus');\n    };\n    Object.defineProperty(MdMenuTrigger.prototype, \"dir\", {\n        /** The text direction of the containing app. */\n        get: function () {\n            return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * This method ensures that the menu closes when the overlay backdrop is clicked.\n     * We do not use first() here because doing so would not catch clicks from within\n     * the menu, and it would fail to unsubscribe properly. Instead, we unsubscribe\n     * explicitly when the menu is closed or destroyed.\n     */\n    MdMenuTrigger.prototype._subscribeToBackdrop = function () {\n        var _this = this;\n        this._backdropSubscription = this._overlayRef.backdropClick().subscribe(function () {\n            _this.closeMenu();\n        });\n    };\n    /**\n     * This method sets the menu state to open and focuses the first item if\n     * the menu was opened via the keyboard.\n     */\n    MdMenuTrigger.prototype._initMenu = function () {\n        this._setIsMenuOpen(true);\n        // Should only set focus if opened via the keyboard, so keyboard users can\n        // can easily navigate menu items. According to spec, mouse users should not\n        // see the focus style.\n        if (!this._openedByMouse) {\n            this.menu.focusFirstItem();\n        }\n    };\n    \n    /**\n     * This method resets the menu when it's closed, most importantly restoring\n     * focus to the menu trigger if the menu was opened via the keyboard.\n     */\n    MdMenuTrigger.prototype._resetMenu = function () {\n        this._setIsMenuOpen(false);\n        // Focus only needs to be reset to the host element if the menu was opened\n        // by the keyboard and manually shifted to the first menu item.\n        if (!this._openedByMouse) {\n            this.focus();\n        }\n        this._openedByMouse = false;\n    };\n    // set state rather than toggle to support triggers sharing a menu\n    MdMenuTrigger.prototype._setIsMenuOpen = function (isOpen) {\n        this._menuOpen = isOpen;\n        this._menuOpen ? this.onMenuOpen.emit() : this.onMenuClose.emit();\n    };\n    /**\n     *  This method checks that a valid instance of MdMenu has been passed into\n     *  mdMenuTriggerFor. If not, an exception is thrown.\n     */\n    MdMenuTrigger.prototype._checkMenu = function () {\n        if (!this.menu) {\n            throw new MdMenuMissingError();\n        }\n    };\n    /**\n     *  This method creates the overlay from the provided menu's template and saves its\n     *  OverlayRef so that it can be attached to the DOM when openMenu is called.\n     */\n    MdMenuTrigger.prototype._createOverlay = function () {\n        if (!this._overlayRef) {\n            this._portal = new TemplatePortal(this.menu.templateRef, this._viewContainerRef);\n            var config = this._getOverlayConfig();\n            this._subscribeToPositions(config.positionStrategy);\n            this._overlayRef = this._overlay.create(config);\n        }\n    };\n    /**\n     * This method builds the configuration object needed to create the overlay, the OverlayState.\n     * @returns OverlayState\n     */\n    MdMenuTrigger.prototype._getOverlayConfig = function () {\n        var overlayState = new OverlayState();\n        overlayState.positionStrategy = this._getPosition()\n            .withDirection(this.dir);\n        overlayState.hasBackdrop = true;\n        overlayState.backdropClass = 'cdk-overlay-transparent-backdrop';\n        overlayState.direction = this.dir;\n        return overlayState;\n    };\n    /**\n     * Listens to changes in the position of the overlay and sets the correct classes\n     * on the menu based on the new position. This ensures the animation origin is always\n     * correct, even if a fallback position is used for the overlay.\n     */\n    MdMenuTrigger.prototype._subscribeToPositions = function (position) {\n        var _this = this;\n        this._positionSubscription = position.onPositionChange.subscribe(function (change) {\n            var posX = change.connectionPair.originX === 'start' ? 'after' : 'before';\n            var posY = change.connectionPair.originY === 'top' ? 'below' : 'above';\n            _this.menu.setPositionClasses(posX, posY);\n        });\n    };\n    /**\n     * This method builds the position strategy for the overlay, so the menu is properly connected\n     * to the trigger.\n     * @returns ConnectedPositionStrategy\n     */\n    MdMenuTrigger.prototype._getPosition = function () {\n        var _a = this.menu.positionX === 'before' ? ['end', 'start'] : ['start', 'end'], posX = _a[0], fallbackX = _a[1];\n        var _b = this.menu.positionY === 'above' ? ['bottom', 'top'] : ['top', 'bottom'], posY = _b[0], fallbackY = _b[1];\n        return this._overlay.position()\n            .connectedTo(this._element, { originX: posX, originY: posY }, { overlayX: posX, overlayY: posY })\n            .withFallbackPosition({ originX: fallbackX, originY: posY }, { overlayX: fallbackX, overlayY: posY })\n            .withFallbackPosition({ originX: posX, originY: fallbackY }, { overlayX: posX, overlayY: fallbackY })\n            .withFallbackPosition({ originX: fallbackX, originY: fallbackY }, { overlayX: fallbackX, overlayY: fallbackY });\n    };\n    MdMenuTrigger.prototype._cleanUpSubscriptions = function () {\n        if (this._backdropSubscription) {\n            this._backdropSubscription.unsubscribe();\n        }\n        if (this._positionSubscription) {\n            this._positionSubscription.unsubscribe();\n        }\n    };\n    MdMenuTrigger.prototype._handleMousedown = function (event) {\n        if (!isFakeMousedownFromScreenReader(event)) {\n            this._openedByMouse = true;\n        }\n    };\n    __decorate$64([\n        _angular_core.Input('md-menu-trigger-for'), \n        __metadata$64('design:type', Object)\n    ], MdMenuTrigger.prototype, \"_deprecatedMenuTriggerFor\", null);\n    __decorate$64([\n        _angular_core.Input('mdMenuTriggerFor'), \n        __metadata$64('design:type', Object)\n    ], MdMenuTrigger.prototype, \"menu\", void 0);\n    __decorate$64([\n        _angular_core.Output(), \n        __metadata$64('design:type', Object)\n    ], MdMenuTrigger.prototype, \"onMenuOpen\", void 0);\n    __decorate$64([\n        _angular_core.Output(), \n        __metadata$64('design:type', Object)\n    ], MdMenuTrigger.prototype, \"onMenuClose\", void 0);\n    MdMenuTrigger = __decorate$64([\n        _angular_core.Directive({\n            selector: '[md-menu-trigger-for], [mat-menu-trigger-for], [mdMenuTriggerFor]',\n            host: {\n                'aria-haspopup': 'true',\n                '(mousedown)': '_handleMousedown($event)',\n                '(click)': 'toggleMenu()',\n            },\n            exportAs: 'mdMenuTrigger'\n        }),\n        __param$15(4, _angular_core.Optional()), \n        __metadata$64('design:paramtypes', [Overlay, _angular_core.ElementRef, _angular_core.ViewContainerRef, _angular_core.Renderer, Dir])\n    ], MdMenuTrigger);\n    return MdMenuTrigger;\n}());\n\nvar __decorate$61 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$61 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdMenuModule = (function () {\n    function MdMenuModule() {\n    }\n    MdMenuModule.forRoot = function () {\n        return {\n            ngModule: MdMenuModule,\n            providers: OVERLAY_PROVIDERS,\n        };\n    };\n    MdMenuModule = __decorate$61([\n        _angular_core.NgModule({\n            imports: [OverlayModule, _angular_common.CommonModule, MdRippleModule, DefaultStyleCompatibilityModeModule],\n            exports: [MdMenu, MdMenuItem, MdMenuTrigger, DefaultStyleCompatibilityModeModule],\n            declarations: [MdMenu, MdMenuItem, MdMenuTrigger],\n        }), \n        __metadata$61('design:paramtypes', [])\n    ], MdMenuModule);\n    return MdMenuModule;\n}());\n\n// TODO(jelbourn): resizing\n// TODO(jelbourn): afterOpen and beforeClose\n/**\n * Reference to a dialog opened via the MdDialog service.\n */\nvar MdDialogRef = (function () {\n    function MdDialogRef(_overlayRef) {\n        this._overlayRef = _overlayRef;\n        /** Subject for notifying the user that the dialog has finished closing. */\n        this._afterClosed = new rxjs_Subject.Subject();\n    }\n    /**\n     * Close the dialog.\n     * @param dialogResult Optional result to return to the dialog opener.\n     */\n    MdDialogRef.prototype.close = function (dialogResult) {\n        this._overlayRef.dispose();\n        this._afterClosed.next(dialogResult);\n        this._afterClosed.complete();\n    };\n    /**\n     * Gets an observable that is notified when the dialog is finished closing.\n     */\n    MdDialogRef.prototype.afterClosed = function () {\n        return this._afterClosed.asObservable();\n    };\n    return MdDialogRef;\n}());\n\n/** Custom injector type specifically for instantiating components with a dialog. */\nvar DialogInjector = (function () {\n    function DialogInjector(_dialogRef, _parentInjector) {\n        this._dialogRef = _dialogRef;\n        this._parentInjector = _parentInjector;\n    }\n    DialogInjector.prototype.get = function (token, notFoundValue) {\n        if (token === MdDialogRef) {\n            return this._dialogRef;\n        }\n        return this._parentInjector.get(token, notFoundValue);\n    };\n    return DialogInjector;\n}());\n\n/**\n * Configuration for opening a modal dialog with the MdDialog service.\n */\nvar MdDialogConfig = (function () {\n    function MdDialogConfig() {\n        /** The ARIA role of the dialog element. */\n        this.role = 'dialog';\n        /** Whether the user can use escape or clicking outside to close a modal. */\n        this.disableClose = false;\n        /** Width of the dialog. */\n        this.width = '';\n        /** Height of the dialog. */\n        this.height = '';\n    }\n    return MdDialogConfig;\n}());\n\nvar __extends$22 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Exception thrown when a ComponentPortal is attached to a DomPortalHost without an origin.\n * @docs-private\n */\nvar MdDialogContentAlreadyAttachedError = (function (_super) {\n    __extends$22(MdDialogContentAlreadyAttachedError, _super);\n    function MdDialogContentAlreadyAttachedError() {\n        _super.call(this, 'Attempting to attach dialog content after content is already attached');\n    }\n    return MdDialogContentAlreadyAttachedError;\n}(MdError));\n\nvar __extends$21 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$67 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$67 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Internal component that wraps user-provided dialog content.\n * @docs-private\n */\nvar MdDialogContainer = (function (_super) {\n    __extends$21(MdDialogContainer, _super);\n    function MdDialogContainer(_ngZone) {\n        _super.call(this);\n        this._ngZone = _ngZone;\n        /** Element that was focused before the dialog was opened. Save this to restore upon close. */\n        this._elementFocusedBeforeDialogWasOpened = null;\n    }\n    /**\n     * Attach a portal as content to this dialog container.\n     * @param portal Portal to be attached as the dialog content.\n     */\n    MdDialogContainer.prototype.attachComponentPortal = function (portal) {\n        var _this = this;\n        if (this._portalHost.hasAttached()) {\n            throw new MdDialogContentAlreadyAttachedError();\n        }\n        var attachResult = this._portalHost.attachComponentPortal(portal);\n        // If were to attempt to focus immediately, then the content of the dialog would not yet be\n        // ready in instances where change detection has to run first. To deal with this, we simply\n        // wait for the microtask queue to be empty.\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            _this._elementFocusedBeforeDialogWasOpened = document.activeElement;\n            _this._focusTrap.focusFirstTabbableElement();\n        });\n        return attachResult;\n    };\n    /** @docs-private */\n    MdDialogContainer.prototype.attachTemplatePortal = function (portal) {\n        throw Error('Not yet implemented');\n    };\n    /**\n     * Handles the user pressing the Escape key.\n     * @docs-private\n     */\n    MdDialogContainer.prototype.handleEscapeKey = function () {\n        if (!this.dialogConfig.disableClose) {\n            this.dialogRef.close();\n        }\n    };\n    MdDialogContainer.prototype.ngOnDestroy = function () {\n        var _this = this;\n        // When the dialog is destroyed, return focus to the element that originally had it before\n        // the dialog was opened. Wait for the DOM to finish settling before changing the focus so\n        // that it doesn't end up back on the <body>.\n        this._ngZone.onMicrotaskEmpty.first().subscribe(function () {\n            _this._elementFocusedBeforeDialogWasOpened.focus();\n        });\n    };\n    __decorate$67([\n        _angular_core.ViewChild(PortalHostDirective), \n        __metadata$67('design:type', PortalHostDirective)\n    ], MdDialogContainer.prototype, \"_portalHost\", void 0);\n    __decorate$67([\n        _angular_core.ViewChild(FocusTrap), \n        __metadata$67('design:type', FocusTrap)\n    ], MdDialogContainer.prototype, \"_focusTrap\", void 0);\n    MdDialogContainer = __decorate$67([\n        _angular_core.Component({selector: 'md-dialog-container, mat-dialog-container',\n            template: \"<cdk-focus-trap><template cdkPortalHost></template></cdk-focus-trap>\",\n            styles: [\"md-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;max-width:80vw;width:100%;height:100%}@media screen and (-ms-high-contrast:active){md-dialog-container{outline:solid 1px}}[mat-dialog-content],[md-dialog-content],mat-dialog-content,md-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto}[mat-dialog-title],[md-dialog-title]{font-size:20px;font-weight:700;margin:0 0 20px;display:block}[mat-dialog-actions],[md-dialog-actions],mat-dialog-actions,md-dialog-actions{padding:12px 0;display:block}[mat-dialog-actions]:last-child,[md-dialog-actions]:last-child,mat-dialog-actions:last-child,md-dialog-actions:last-child{margin-bottom:-24px}\"],\n            host: {\n                'class': 'md-dialog-container',\n                '[attr.role]': 'dialogConfig?.role',\n                '(keydown.escape)': 'handleEscapeKey()',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$67('design:paramtypes', [_angular_core.NgZone])\n    ], MdDialogContainer);\n    return MdDialogContainer;\n}(BasePortalHost));\n\nvar __decorate$66 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$66 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// TODO(jelbourn): add support for opening with a TemplateRef\n// TODO(jelbourn): animations\n/**\n * Service to open Material Design modal dialogs.\n */\nvar MdDialog = (function () {\n    function MdDialog(_overlay, _injector) {\n        this._overlay = _overlay;\n        this._injector = _injector;\n        /** Keeps track of the currently-open dialogs. */\n        this._openDialogs = [];\n    }\n    /**\n     * Opens a modal dialog containing the given component.\n     * @param component Type of the component to load into the load.\n     * @param config Extra configuration options.\n     * @returns Reference to the newly-opened dialog.\n     */\n    MdDialog.prototype.open = function (component, config) {\n        var _this = this;\n        config = _applyConfigDefaults$1(config);\n        var overlayRef = this._createOverlay(config);\n        var dialogContainer = this._attachDialogContainer(overlayRef, config);\n        var dialogRef = this._attachDialogContent(component, dialogContainer, overlayRef);\n        this._openDialogs.push(dialogRef);\n        dialogRef.afterClosed().subscribe(function () { return _this._removeOpenDialog(dialogRef); });\n        return dialogRef;\n    };\n    /**\n     * Closes all of the currently-open dialogs.\n     */\n    MdDialog.prototype.closeAll = function () {\n        var i = this._openDialogs.length;\n        while (i--) {\n            // The `_openDialogs` property isn't updated after close until the rxjs subscription\n            // runs on the next microtask, in addition to modifying the array as we're going\n            // through it. We loop through all of them and call close without assuming that\n            // they'll be removed from the list instantaneously.\n            this._openDialogs[i].close();\n        }\n    };\n    /**\n     * Creates the overlay into which the dialog will be loaded.\n     * @param dialogConfig The dialog configuration.\n     * @returns A promise resolving to the OverlayRef for the created overlay.\n     */\n    MdDialog.prototype._createOverlay = function (dialogConfig) {\n        var overlayState = this._getOverlayState(dialogConfig);\n        return this._overlay.create(overlayState);\n    };\n    /**\n     * Attaches an MdDialogContainer to a dialog's already-created overlay.\n     * @param overlay Reference to the dialog's underlying overlay.\n     * @param config The dialog configuration.\n     * @returns A promise resolving to a ComponentRef for the attached container.\n     */\n    MdDialog.prototype._attachDialogContainer = function (overlay, config) {\n        var viewContainer = config ? config.viewContainerRef : null;\n        var containerPortal = new ComponentPortal(MdDialogContainer, viewContainer);\n        var containerRef = overlay.attach(containerPortal);\n        containerRef.instance.dialogConfig = config;\n        return containerRef.instance;\n    };\n    /**\n     * Attaches the user-provided component to the already-created MdDialogContainer.\n     * @param component The type of component being loaded into the dialog.\n     * @param dialogContainer Reference to the wrapping MdDialogContainer.\n     * @param overlayRef Reference to the overlay in which the dialog resides.\n     * @returns A promise resolving to the MdDialogRef that should be returned to the user.\n     */\n    MdDialog.prototype._attachDialogContent = function (component, dialogContainer, overlayRef) {\n        // Create a reference to the dialog we're creating in order to give the user a handle\n        // to modify and close it.\n        var dialogRef = new MdDialogRef(overlayRef);\n        if (!dialogContainer.dialogConfig.disableClose) {\n            // When the dialog backdrop is clicked, we want to close it.\n            overlayRef.backdropClick().first().subscribe(function () { return dialogRef.close(); });\n        }\n        // Set the dialogRef to the container so that it can use the ref to close the dialog.\n        dialogContainer.dialogRef = dialogRef;\n        // We create an injector specifically for the component we're instantiating so that it can\n        // inject the MdDialogRef. This allows a component loaded inside of a dialog to close itself\n        // and, optionally, to return a value.\n        var dialogInjector = new DialogInjector(dialogRef, this._injector);\n        var contentPortal = new ComponentPortal(component, null, dialogInjector);\n        var contentRef = dialogContainer.attachComponentPortal(contentPortal);\n        dialogRef.componentInstance = contentRef.instance;\n        return dialogRef;\n    };\n    /**\n     * Creates an overlay state from a dialog config.\n     * @param dialogConfig The dialog configuration.\n     * @returns The overlay configuration.\n     */\n    MdDialog.prototype._getOverlayState = function (dialogConfig) {\n        var state$$1 = new OverlayState();\n        var strategy = this._overlay.position().global();\n        var position = dialogConfig.position;\n        state$$1.hasBackdrop = true;\n        state$$1.positionStrategy = strategy;\n        if (position && (position.left || position.right)) {\n            position.left ? strategy.left(position.left) : strategy.right(position.right);\n        }\n        else {\n            strategy.centerHorizontally();\n        }\n        if (position && (position.top || position.bottom)) {\n            position.top ? strategy.top(position.top) : strategy.bottom(position.bottom);\n        }\n        else {\n            strategy.centerVertically();\n        }\n        strategy.width(dialogConfig.width).height(dialogConfig.height);\n        return state$$1;\n    };\n    /**\n     * Removes a dialog from the array of open dialogs.\n     * @param dialogRef Dialog to be removed.\n     */\n    MdDialog.prototype._removeOpenDialog = function (dialogRef) {\n        var index = this._openDialogs.indexOf(dialogRef);\n        if (index > -1) {\n            this._openDialogs.splice(index, 1);\n        }\n    };\n    MdDialog = __decorate$66([\n        _angular_core.Injectable(), \n        __metadata$66('design:paramtypes', [Overlay, _angular_core.Injector])\n    ], MdDialog);\n    return MdDialog;\n}());\n/**\n * Applies default options to the dialog config.\n * @param dialogConfig Config to be modified.\n * @returns The new configuration object.\n */\nfunction _applyConfigDefaults$1(dialogConfig) {\n    return extendObject(new MdDialogConfig(), dialogConfig);\n}\n\nvar __decorate$68 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$68 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Button that will close the current dialog.\n */\nvar MdDialogClose = (function () {\n    function MdDialogClose(dialogRef) {\n        this.dialogRef = dialogRef;\n        /** Screenreader label for the button. */\n        this.ariaLabel = 'Close dialog';\n    }\n    __decorate$68([\n        _angular_core.Input('aria-label'), \n        __metadata$68('design:type', String)\n    ], MdDialogClose.prototype, \"ariaLabel\", void 0);\n    MdDialogClose = __decorate$68([\n        _angular_core.Directive({\n            selector: 'button[md-dialog-close], button[mat-dialog-close]',\n            host: {\n                '(click)': 'dialogRef.close()',\n                '[attr.aria-label]': 'ariaLabel'\n            }\n        }), \n        __metadata$68('design:paramtypes', [MdDialogRef])\n    ], MdDialogClose);\n    return MdDialogClose;\n}());\n/**\n * Title of a dialog element. Stays fixed to the top of the dialog when scrolling.\n */\nvar MdDialogTitle = (function () {\n    function MdDialogTitle() {\n    }\n    MdDialogTitle = __decorate$68([\n        _angular_core.Directive({\n            selector: '[md-dialog-title], [mat-dialog-title]'\n        }), \n        __metadata$68('design:paramtypes', [])\n    ], MdDialogTitle);\n    return MdDialogTitle;\n}());\n/**\n * Scrollable content container of a dialog.\n */\nvar MdDialogContent = (function () {\n    function MdDialogContent() {\n    }\n    MdDialogContent = __decorate$68([\n        _angular_core.Directive({\n            selector: '[md-dialog-content], md-dialog-content, [mat-dialog-content], mat-dialog-content'\n        }), \n        __metadata$68('design:paramtypes', [])\n    ], MdDialogContent);\n    return MdDialogContent;\n}());\n/**\n * Container for the bottom action buttons in a dialog.\n * Stays fixed to the bottom when scrolling.\n */\nvar MdDialogActions = (function () {\n    function MdDialogActions() {\n    }\n    MdDialogActions = __decorate$68([\n        _angular_core.Directive({\n            selector: '[md-dialog-actions], md-dialog-actions, [mat-dialog-actions], mat-dialog-actions'\n        }), \n        __metadata$68('design:paramtypes', [])\n    ], MdDialogActions);\n    return MdDialogActions;\n}());\n\nvar __decorate$65 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$65 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdDialogModule = (function () {\n    function MdDialogModule() {\n    }\n    MdDialogModule.forRoot = function () {\n        return {\n            ngModule: MdDialogModule,\n            providers: [MdDialog, OVERLAY_PROVIDERS, InteractivityChecker, Platform],\n        };\n    };\n    MdDialogModule = __decorate$65([\n        _angular_core.NgModule({\n            imports: [\n                OverlayModule,\n                PortalModule,\n                A11yModule,\n                DefaultStyleCompatibilityModeModule\n            ],\n            exports: [\n                MdDialogContainer,\n                MdDialogClose,\n                MdDialogTitle,\n                MdDialogContent,\n                MdDialogActions,\n                DefaultStyleCompatibilityModeModule\n            ],\n            declarations: [\n                MdDialogContainer,\n                MdDialogClose,\n                MdDialogTitle,\n                MdDialogActions,\n                MdDialogContent\n            ],\n            entryComponents: [MdDialogContainer],\n        }), \n        __metadata$65('design:paramtypes', [])\n    ], MdDialogModule);\n    return MdDialogModule;\n}());\n\nvar __decorate$24 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$24 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MATERIAL_MODULES = [\n    MdButtonModule,\n    MdButtonToggleModule,\n    MdCardModule,\n    MdChipsModule,\n    MdCheckboxModule,\n    MdDialogModule,\n    MdGridListModule,\n    MdIconModule,\n    MdInputModule,\n    MdListModule,\n    MdMenuModule,\n    MdProgressBarModule,\n    MdProgressSpinnerModule,\n    MdRadioModule,\n    MdRippleModule,\n    MdSelectModule,\n    MdSidenavModule,\n    MdSliderModule,\n    MdSlideToggleModule,\n    MdSnackBarModule,\n    MdTabsModule,\n    MdToolbarModule,\n    MdTooltipModule,\n    OverlayModule,\n    PortalModule,\n    RtlModule,\n    A11yModule,\n    PlatformModule,\n    ProjectionModule,\n    DefaultStyleCompatibilityModeModule,\n    ObserveContentModule\n];\nvar MaterialRootModule = (function () {\n    function MaterialRootModule() {\n    }\n    MaterialRootModule = __decorate$24([\n        _angular_core.NgModule({\n            imports: [\n                MdButtonModule.forRoot(),\n                MdCardModule.forRoot(),\n                MdChipsModule.forRoot(),\n                MdCheckboxModule.forRoot(),\n                MdGridListModule.forRoot(),\n                MdInputModule.forRoot(),\n                MdListModule.forRoot(),\n                MdProgressBarModule.forRoot(),\n                MdProgressSpinnerModule.forRoot(),\n                MdRippleModule.forRoot(),\n                MdSelectModule.forRoot(),\n                MdSidenavModule.forRoot(),\n                MdTabsModule.forRoot(),\n                MdToolbarModule.forRoot(),\n                PortalModule.forRoot(),\n                ProjectionModule.forRoot(),\n                RtlModule.forRoot(),\n                ObserveContentModule.forRoot(),\n                // These modules include providers.\n                A11yModule.forRoot(),\n                MdButtonToggleModule.forRoot(),\n                MdDialogModule.forRoot(),\n                MdIconModule.forRoot(),\n                MdMenuModule.forRoot(),\n                MdRadioModule.forRoot(),\n                MdSliderModule.forRoot(),\n                MdSlideToggleModule.forRoot(),\n                MdSnackBarModule.forRoot(),\n                MdTooltipModule.forRoot(),\n                PlatformModule.forRoot(),\n                OverlayModule.forRoot(),\n                DefaultStyleCompatibilityModeModule.forRoot(),\n            ],\n            exports: MATERIAL_MODULES,\n        }), \n        __metadata$24('design:paramtypes', [])\n    ], MaterialRootModule);\n    return MaterialRootModule;\n}());\nvar MaterialModule = (function () {\n    function MaterialModule() {\n    }\n    MaterialModule.forRoot = function () {\n        return { ngModule: MaterialRootModule };\n    };\n    MaterialModule = __decorate$24([\n        _angular_core.NgModule({\n            imports: MATERIAL_MODULES,\n            exports: MATERIAL_MODULES,\n        }), \n        __metadata$24('design:paramtypes', [])\n    ], MaterialModule);\n    return MaterialModule;\n}());\n\nexports.MdCoreModule = MdCoreModule;\nexports.Dir = Dir;\nexports.RtlModule = RtlModule;\nexports.ObserveContentModule = ObserveContentModule;\nexports.ObserveContent = ObserveContent;\nexports.Portal = Portal;\nexports.BasePortalHost = BasePortalHost;\nexports.ComponentPortal = ComponentPortal;\nexports.TemplatePortal = TemplatePortal;\nexports.PortalHostDirective = PortalHostDirective;\nexports.TemplatePortalDirective = TemplatePortalDirective;\nexports.PortalModule = PortalModule;\nexports.DomPortalHost = DomPortalHost;\nexports.MdPlatform = Platform;\nexports.Overlay = Overlay;\nexports.OVERLAY_PROVIDERS = OVERLAY_PROVIDERS;\nexports.OverlayContainer = OverlayContainer;\nexports.OverlayRef = OverlayRef;\nexports.OverlayState = OverlayState;\nexports.ConnectedOverlayDirective = ConnectedOverlayDirective;\nexports.OverlayOrigin = OverlayOrigin;\nexports.OverlayModule = OverlayModule;\nexports.ScrollDispatcher = ScrollDispatcher;\nexports.GestureConfig = GestureConfig;\nexports.MdRipple = MdRipple;\nexports.MdRippleModule = MdRippleModule;\nexports.LiveAnnouncer = LiveAnnouncer;\nexports.LIVE_ANNOUNCER_ELEMENT_TOKEN = LIVE_ANNOUNCER_ELEMENT_TOKEN;\nexports.MdLiveAnnouncer = LiveAnnouncer;\nexports.FocusTrap = FocusTrap;\nexports.InteractivityChecker = InteractivityChecker;\nexports.isFakeMousedownFromScreenReader = isFakeMousedownFromScreenReader;\nexports.A11yModule = A11yModule;\nexports.UniqueSelectionDispatcher = UniqueSelectionDispatcher;\nexports.MdUniqueSelectionDispatcher = UniqueSelectionDispatcher;\nexports.MdLineModule = MdLineModule;\nexports.MdLine = MdLine;\nexports.MdLineSetter = MdLineSetter;\nexports.applyCssTransform = applyCssTransform;\nexports.MdError = MdError;\nexports.coerceBooleanProperty = coerceBooleanProperty;\nexports.coerceNumberProperty = coerceNumberProperty;\nexports.DefaultStyleCompatibilityModeModule = DefaultStyleCompatibilityModeModule;\nexports.NoConflictStyleCompatibilityMode = NoConflictStyleCompatibilityMode;\nexports.DomProjectionHost = DomProjectionHost;\nexports.DomProjection = DomProjection;\nexports.ProjectionModule = ProjectionModule;\nexports.PlatformModule = PlatformModule;\nexports.Platform = Platform;\nexports.getSupportedInputTypes = getSupportedInputTypes;\nexports.ConnectedPositionStrategy = ConnectedPositionStrategy;\nexports.ConnectionPositionPair = ConnectionPositionPair;\nexports.ScrollableViewProperties = ScrollableViewProperties;\nexports.ConnectedOverlayPositionChange = ConnectedOverlayPositionChange;\nexports.UP_ARROW = UP_ARROW;\nexports.DOWN_ARROW = DOWN_ARROW;\nexports.RIGHT_ARROW = RIGHT_ARROW;\nexports.LEFT_ARROW = LEFT_ARROW;\nexports.PAGE_UP = PAGE_UP;\nexports.PAGE_DOWN = PAGE_DOWN;\nexports.HOME = HOME;\nexports.END = END;\nexports.ENTER = ENTER;\nexports.SPACE = SPACE;\nexports.TAB = TAB;\nexports.ESCAPE = ESCAPE;\nexports.BACKSPACE = BACKSPACE;\nexports.DELETE = DELETE;\nexports.MATERIAL_COMPATIBILITY_MODE = MATERIAL_COMPATIBILITY_MODE;\nexports.MAT_ELEMENTS_SELECTOR = MAT_ELEMENTS_SELECTOR;\nexports.MatPrefixEnforcer = MatPrefixEnforcer;\nexports.AnimationCurves = AnimationCurves;\nexports.AnimationDurations = AnimationDurations;\nexports.MaterialRootModule = MaterialRootModule;\nexports.MaterialModule = MaterialModule;\nexports.MdButton = MdButton;\nexports.MdAnchor = MdAnchor;\nexports.MdButtonModule = MdButtonModule;\nexports.MD_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = MD_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR;\nexports.MdButtonToggleChange = MdButtonToggleChange;\nexports.MdButtonToggleGroup = MdButtonToggleGroup;\nexports.MdButtonToggleGroupMultiple = MdButtonToggleGroupMultiple;\nexports.MdButtonToggle = MdButtonToggle;\nexports.MdButtonToggleModule = MdButtonToggleModule;\nexports.MdCardContent = MdCardContent;\nexports.MdCardTitle = MdCardTitle;\nexports.MdCardSubtitle = MdCardSubtitle;\nexports.MdCardActions = MdCardActions;\nexports.MdCardFooter = MdCardFooter;\nexports.MdCard = MdCard;\nexports.MdCardHeader = MdCardHeader;\nexports.MdCardTitleGroup = MdCardTitleGroup;\nexports.MdCardModule = MdCardModule;\nexports.MdChipList = MdChipList;\nexports.MdChipsModule = MdChipsModule;\nexports.MdChip = MdChip;\nexports.MD_CHECKBOX_CONTROL_VALUE_ACCESSOR = MD_CHECKBOX_CONTROL_VALUE_ACCESSOR;\nexports.MdCheckboxChange = MdCheckboxChange;\nexports.MdCheckbox = MdCheckbox;\nexports.MdCheckboxModule = MdCheckboxModule;\nexports.MdDialogModule = MdDialogModule;\nexports.MdDialog = MdDialog;\nexports.MdDialogContainer = MdDialogContainer;\nexports.MdDialogClose = MdDialogClose;\nexports.MdDialogTitle = MdDialogTitle;\nexports.MdDialogContent = MdDialogContent;\nexports.MdDialogActions = MdDialogActions;\nexports.MdDialogConfig = MdDialogConfig;\nexports.MdDialogRef = MdDialogRef;\nexports.MdGridList = MdGridList;\nexports.MdGridListModule = MdGridListModule;\nexports.MdIconInvalidNameError = MdIconInvalidNameError;\nexports.MdIcon = MdIcon;\nexports.MdIconModule = MdIconModule;\nexports.MdIconRegistry = MdIconRegistry;\nexports.MdTextareaAutosize = MdTextareaAutosize;\nexports.MD_INPUT_CONTROL_VALUE_ACCESSOR = MD_INPUT_CONTROL_VALUE_ACCESSOR;\nexports.MdInputPlaceholderConflictError = MdInputPlaceholderConflictError;\nexports.MdInputUnsupportedTypeError = MdInputUnsupportedTypeError;\nexports.MdInputDuplicatedHintError = MdInputDuplicatedHintError;\nexports.MdInput = MdInput;\nexports.MdInputModule = MdInputModule;\nexports.MdPlaceholder = MdPlaceholder;\nexports.MdHint = MdHint;\nexports.MdInputDirective = MdInputDirective;\nexports.MdInputContainer = MdInputContainer;\nexports.MdInputContainerPlaceholderConflictError = MdInputContainerPlaceholderConflictError;\nexports.MdInputContainerUnsupportedTypeError = MdInputContainerUnsupportedTypeError;\nexports.MdInputContainerDuplicatedHintError = MdInputContainerDuplicatedHintError;\nexports.MdInputContainerMissingMdInputError = MdInputContainerMissingMdInputError;\nexports.MdListDivider = MdListDivider;\nexports.MdList = MdList;\nexports.MdListAvatar = MdListAvatar;\nexports.MdListItem = MdListItem;\nexports.MdListModule = MdListModule;\nexports.MdMenuTrigger = MdMenuTrigger;\nexports.fadeInItems = fadeInItems;\nexports.transformMenu = transformMenu;\nexports.MdMenu = MdMenu;\nexports.MdMenuItem = MdMenuItem;\nexports.MdMenuModule = MdMenuModule;\nexports.MdProgressBar = MdProgressBar;\nexports.MdProgressBarModule = MdProgressBarModule;\nexports.MdProgressCircle = MdProgressSpinner;\nexports.MdProgressCircleModule = MdProgressSpinnerModule;\nexports.MdProgressSpinner = MdProgressSpinner;\nexports.MdSpinner = MdSpinner;\nexports.MdProgressSpinnerModule = MdProgressSpinnerModule;\nexports.MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR;\nexports.MdRadioChange = MdRadioChange;\nexports.MdRadioGroup = MdRadioGroup;\nexports.MdRadioButton = MdRadioButton;\nexports.MdRadioModule = MdRadioModule;\nexports.MdSelectModule = MdSelectModule;\nexports.MdOption = MdOption;\nexports.fadeInContent = fadeInContent;\nexports.transformPanel = transformPanel;\nexports.transformPlaceholder = transformPlaceholder;\nexports.SELECT_OPTION_HEIGHT = SELECT_OPTION_HEIGHT;\nexports.SELECT_PANEL_MAX_HEIGHT = SELECT_PANEL_MAX_HEIGHT;\nexports.SELECT_MAX_OPTIONS_DISPLAYED = SELECT_MAX_OPTIONS_DISPLAYED;\nexports.SELECT_TRIGGER_HEIGHT = SELECT_TRIGGER_HEIGHT;\nexports.SELECT_OPTION_HEIGHT_ADJUSTMENT = SELECT_OPTION_HEIGHT_ADJUSTMENT;\nexports.SELECT_PANEL_PADDING_X = SELECT_PANEL_PADDING_X;\nexports.SELECT_PANEL_PADDING_Y = SELECT_PANEL_PADDING_Y;\nexports.SELECT_PANEL_VIEWPORT_PADDING = SELECT_PANEL_VIEWPORT_PADDING;\nexports.MdSelect = MdSelect;\nexports.MdDuplicatedSidenavError = MdDuplicatedSidenavError;\nexports.MdSidenavToggleResult = MdSidenavToggleResult;\nexports.MdSidenav = MdSidenav;\nexports.MdSidenavContainer = MdSidenavContainer;\nexports.MdSidenavModule = MdSidenavModule;\nexports.MD_SLIDER_VALUE_ACCESSOR = MD_SLIDER_VALUE_ACCESSOR;\nexports.MdSliderChange = MdSliderChange;\nexports.MdSlider = MdSlider;\nexports.SliderRenderer = SliderRenderer;\nexports.MdSliderModule = MdSliderModule;\nexports.MD_SLIDE_TOGGLE_VALUE_ACCESSOR = MD_SLIDE_TOGGLE_VALUE_ACCESSOR;\nexports.MdSlideToggleChange = MdSlideToggleChange;\nexports.MdSlideToggle = MdSlideToggle;\nexports.MdSlideToggleModule = MdSlideToggleModule;\nexports.MdSnackBar = MdSnackBar;\nexports.MdSnackBarModule = MdSnackBarModule;\nexports.SHOW_ANIMATION = SHOW_ANIMATION;\nexports.HIDE_ANIMATION = HIDE_ANIMATION;\nexports.MdSnackBarContainer = MdSnackBarContainer;\nexports.MdSnackBarConfig = MdSnackBarConfig;\nexports.MdSnackBarRef = MdSnackBarRef;\nexports.MdInkBar = MdInkBar;\nexports.MdTabBody = MdTabBody;\nexports.MdTabHeader = MdTabHeader;\nexports.MdTabLabelWrapper = MdTabLabelWrapper;\nexports.MdTab = MdTab;\nexports.MdTabLabel = MdTabLabel;\nexports.MdTabChangeEvent = MdTabChangeEvent;\nexports.MdTabGroup = MdTabGroup;\nexports.MdTabsModule = MdTabsModule;\nexports.MdTabNavBar = MdTabNavBar;\nexports.MdTabLink = MdTabLink;\nexports.MdTabLinkRipple = MdTabLinkRipple;\nexports.MdToolbarRow = MdToolbarRow;\nexports.MdToolbar = MdToolbar;\nexports.MdToolbarModule = MdToolbarModule;\nexports.TOUCHEND_HIDE_DELAY = TOUCHEND_HIDE_DELAY;\nexports.MdTooltip = MdTooltip;\nexports.TooltipComponent = TooltipComponent;\nexports.MdTooltipModule = MdTooltipModule;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/@angular/material/bundles/material.umd.js\n ** module id = 71\n ** module chunks = 2\n **/","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar ViewportHelper = (function () {\n    function ViewportHelper() {\n    }\n    ViewportHelper = __decorate([\n        core_1.Injectable(), \n        __metadata('design:paramtypes', [])\n    ], ViewportHelper);\n    return ViewportHelper;\n}());\nexports.ViewportHelper = ViewportHelper;\nvar BrowserViewportHelper = (function (_super) {\n    __extends(BrowserViewportHelper, _super);\n    function BrowserViewportHelper() {\n        _super.apply(this, arguments);\n    }\n    BrowserViewportHelper.prototype.getDocumentNativeElement = function () {\n        return window.document;\n    };\n    BrowserViewportHelper.prototype.requestFrame = function (fn) {\n        return window.requestAnimationFrame(fn);\n    };\n    BrowserViewportHelper.prototype.matchMedia = function (query) {\n        return window.matchMedia(query);\n    };\n    BrowserViewportHelper.prototype.scrollTop = function () {\n        return window.pageYOffset || document.documentElement.scrollTop;\n    };\n    return BrowserViewportHelper;\n}(ViewportHelper));\nexports.BrowserViewportHelper = BrowserViewportHelper;\nvar NodeViewportMediaMatch = (function () {\n    function NodeViewportMediaMatch(matches, media) {\n        if (matches === void 0) { matches = false; }\n        if (media === void 0) { media = ''; }\n        this.matches = matches;\n        this.media = media;\n    }\n    NodeViewportMediaMatch.prototype.addListener = function (listener) {\n    };\n    NodeViewportMediaMatch.prototype.removeListener = function (listener) {\n    };\n    return NodeViewportMediaMatch;\n}());\nexports.NodeViewportMediaMatch = NodeViewportMediaMatch;\nvar NodeViewportHelper = (function (_super) {\n    __extends(NodeViewportHelper, _super);\n    function NodeViewportHelper() {\n        _super.apply(this, arguments);\n    }\n    NodeViewportHelper.prototype.getDocumentNativeElement = function () {\n        return {};\n    };\n    NodeViewportHelper.prototype.requestFrame = function (fn) {\n        return process.nextTick(fn);\n    };\n    NodeViewportHelper.prototype.matchMedia = function (query) {\n        return new NodeViewportMediaMatch(false, query);\n    };\n    NodeViewportHelper.prototype.scrollTop = function () {\n        return 0;\n    };\n    return NodeViewportHelper;\n}(ViewportHelper));\nexports.NodeViewportHelper = NodeViewportHelper;\n//# sourceMappingURL=viewport.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/core/util/viewport.js\n ** module id = 74\n ** module chunks = 2\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class EDWService {\n        \n    private PG_DB_BASE_URL = 'api/edw/pg';\n    private MSSQL_DB_BASE_URL = 'api/edw/mssql';\n\n\n    constructor(private http: Http) { }\n\n    private handleError(error: any): Promise<any> {\n        console.error('An error occurred getting data', error);\n        return Promise.reject(error.message || error);\n    }\n\n    private post( baseURL, fromDate, toDate, query, url){\n        return this.http\n          .post(baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n          .toPromise()\n          .then(response => response.json() as any)\n          .catch(this.handleError);    \n    }\n\n    /***\n     *      _____          _                  _____  ____  _      \n     *     |  __ \\        | |                / ____|/ __ \\| |     \n     *     | |__) |__  ___| |_ __ _ _ __ ___| (___ | |  | | |     \n     *     |  ___/ _ \\/ __| __/ _` | '__/ _ \\\\___ \\| |  | | |     \n     *     | |  | (_) \\__ \\ || (_| | | |  __/____) | |__| | |____ \n     *     |_|   \\___/|___/\\__\\__, |_|  \\___|_____/ \\___\\_\\______|\n     *                         __/ |                              \n     *                        |___/                               \n     */\n\n\n\n    getAIMSales(domains, fromDate, toDate){\n        var url  = '/aim_sales';\n        var query = { domains: domains };\n        return this.post(this.PG_DB_BASE_URL, fromDate, toDate, query, url);  \n    }\n    // Traffic Conversions\n    getTrafficConversions( fromDate, toDate, fromHour, toHour, sourceStr, domainStr, verticalValue, groupingValue, showDate ){\n        var url  = '/traffic_conversions_simple';\n        var query = { fromHour: fromHour, toHour: toHour, sourceValue: sourceStr, domainValue: domainStr, verticalValue : verticalValue, groupingValue : groupingValue, showDate : !showDate };\n        return this.post(this.PG_DB_BASE_URL, fromDate, toDate, query, url);  \n    }\n\n    getTrafficConversionsDetail( fromDate, toDate, sourceFilter, domainFilter, billingSite, campaign, content ){\n        var url  = '/traffic_conversions_simple_detail';\n        var query = {sourceFilter: sourceFilter, domainFilter: domainFilter, billingSite: billingSite, campaign: campaign, content: content};\n        return this.post(this.PG_DB_BASE_URL, fromDate, toDate, query, url);          \n    }\n\n    getSources(){\n        var url  = '/data_dictionary_sources';\n        var query = {};\n        return this.post(this.PG_DB_BASE_URL, \"\", \"\", query, url);          \n    }\n\n    getDomains(){\n        var url  = '/data_dictionary_domains';\n        var query = {};\n        return this.post(this.PG_DB_BASE_URL, \"\", \"\", query, url);          \n    }\n\n    getVerticals(){\n        var url  = '/data_dictionary_verticals';\n        var query = {};\n        return this.post(this.PG_DB_BASE_URL, \"\", \"\", query, url);          \n    }\n    \n    // Billing Performance\n\n    getBillingPerformance( fromDate, toDate, baseGroup, sourceStr, domainStr, verticalValue ){\n        var url  = '/billing_performance';\n        var query = { baseGroup: baseGroup, sourceValue: sourceStr, domainValue: domainStr, verticalValue : verticalValue };\n        return this.post(this.PG_DB_BASE_URL, fromDate, toDate, query, url);  \n    }\n\n    getBillingPerformanceDetail( fromDate, toDate, baseGroup, baseGroupFilter, sourceStr, domainStr, verticalValue ){\n        var url  = '/billing_performance_detail';\n        var query = { baseGroup: baseGroup, baseGroupFilter: baseGroupFilter, sourceValue: sourceStr, domainValue: domainStr, verticalValue : verticalValue };\n        return this.post(this.PG_DB_BASE_URL, fromDate, toDate, query, url);  \n    }    \n\n    \n    /***\n     *      __  __  _____ _____  ____  _      \n     *     |  \\/  |/ ____/ ____|/ __ \\| |     \n     *     | \\  / | (___| (___ | |  | | |     \n     *     | |\\/| |\\___ \\\\___ \\| |  | | |     \n     *     | |  | |____) |___) | |__| | |____ \n     *     |_|  |_|_____/_____/ \\___\\_\\______|\n     *                                        \n     *                                        \n     */\n\n    \n    getVisitorIdProviderPerformance( fromDate, toDate ){\n        var url = '/p_visitor_id_provider_performance';\n        var query = {};\n        return this.post(this.MSSQL_DB_BASE_URL, fromDate, toDate, query, url);\n    }\n\n    getVisitorIdProviderPerformanceDetail( date ){\n        var url = '/p_visitor_id_provider_performance_detail';\n        var query = {};\n        return this.post(this.MSSQL_DB_BASE_URL, date, \"\", query, url);\n    }\n\n    getVisitorIdProviderPerformanceDetail_2( date, pDomain, pSlot, pPage, pMD5Provider ){\n        var url = '/p_visitor_id_provider_performance_detail_2';\n        var query = {domain: pDomain, slot: pSlot, page: pPage, MD5Provider: pMD5Provider};\n        return this.post(this.MSSQL_DB_BASE_URL, date, \"\", query, url);\n    }    \n\n    getVisitorIdPivoted( fromDate, toDate ){\n        var url = '/p_visitor_id_pivoted';\n        var query = {};\n        return this.post(this.MSSQL_DB_BASE_URL, fromDate, toDate, query, url);\n    }\n\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/edw.service.ts\n **/","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\n__export(require('./components/charts/charts'));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-charts/ng2-charts.js\n ** module id = 85\n ** module chunks = 2\n **/","import { Injectable } from '@angular/core';\nimport { Http, Headers, Response } from '@angular/http';\nimport { UserManager, UserManagerSettings, User } from 'oidc-client';\n  \n@Injectable()\nexport class AuthenticationService {\n    private baseURL = 'api/users/authenticate';  // URL to web api\n\n    constructor(private http: Http) { }\n\n    login(username: string, password: string) {\n        return this.http.post( this.baseURL, { username: username, password: password })\n        //.toPromise()\n        //.then( (response: Response) => {response.json() as any\n        //      // login successful if there's a jwt token in the response\n        //      let user = response.json();\n        //      if (user && user.token) {\n        //          // store user details and jwt token in local storage to keep user logged in between page refreshes\n        //          localStorage.setItem('currentUser', JSON.stringify(user));\n        //      }\n        //      return user;\n        //})\n        //.catch(this.handleError);\n\n            .map((response: Response) => {\n                // login successful if there's a jwt token in the response\n                console.log('No user Error');\n                let user = response.json();\n                if (user && user.token) {\n                    // store user details and jwt token in local storage to keep user logged in between page refreshes\n                    localStorage.setItem('currentUser', JSON.stringify(user));\n                } else{\n                    console.log('No user Error');\n                }\n                return user;\n            },\n            error => {\n                console.error('Error' + error);\n            });\n    }\n\n    logout() {\n        // remove user from local storage to log user out\n        localStorage.removeItem('currentUser');\n    }\n\n} \n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/authentication.service.ts\n **/","\"use strict\";\nvar Animate = (function () {\n    function Animate() {\n    }\n    Animate.enter = function (el, cssClass) {\n        el.classList.remove(cssClass);\n        return new Promise(function (resolve) {\n            el.classList.add(cssClass + '-add');\n            setTimeout(function () {\n                var duration = Animate.getTransitionDuration(el, true);\n                var removeListener = function () { return done(false); };\n                var callTimeout = setTimeout(function () { return done(true); }, duration);\n                var done = function (timeout) {\n                    if (!removeListener) {\n                        return;\n                    }\n                    el.classList.remove(cssClass + '-add-active');\n                    el.classList.remove(cssClass + '-add');\n                    if (!timeout) {\n                        clearTimeout(callTimeout);\n                    }\n                    el.removeEventListener(Animate.TRANSITION_EVENT, removeListener);\n                    removeListener = null;\n                    resolve();\n                };\n                el.addEventListener(Animate.TRANSITION_EVENT, removeListener);\n                el.classList.add(cssClass + '-add-active');\n                el.classList.add(cssClass);\n            }, 1);\n        });\n    };\n    Animate.leave = function (el, cssClass) {\n        return new Promise(function (resolve) {\n            el.classList.add(cssClass + '-remove');\n            setTimeout(function () {\n                var duration = Animate.getTransitionDuration(el, true);\n                var callTimeout = setTimeout(function () { return done(true); }, duration);\n                var removeListener = function () { return done(false); };\n                var done = function (timeout) {\n                    if (!removeListener) {\n                        return;\n                    }\n                    el.classList.remove(cssClass + '-remove-active');\n                    el.classList.remove(cssClass + '-remove');\n                    if (!timeout) {\n                        clearTimeout(callTimeout);\n                    }\n                    el.removeEventListener(Animate.TRANSITION_EVENT, removeListener);\n                    removeListener = null;\n                    resolve();\n                };\n                el.addEventListener(Animate.TRANSITION_EVENT, removeListener);\n                el.classList.add(cssClass + '-remove-active');\n                el.classList.remove(cssClass);\n            }, 1);\n        });\n    };\n    Animate.getTransitionDuration = function (element, includeDelay) {\n        if (includeDelay === void 0) { includeDelay = false; }\n        var prefixes = ['', 'moz', 'webkit', 'ms', 'o', 'khtml'];\n        var style = window.getComputedStyle(element);\n        for (var i = 0; i < prefixes.length; i++) {\n            var durationProperty = (i === 0 ? '' : \"-\" + prefixes[i] + \"-\") + \"transition-duration\";\n            var duration = style[durationProperty];\n            if (!duration) {\n                continue;\n            }\n            duration = (duration.indexOf('ms') > -1) ? parseFloat(duration) : parseFloat(duration) * 1000;\n            if (duration === 0) {\n                continue;\n            }\n            if (includeDelay) {\n                var delayProperty = (i === 0 ? '' : \"-\" + prefixes[i] + \"-\") + \"transition-delay\";\n                var delay = style[delayProperty];\n                if (typeof delay !== 'undefined') {\n                    duration += (delay.indexOf('ms') > -1) ? parseFloat(delay) : parseFloat(delay) * 1000;\n                }\n            }\n            return duration;\n        }\n        return -1;\n    };\n    Animate.setTransitionDuration = function (element, delayMs) {\n        element.style['transition-duration'] = delayMs + \"ms\";\n    };\n    Animate.whichTransitionEvent = function () {\n        if (typeof document === 'undefined') {\n            return 'transitionend';\n        }\n        var t;\n        var el = document.createElement('fakeelement');\n        var transitions = {\n            'transition': 'transitionend',\n            'OTransition': 'oTransitionEnd',\n            'MozTransition': 'transitionend',\n            'WebkitTransition': 'webkitTransitionEnd'\n        };\n        for (t in transitions) {\n            if (el.style[t] !== undefined) {\n                return transitions[t];\n            }\n        }\n    };\n    Animate.setStyles = function (element, styles) {\n        var saveDuration = Animate.getTransitionDuration(element);\n        Animate.setTransitionDuration(element, 0);\n        return new Promise(function (resolve, reject) {\n            Object.keys(styles).forEach(function (key) {\n                element.style[key] = \"\" + styles[key];\n            });\n            if (saveDuration !== -1) {\n                Animate.setTransitionDuration(element, saveDuration);\n            }\n            else {\n                element.style['transition-duration'] = null;\n            }\n            resolve();\n        });\n    };\n    Animate.wait = function (milliseconds) {\n        if (milliseconds === void 0) { milliseconds = 10; }\n        return new Promise(function (resolve) {\n            setTimeout(function () { return resolve(); }, milliseconds);\n        });\n    };\n    Animate.TRANSITION_EVENT = Animate.whichTransitionEvent();\n    return Animate;\n}());\nexports.Animate = Animate;\n//# sourceMappingURL=animate.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/core/util/animate.js\n ** module id = 112\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require(\"@angular/core\");\nvar viewport_1 = require(\"./viewport\");\nvar BehaviorSubject_1 = require(\"rxjs/BehaviorSubject\");\nexports.MEDIA = {\n    'xs': '(max-width: 599px)',\n    'gt-xs': '(min-width: 600px)',\n    'sm': '(min-width: 600px) and (max-width: 959px)',\n    'gt-sm': '(min-width: 960px)',\n    'md': '(min-width: 960px) and (max-width: 1279px)',\n    'gt-md': '(min-width: 1280px)',\n    'lg': '(min-width: 1280px) and (max-width: 1919px)',\n    'gt-lg': '(min-width: 1920px)',\n    'xl': '(min-width: 1920px)'\n};\nexports.MEDIA_PRIORITY = [\n    'xl',\n    'gt-lg',\n    'lg',\n    'gt-md',\n    'md',\n    'gt-sm',\n    'sm',\n    'gt-xs',\n    'xs'\n];\nvar MediaListener = (function () {\n    function MediaListener(query, zone, mql, media) {\n        this.query = query;\n        this.zone = zone;\n        this.mql = mql;\n        this.media = media;\n        this.onMatched = new BehaviorSubject_1.BehaviorSubject(this.mql);\n        this._destroyed = false;\n        var subject = this.onMatched;\n        this._listener = function (mql) {\n            zone.run(function () { return subject.next(mql); });\n        };\n        this.mql.addListener(this._listener);\n    }\n    Object.defineProperty(MediaListener.prototype, \"matches\", {\n        get: function () {\n            return !this._destroyed && this.mql.matches;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MediaListener.prototype.destroy = function () {\n        if (!this._destroyed) {\n            this.mql.removeListener(this._listener);\n            this.media.unregisterListener(this);\n            this._destroyed = true;\n            this._listener = null;\n            this.mql = null;\n        }\n    };\n    return MediaListener;\n}());\nexports.MediaListener = MediaListener;\nvar Media = (function () {\n    function Media(viewport, zone) {\n        this.viewport = viewport;\n        this.zone = zone;\n        this.cache = {};\n    }\n    Media.prototype.listen = function (query) {\n        var listener = this.cache[query];\n        if (!listener) {\n            listener = this.cache[query] = {\n                mql: this.viewport.matchMedia(query),\n                references: 0\n            };\n        }\n        listener.references++;\n        return new MediaListener(query, this.zone, listener.mql, this);\n    };\n    Media.prototype.unregisterListener = function (listener) {\n        var cached = this.cache[listener.query];\n        if (cached) {\n            cached.references--;\n            if (cached.references === 0) {\n                delete this.cache[listener.query];\n            }\n        }\n    };\n    Media.prototype.hasMedia = function (size) {\n        var query = Media.getQuery(size);\n        if (!query) {\n            return false;\n        }\n        return this.viewport.matchMedia(query).matches;\n    };\n    Media.getQuery = function (size) {\n        var query = exports.MEDIA[size];\n        if (!query) {\n            console.warn(\"unknown media query size \" + size + \". Expected one of [\" + exports.MEDIA_PRIORITY.join(',') + \"]\");\n            return null;\n        }\n        return query;\n    };\n    Media = __decorate([\n        core_1.Injectable(), \n        __metadata('design:paramtypes', [viewport_1.ViewportHelper, core_1.NgZone])\n    ], Media);\n    return Media;\n}());\nexports.Media = Media;\n//# sourceMappingURL=media.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/core/util/media.js\n ** module id = 113\n ** module chunks = 2\n **/","import { Injectable } from '@angular/core';\nimport { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { AuthenticationService } from '../shared/services/authentication.service';\n \n@Injectable()\nexport class AuthGuard implements CanActivate {\n \n    constructor(private router: Router, private authenticationService: AuthenticationService) { }\n\n    isUserAuthenticated() {\n        if (localStorage.getItem('currentUser')) {\n            // logged in so return true\n            return true;\n        }\n        return false;\n    }\n\n    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n        if (this.isUserAuthenticated()) {\n            // logged in so return true\n            return true;\n        }\n        \n        // not logged in so redirect to login page with the return url\n        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});\n        return false;\n    }\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/auth/auth.guard.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {BaseChartDirective} from 'ng2-charts/ng2-charts';\n\nimport {StatsService} from '../../../shared/services/stats.service';\n\n// webpack html imports\nlet template = require('./by-day.html');\n\n@Component({\n  selector: 'by-day',\n  template: template\n})\n\nexport class ByDayComponent {\n\n  public chartOptions:any = {\n      responsive: true,\n      maintainAspectRatio: false,\n      title : {\n        display: true,\n        text: 'by day',\n        fontSize : 16\n      },\n      //showLines : false,\n      scales: {\n          xAxes: [{\n              gridLines: {\n                  drawOnChartArea: true,\n              },\n              ticks: {\n                  callback: function(value:any) {\n                      return value;\n                  }\n              }\n          }],\n          yAxes: [{\n              ticks: {\n                  beginAtZero: true,\n                  maxTicksLimit: 5\n              }\n          }]\n      },\n      elements: {\n          line: {\n              fill : false,\n              borderWidth: 2\n          },\n          point: {\n              radius: 4,\n              hitRadius: 10,\n              hoverRadius: 4,\n              hoverBorderWidth: 3,\n          }\n      },\n      legend: {\n          display: true,\n          position : 'bottom',\n          labels : {\n              fontSize : 12,\n              fontStyle : 'bold',\n              boxWidth : 20,\n              usePointStyle : true\n          }\n      },\n      tooltips : {\n          //intersect : true,\n          //mode : 'index'\n      }\n  };   \n\n  public chartColours:Array<any> = [\n        { \n            backgroundColor: '#b3d4fc',\n            borderColor: '#5d9cec',\n            pointHoverBackgroundColor: '#5d9cec'\n        }\n  ];\n\n  public chartLabels:string[] = [];\n  public chartType:string = 'line';\n  public chartLegend:boolean = true;\n\n  public chartData:any[] = [ {data: [], label: 'value'} ];\n\n  @ViewChild(BaseChartDirective) thechart:BaseChartDirective;\n\n  @Input() fromDate;\n  @Input() toDate;\n  @Input() query;\n\n  constructor(private statsService: StatsService){};\n\n  ngOnInit(): void {\n    this.load( this.fromDate, this.toDate, this.query );\n  }\n\n  public load( fromDate, toDate, query ){\n    this.statsService.getTotalByDay( fromDate, toDate, query ).then(response => { \n        var labels: string[] = [];\n        var multidata: any[] = [];\n        var data: number[] = [];\n        var newnetwork;\n        response.forEach( (network: any) => {\n            if(network._id != null){\n                if (newnetwork != network._id.network_name){\n                    if(newnetwork != undefined) multidata.push( { data : data, label: newnetwork } );\n                    newnetwork = network._id.network_name;\n                    data = [];\n                    labels = [];\n                }\n                var date = new Date(network._id.nw_dt_year, network._id.nw_dt_month - 1, network._id.nw_dt_day);\n                var label = date.getDate() == 1? '(' + (date.getMonth() + 1) + '/'+ date.getFullYear() + ') ' : ''+date.getDate();\n                labels.push( label );\n                data.push(network.total.toFixed(2));\n            }\n        });\n        multidata.push( { data : data, label: newnetwork } );\n        this.chartLabels = labels;\n        this.chartData = multidata; \n    });\n    \n  }\n\n  // events\n  public chartClicked(e:any):void {\n    //console.log(e);\n  }\n\n  public chartHovered(e:any):void {\n    //console.log(e);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/chartjs/by-day/by-day.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n//import {DailyStats} from '../data/daily-stats';\n\n@Injectable()\nexport class GatewayService {\n\n  private baseURL = 'api/stats';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getDataByUser( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/gateway/byuser?aggregate='+aggregate;\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getTransactions( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/gateway/transactions?aggregate='+aggregate;\n    //var group = { processor_id : '$processor_id', user: '$user', cc : '$cc' };\n    var group = { processor_id : '$processor_id', user: '$user' };\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query, group : group } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/gateway.service.ts\n **/","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar core_1 = require(\"@angular/core\");\nrequire('rxjs/add/operator/share');\nrequire('rxjs/add/operator/map');\nvar data_table_1 = require('./data_table');\nvar AbstractMdDataTableSelectableRow = (function () {\n    function AbstractMdDataTableSelectableRow(table, _element) {\n        this.table = table;\n        this._element = _element;\n        this.onChange = new core_1.EventEmitter(false);\n        this.isActive = false;\n        this.onChange.share();\n    }\n    AbstractMdDataTableSelectableRow.prototype.change = function (event) {\n        if (event.target.classList.contains('md-checkbox-inner-container')) {\n            event.preventDefault();\n        }\n        this.isActive = !this.isActive;\n        var changeEvent = {\n            name: 'selectable_row_change',\n            target: this,\n            isActive: this.isActive,\n            selectableValue: this.selectableValue\n        };\n        this.onChange.emit(changeEvent);\n    };\n    AbstractMdDataTableSelectableRow.prototype.ngAfterContentInit = function () { };\n    __decorate([\n        core_1.Input('selectable-value'), \n        __metadata('design:type', String)\n    ], AbstractMdDataTableSelectableRow.prototype, \"selectableValue\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], AbstractMdDataTableSelectableRow.prototype, \"onChange\", void 0);\n    AbstractMdDataTableSelectableRow = __decorate([\n        __param(0, core_1.Optional()),\n        __param(0, core_1.Inject(core_1.forwardRef(function () { return data_table_1.MdDataTable; }))), \n        __metadata('design:paramtypes', [data_table_1.MdDataTable, core_1.ElementRef])\n    ], AbstractMdDataTableSelectableRow);\n    return AbstractMdDataTableSelectableRow;\n}());\nexports.AbstractMdDataTableSelectableRow = AbstractMdDataTableSelectableRow;\nvar MdDataTableHeaderSelectableRow = (function (_super) {\n    __extends(MdDataTableHeaderSelectableRow, _super);\n    function MdDataTableHeaderSelectableRow(table, _element) {\n        _super.call(this, table, _element);\n        this.table = table;\n        this._element = _element;\n    }\n    MdDataTableHeaderSelectableRow.prototype._bindListener = function () {\n        var _this = this;\n        this.table.onSelectableChange\n            .map(function (event) { return event.allSelected; })\n            .subscribe(function (newActiveStatus) { return _this.isActive = newActiveStatus; });\n    };\n    MdDataTableHeaderSelectableRow.prototype.ngAfterContentInit = function () {\n        if (!!this.table) {\n            this._bindListener();\n        }\n    };\n    MdDataTableHeaderSelectableRow = __decorate([\n        core_1.Component({\n            selector: 'tr[md-data-table-header-selectable-row]',\n            template: \"\\n        <th class=\\\"md-data-check-cell\\\">\\n            <md-checkbox [checked]=\\\"isActive\\\"></md-checkbox>\\n        </th>\\n        <ng-content></ng-content>\\n    \",\n            host: {\n                '[class.active]': 'isActive',\n                '(click)': 'change($event)'\n            }\n        }),\n        __param(0, core_1.Optional()),\n        __param(0, core_1.Inject(core_1.forwardRef(function () { return data_table_1.MdDataTable; }))), \n        __metadata('design:paramtypes', [data_table_1.MdDataTable, core_1.ElementRef])\n    ], MdDataTableHeaderSelectableRow);\n    return MdDataTableHeaderSelectableRow;\n}(AbstractMdDataTableSelectableRow));\nexports.MdDataTableHeaderSelectableRow = MdDataTableHeaderSelectableRow;\nvar MdDataTableSelectableRow = (function (_super) {\n    __extends(MdDataTableSelectableRow, _super);\n    function MdDataTableSelectableRow(table, _element) {\n        _super.call(this, table, _element);\n        this.table = table;\n        this._element = _element;\n    }\n    MdDataTableSelectableRow.prototype._getIndex = function (element) {\n        return Array.prototype.indexOf.call(element.parentNode.children, element).toString();\n    };\n    MdDataTableSelectableRow.prototype._bindListener = function () {\n        var _this = this;\n        this.table.onSelectableChange\n            .map(function (event) {\n            return event.values !== undefined &&\n                event.values.length &&\n                (event.values.findIndex(function (value) { return value === _this.selectableValue; })) !== -1;\n        })\n            .subscribe(function (newActiveStatus) { return _this.isActive = newActiveStatus; });\n    };\n    MdDataTableSelectableRow.prototype.ngAfterContentInit = function () {\n        var element = this._element.nativeElement;\n        if (this.selectableValue === undefined) {\n            this.selectableValue = this._getIndex(element);\n        }\n        if (!!this.table) {\n            this._bindListener();\n        }\n    };\n    MdDataTableSelectableRow = __decorate([\n        core_1.Component({\n            selector: 'tr[md-data-table-selectable-row]',\n            template: \"\\n        <td class=\\\"md-data-check-cell\\\">\\n          <md-checkbox [checked]=\\\"isActive\\\"></md-checkbox>\\n        </td>\\n        <ng-content></ng-content>\\n    \",\n            host: {\n                '[class.active]': 'isActive',\n                '(click)': 'change($event)'\n            }\n        }),\n        __param(0, core_1.Optional()),\n        __param(0, core_1.Inject(core_1.forwardRef(function () { return data_table_1.MdDataTable; }))), \n        __metadata('design:paramtypes', [data_table_1.MdDataTable, core_1.ElementRef])\n    ], MdDataTableSelectableRow);\n    return MdDataTableSelectableRow;\n}(AbstractMdDataTableSelectableRow));\nexports.MdDataTableSelectableRow = MdDataTableSelectableRow;\n//# sourceMappingURL=data_table_selectable_tr.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/data-table/data_table_selectable_tr.js\n ** module id = 157\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar dialog_1 = require('./dialog');\nvar MdDialogActions = (function () {\n    function MdDialogActions() {\n    }\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdDialogActions.prototype, \"cancel\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdDialogActions.prototype, \"ok\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', dialog_1.MdDialog)\n    ], MdDialogActions.prototype, \"dialog\", void 0);\n    MdDialogActions = __decorate([\n        core_1.Component({\n            selector: 'md-dialog-actions',\n            template: \"\\n  <button *ngIf=\\\"cancel\\\" md-button type=\\\"button\\\" (click)=\\\"dialog.close(false)\\\">\\n    <span>{{ cancel }}</span>\\n  </button>\\n  <button *ngIf=\\\"ok\\\" md-button class=\\\"md-primary\\\" type=\\\"button\\\" (click)=\\\"dialog.close(true)\\\">\\n    <span>{{ ok }}</span>\\n  </button> \\n  <ng-content></ng-content>\",\n            changeDetection: core_1.ChangeDetectionStrategy.OnPush\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDialogActions);\n    return MdDialogActions;\n}());\nexports.MdDialogActions = MdDialogActions;\n//# sourceMappingURL=dialog-actions.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/dialog-actions.js\n ** module id = 158\n ** module chunks = 2\n **/","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar material_1 = require('@angular/material');\nvar MdDialogPortal = (function (_super) {\n    __extends(MdDialogPortal, _super);\n    function MdDialogPortal(templateRef, viewContainerRef) {\n        _super.call(this, templateRef, viewContainerRef);\n    }\n    MdDialogPortal = __decorate([\n        core_1.Directive({ selector: '[mdDialogPortal]' }), \n        __metadata('design:paramtypes', [core_1.TemplateRef, core_1.ViewContainerRef])\n    ], MdDialogPortal);\n    return MdDialogPortal;\n}(material_1.TemplatePortalDirective));\nexports.MdDialogPortal = MdDialogPortal;\n//# sourceMappingURL=dialog-portal.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/dialog-portal.js\n ** module id = 159\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar material_1 = require('@angular/material');\nvar material_2 = require('@angular/material');\nvar animate_1 = require('../../core/util/animate');\nvar dialog_portal_1 = require('./dialog-portal');\nvar dialog_actions_1 = require('./dialog-actions');\nvar key_codes_1 = require('../../core/key_codes');\nvar MdDialog = (function () {\n    function MdDialog(overlay) {\n        this.overlay = overlay;\n        this.onShow = new core_1.EventEmitter();\n        this.onClose = new core_1.EventEmitter();\n        this.onCancel = new core_1.EventEmitter();\n        this.active = false;\n        this.config = new material_2.OverlayState();\n        this.overlayRef = null;\n        this.config.positionStrategy = this.overlay.position()\n            .global()\n            .centerHorizontally()\n            .centerVertically();\n    }\n    MdDialog.prototype.ngAfterContentInit = function () {\n        if (this.actions) {\n            this.actions.dialog = this;\n        }\n    };\n    MdDialog.prototype.ngOnDestroy = function () {\n        return this.close();\n    };\n    MdDialog.prototype.show = function () {\n        var _this = this;\n        return this.close()\n            .then(function () { return _this.overlay.create(_this.config); })\n            .then(function (ref) {\n            _this.overlayRef = ref;\n            return ref.attach(_this.portal);\n        })\n            .then(function () { return animate_1.Animate.wait(); })\n            .then(function () {\n            _this.active = true;\n            _this.onShow.emit(_this);\n            return _this;\n        });\n    };\n    MdDialog.prototype.close = function (result, cancel) {\n        var _this = this;\n        if (result === void 0) { result = true; }\n        if (cancel === void 0) { cancel = false; }\n        if (!this.overlayRef) {\n            return Promise.resolve(this);\n        }\n        this.active = false;\n        return animate_1.Animate.wait(100)\n            .then(function () { return _this.overlayRef.detach(); })\n            .then(function () {\n            _this.overlayRef.dispose();\n            _this.overlayRef = null;\n            if (cancel) {\n                _this.onCancel.emit(result);\n            }\n            else {\n                _this.onClose.emit(result);\n            }\n            return _this;\n        });\n    };\n    MdDialog.prototype.onDocumentKeypress = function (event) {\n        if (event.keyCode == key_codes_1.KeyCodes.ESCAPE) {\n            this.close();\n        }\n    };\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdDialog.prototype, \"onShow\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdDialog.prototype, \"onClose\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdDialog.prototype, \"onCancel\", void 0);\n    __decorate([\n        core_1.ViewChild(dialog_portal_1.MdDialogPortal), \n        __metadata('design:type', dialog_portal_1.MdDialogPortal)\n    ], MdDialog.prototype, \"portal\", void 0);\n    __decorate([\n        core_1.ContentChild(dialog_actions_1.MdDialogActions), \n        __metadata('design:type', dialog_actions_1.MdDialogActions)\n    ], MdDialog.prototype, \"actions\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdDialog.prototype, \"config\", void 0);\n    MdDialog = __decorate([\n        core_1.Component({\n            selector: 'md-dialog',\n            providers: [material_1.Overlay, material_1.OVERLAY_PROVIDERS],\n            encapsulation: core_1.ViewEncapsulation.None,\n            template: \"\\n<template mdDialogPortal>\\n  <div class=\\\"md-dialog\\\" [class.md-active]=\\\"active\\\">\\n    <ng-content select=\\\"md-dialog-title\\\"></ng-content>\\n    <ng-content></ng-content>\\n    <ng-content select=\\\"md-dialog-actions\\\"></ng-content>\\n  </div>\\n</template>\\n\",\n            host: {\n                'tabindex': '0',\n                '(body:keydown)': 'onDocumentKeypress($event)'\n            }\n        }), \n        __metadata('design:paramtypes', [material_1.Overlay])\n    ], MdDialog);\n    return MdDialog;\n}());\nexports.MdDialog = MdDialog;\n//# sourceMappingURL=dialog.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/dialog.js\n ** module id = 160\n ** module chunks = 2\n **/","import { Component, OnInit } from '@angular/core';\n\nimport { AuthenticationService } from '../shared/services/authentication.service';\nimport { Router } from '@angular/router';\n\n@Component({\n  selector: 'app-auth-callback',\n  template: require('./auth-callback.component.html'),\n  styles: [require('./auth-callback.component.css')]\n})\nexport class AuthCallbackComponent implements OnInit {\n\n  constructor(private authenticationService: AuthenticationService, private router: Router) { }\n\n  ngOnInit() {\n    /*\n    this.authenticationService.completeAuthentication().then(() => {\n      if (this.authenticationService.isLoggedIn()) {\n        this.router.navigate(['dashboard']);\n      }\n    }, reason => {\n      // Error!\n      alert(\"Login error. Please contact the App Admin\");\n      this.router.navigate(['login']);\n    });\n    */\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/auth-callback/auth-callback.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router, ActivatedRoute } from '@angular/router';\n import { FormGroup, FormControl, Validators, FormBuilder } from '@angular/forms';\n\nimport { AuthenticationService } from './../shared/services/authentication.service';\nimport { AlertService } from './../shared/services/alert.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n\n@Component({\n    selector: 'login-page',\n    template: require('./login.component.html'),\n    styles: [require('./login.component.css')]\n})\n \nexport class LoginComponent implements OnInit {\n    model: any = {};\n    loading = false;\n    returnUrl: string;\n    public loginform: FormGroup;\n    public username = new FormControl('', Validators.required);\n    public password = new FormControl('', Validators.required);\n    \n    constructor( private route: ActivatedRoute, private router: Router, private fb: FormBuilder,\n        private authenticationService: AuthenticationService, private alertService: AlertService, private mdlSnackbarService: MdlSnackbarService) {        \n    }\n \n    ngOnInit() {\n        // reset login status\n        this.authenticationService.logout();\n\n        this.loginform = this.fb.group({\n            'username':  this.username,\n            'password':   this.password\n          });        \n\n      // get return url from route parameters or default to '/'\n      this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';\n    }\n \n    public login() {\n        this.loading = true;\n        this.authenticationService.login(this.username.value, this.password.value )\n            .subscribe(\n                data => {\n                    console.warn('login ok ' + this.returnUrl );\n                    this.router.navigate([this.returnUrl]);\n                },\n                error => {\n                    //console.warn('login error ' + error.message );\n                    this.mdlSnackbarService.showSnackbar({\n                        message: 'Username or password is incorrect',\n                        timeout: 3000\n                    });\n                    //this.alertService.error('error.message');\n                    this.loading = false;\n                }\n            );\n    }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/auth/login.component.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {BaseChartDirective} from 'ng2-charts/ng2-charts';\n\nimport {StatsService} from '../../../shared/services/stats.service';\n\n// webpack html imports\nlet template = require('./by-month.html');\n\n@Component({\n  selector: 'by-month',\n  template: template\n})\n\nexport class ByMonthComponent {\n\n  public chartOptions:any = {\n      responsive: true,\n      maintainAspectRatio: false,\n      title : {\n        display: true,\n        text: 'Revenue by month',\n        fontSize : 16\n      },\n      //showLines : false,\n      scales: {\n          xAxes: [{\n              gridLines: {\n                  drawOnChartArea: true,\n              },\n              ticks: {\n                  callback: function(value:any) {\n                      return value;\n                  }\n              }\n          }],\n          yAxes: [{\n              ticks: {\n                  beginAtZero: true,\n                  maxTicksLimit: 5\n              }\n          }]\n      },\n      elements: {\n          line: {\n              fill : false,\n              borderWidth: 2\n          },\n          point: {\n              radius: 4,\n              hitRadius: 10,\n              hoverRadius: 4,\n              hoverBorderWidth: 3,\n          }\n      },\n      legend: {\n          display: true,\n          position : 'bottom',\n          labels : {\n              fontSize : 12,\n              fontStyle : 'bold',\n              boxWidth : 20,\n              usePointStyle : true\n          }\n      },\n      tooltips : {\n          //intersect : true,\n          //mode : 'index'\n      }\n  };   \n\n  public chartColours:Array<any> = [\n        { \n            backgroundColor: '#b3d4fc',\n            borderColor: '#5d9cec',\n            pointHoverBackgroundColor: '#5d9cec'\n        }\n  ];\n\n  public chartLabels:string[] = [];\n  public chartType:string = 'bar';\n  public chartLegend:boolean = true;\n\n  public chartData:any[] = [ {data: [], label: 'revenue'} ];\n\n  @ViewChild(BaseChartDirective) thechart:BaseChartDirective;\n\n  @Input() fromDate;\n  @Input() toDate;\n  @Input() query;\n\n  constructor(private statsService: StatsService){};\n\n  ngOnInit(): void {\n    this.load( this.fromDate, this.toDate, this.query );\n  }\n\n  public load( fromDate, toDate, query ){\n    this.statsService.getTotalByDay( fromDate, toDate, query ).then(response => { \n        var labels: string[] = [];\n        var multidata: any[] = [];\n        var data: number[] = [];\n        var newnetwork;\n        response.forEach( (network: any) => {\n            if(network._id != null){\n                if (newnetwork != network._id.network_name){\n                    if(newnetwork != undefined) multidata.push( { data : data, label: newnetwork } );\n                    newnetwork = network._id.network_name;\n                    data = [];\n                    labels = [];\n                }\n                var date = new Date(network._id.nw_dt_year, network._id.nw_dt_month - 1, network._id.nw_dt_day);\n                //labels.push(month._id.month == 1? '(' + month._id.year + ') ' + month._id.month : month._id.month);\n                var label = date.getDate() == 1? '(' + (date.getMonth() + 1) + '/'+ date.getFullYear() + ') ' : ''+date.getDate();\n                labels.push( label );\n                data.push(network.revenue.toFixed(2));\n            }\n        });\n        multidata.push( { data : data, label: newnetwork } );\n        this.chartLabels = labels;\n        //this.chartData = [ {data : data, label: 'revenue'}]; \n        this.chartData = multidata; \n    });\n    \n  }\n\n  // events\n  public chartClicked(e:any):void {\n    //console.log(e);\n  }\n\n  public chartHovered(e:any):void {\n    //console.log(e);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/chartjs/by-month/by-month.ts\n **/","import {Component, OnInit, OnDestroy, Input, Output, ViewChild} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {BaseChartDirective} from 'ng2-charts/ng2-charts';\n\nimport {StatsService} from '../../../shared/services/stats.service';\n\n// webpack html imports\nlet template = require('./by-network.html');\n\n@Component({\n  selector: 'by-network',\n  template: template\n})\n\nexport class ByNetworkComponent {\n\n  @ViewChild(BaseChartDirective) thechart:BaseChartDirective;\n\n  @Input() fromDate;\n  @Input() toDate;\n\n  public chartOptions:any = {\n    scaleShowVerticalLines: false,\n    responsive: true\n  };\n\n  public chartLabels:string[] = [];\n  public chartType:string = 'bar';\n  public chartLegend:boolean = true;\n\n  public chartData:any[] = [ {data: [], label: 'Revenue by Network'} ];\n\n  public chartColours:Array<any> = [\n        { \n            backgroundColor: '#37bc9b',\n            borderColor: '#2b957a',\n            pointHoverBackgroundColor: '#2b957a',\n            borderWidth: 2,\n            lineTension: 0.25,\n            pointRadius: 0\n        }\n  ];\n\n  constructor(private statsService: StatsService){};\n\n  ngOnInit(): void {\n    this.load( this.fromDate, this.toDate );\n  }\n\n  public load( fromDate, toDate ){\n    this.statsService.getTotalByNetwork( 'network', fromDate, toDate ).then(response => { \n        var labels: string[] = [];\n        var data: number[] = [];\n        response.forEach( (network: any) => {\n            if(network._id != null){\n                labels.unshift(network._id);\n                data.unshift(network.revenue.toFixed(2));\n            }\n        });\n        this.chartLabels = labels;\n        this.chartData = [ {data : data, label: 'Revenue by Network'}]; \n    });    \n  }\n\n  // events\n  public chartClicked(e:any):void {\n    //console.log(e);\n  }\n\n  public chartHovered(e:any):void {\n    //console.log(e);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/chartjs/by-network/by-network.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {BaseChartDirective} from 'ng2-charts/ng2-charts';\n\nimport {StatsService} from '../../../shared/services/stats.service';\n\n// webpack html imports\nlet template = require('./by-day.html');\n\n@Component({\n  selector: 'type-by-day',\n  template: template\n})\n\nexport class TypeByDayComponent {\n\n  public chartOptions:any = {\n      responsive: true,\n      maintainAspectRatio: false,\n      title : {\n        display: true,\n        text: 'by day',\n        fontSize : 16\n      },\n      //showLines : false,\n      scales: {\n          xAxes: [{\n              gridLines: {\n                  drawOnChartArea: true,\n              },\n              ticks: {\n                  callback: function(value:any) {\n                      return value;\n                  }\n              }\n          }],\n          yAxes: [{\n              ticks: {\n                  beginAtZero: true,\n                  maxTicksLimit: 5\n              }\n          }]\n      },\n      elements: {\n          line: {\n              fill : false,\n              borderWidth: 2\n          },\n          point: {\n              radius: 4,\n              hitRadius: 10,\n              hoverRadius: 4,\n              hoverBorderWidth: 3,\n          }\n      },\n      legend: {\n          display: true,\n          position : 'bottom',\n          labels : {\n              fontSize : 12,\n              fontStyle : 'bold',\n              boxWidth : 20,\n              usePointStyle : true\n          }\n      },\n      tooltips : {\n          //intersect : true,\n          //mode : 'index'\n      }\n  };   \n\n  public chartColours:Array<any> = [\n        { \n            backgroundColor: '#b3d4fc',\n            borderColor: '#5d9cec',\n            pointHoverBackgroundColor: '#5d9cec'\n        }\n  ];\n\n  public chartLabels:string[] = [];\n  public chartType:string = 'line';\n  public chartLegend:boolean = true;\n\n  public chartData:any[] = [ {data: [], label: 'value'} ];\n\n  @ViewChild(BaseChartDirective) thechart:BaseChartDirective;\n\n  @Input() fromDate;\n  @Input() toDate;\n  @Input() query;\n\n  constructor(private statsService: StatsService){};\n\n  ngOnInit(): void {\n    this.load( this.fromDate, this.toDate, this.query );\n  }\n\n  public load( fromDate, toDate, query ){\n    this.statsService.getTotalByDayType( fromDate, toDate, query ).then(response => { \n        var labels: string[] = [];\n        var multidata: any[] = [];\n        var data: number[] = [];\n        var newnetwork;\n        response.forEach( (network: any) => {\n            if(network._id != null){\n                if (newnetwork != network._id.network_type){\n                    if(newnetwork != undefined) multidata.push( { data : data, label: newnetwork } );\n                    newnetwork = network._id.network_type;\n                    data = [];\n                    labels = [];\n                }\n                var date = new Date(network._id.nw_dt_year, network._id.nw_dt_month - 1, network._id.nw_dt_day);\n                var label = date.getDate() == 1? '(' + (date.getMonth() + 1) + '/'+ date.getFullYear() + ') ' : ''+date.getDate();\n                labels.push( label );\n                data.push(network.total.toFixed(2));\n            }\n        });\n        multidata.push( { data : data, label: newnetwork } );\n        this.chartLabels = labels;\n        this.chartData = multidata; \n    });\n    \n  }\n\n  // events\n  public chartClicked(e:any):void {\n    //console.log(e);\n  }\n\n  public chartHovered(e:any):void {\n    //console.log(e);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/chartjs/type-by-day/by-day.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\nimport {Router} from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\n\nimport {StatsService} from '../../../shared/services/stats.service';\nimport {ByDayComponent} from './../../../components/chartjs/by-day/by-day';\n\n@Component({\n  selector: 'dashboard-ads-by-day',\n  template: require('./dashboard.component.html'),\n  providers: [StatsService]\n})\n\nexport class SpendByDayDashboardComponent implements OnInit {\n  @ViewChild(ByDayComponent) thechart:ByDayComponent;\n\n  ranges: any[] = [];\n  rangeId: any = 1;\n  form: FormGroup;\n\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private query: any = {};\n\n  constructor(private statsService: StatsService,\n              private router: Router) { }\n\n  private initRange(){\n\n    this.query = { network_type : 'advertiser'};\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n\n    // -30 days\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 30 );\n\n    this.ranges.push( { id: 1, name : 'All networks', fromDate : this.fromDate, toDate: this.toDate, query : this.query } );\n\n    var network = { query : { network_name : 'gemini' } , description : 'Gemini'} ;\n    this.ranges.push( { id: 2, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n  }\n\n  loadGraph(value: any){\n        value = value - 1;\n        console.log('year=', this.ranges[value].year);\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.thechart.load( this.ranges[value].fromDate, this.ranges[value].toDate, this.ranges[value].query );\n  }\n\n  onChange(value: any) {\n    this.loadGraph(value);\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/ads-by-day/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EDWService } from '../../../shared/services/edw.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'dashboard-edw-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [EDWService, SettingsService]\n})\n\nexport class AIMSalesComponent implements OnInit {\n  data: Array<any>;\n\n  pagedData: Array<any> = [];\n  aggregate: boolean = false;\n\n  domainId: any = 1;\n  domainkey: any = '';\n  domain: any = '';\n  domains: any[] = [];\n  selectedDomains: any[] = [];\n\n  private searching: boolean = false;  \n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 50,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [50, 100, 200, 500, 1000];\n  \n  constructor(private edwService : EDWService, private settingsService: SettingsService, private mdlSnackbarService: MdlSnackbarService) {\n    \n  }\n\n  ngOnInit(): void {\n    this.fromDate.setDate(this.fromDate.getDate());\n    this.toDate.setDate(this.toDate.getDate() + 1);\n    this.initRange();\n    this.filterData();\n  }\n\n  public cleanFilter(pFilter){\n    if(pFilter === 'domain') {\n      this.selectedDomains = [];\n    }    \n  }\n\n  onChangeAggregate(){\n    //\n  }\n\n  public changeDates(value: any) {\n    //this.filterData();\n  }\n\n  public createFilterString(pSelectedArray, pOriginArray) {\n    var filterStr = \"\";\n    if (pSelectedArray.length === 0) {\n      return filterStr;\n    }\n    if (pSelectedArray.length === 1 && pSelectedArray[0] === 1) {\n      return filterStr;\n    }\n    else {\n      for(var objectCount = 0; objectCount < pOriginArray.length; objectCount++) {\n        var obj = pOriginArray[objectCount];\n        if(obj.id !== 1 && pSelectedArray.includes(obj.id)){\n          filterStr += obj.key;\n          filterStr += \",\";\n        }\n      }\n      if(filterStr.length !== 0){\n        var lastChar = filterStr[filterStr.length - 1];\n        if(lastChar === ','){\n          filterStr = filterStr.substr(0, filterStr.length-1);\n        }\n      }\n      return filterStr;\n    }  \n  }\n\n  private createDomainParam (pDomains) {\n      var domainsParam = \"\";\n      var domainsSplit = pDomains.split(\",\");\n      for ( var counter = 0; counter < domainsSplit.length; counter++ ) {\n          domainsParam += \"\\'\" + domainsSplit[counter] + \"\\',\";\n      }\n      if (domainsParam.length > 2) {\n          return domainsParam.substring(0, domainsParam.length - 1);\n      }\n      else {\n          return \"\";\n      }\n  }\n\n    private cleanDate (pDate) {\n        if(pDate.split(\"T\").length >= 2){\n            return pDate.split(\"T\")[0];\n        }\n        if(pDate.split(\"-\").length === 3){\n            return pDate;\n        }\n    }\n\n\n  public filterData() {\n    console.log(\"Selected Domains: \" + this.selectedDomains);\n    var domainStr = this.createFilterString(this.selectedDomains,  this.domains);\n    var domainsParam = this.createDomainParam(domainStr);\n    this.searching = true;\n    this.edwService.getAIMSales(domainsParam, this.fromDate, this.toDate).then(response => {\n      this.data = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (responseElement: any) => {\n          this.data.push({\n            date: responseElement.date.split(\"T\")[0],\n            billing_site: responseElement.billing_site,\n            source: responseElement.source,\n            campaign: responseElement.campaign,\n            content: responseElement.content,\n            term: responseElement.term,\n            billing_hits: responseElement.billing_hits,\n            smallform: responseElement.smallform, \n            bigform: responseElement.bigform,\n            submits: responseElement.submits,\n            billing: responseElement.billing,\n            sales: responseElement.sales\n          });\n        this.pagination.totalItems++;\n      });\n      \n      this.searching = false;\n      this.refreshTable();\n    });\n  }  \n\n  public detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  public refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  public splitDateFromResponse(pDate){\n    if(pDate !== undefined && pDate !== null){\n      return pDate.split(\"T\")[0];\n    }\n    else{\n      return pDate;\n    }\n  }\n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  };\n\n  private loadDomains(){\n    var countID = 14;\n    this.loadDefaultDomains();\n    this.domain = this.domains[0].name;\n    this.edwService.getDomains().then(response => {\n      response.sort(this.sortByProperty('name'));\n      response.forEach( (data: any) => {\n        if(data.name !== '' && data.name !== undefined){\n          countID += 1;\n          this.domains.push({id: countID, name: data.name, key: data.name});\n        }\n      });\n      this.domain = this.domains[0].name;\n    });\n  }\n\n  private loadDefaultDomains() {\n    this.domains.push( { id: 1, name : 'All Domains', key: '' } );\n    this.domains.push( { id: 2, name : 'license-guides.org', key: 'license-guides.org' } );\n    this.domains.push( { id: 3, name : 'drivingeducationinfo.org', key: 'drivingeducationinfo.org' } );\n    this.domains.push( { id: 4, name : 'newjerseycarregistration.com', key: 'newjerseycarregistration.com' } );\n    this.domains.push( { id: 5, name : 'thedriversinfo.com', key: 'thedriversinfo.com' } );\n    this.domains.push( { id: 6, name : 'thelicensedriver.com', key: 'thelicensedriver.com' } );\n    this.domains.push( { id: 7, name : 'yourdriverstips.com', key: 'yourdriverstips.com' } );\n    this.domains.push( { id: 8, name : 'driverslicensetoday.com', key: 'driverslicensetoday.com' } );\n    this.domains.push( { id: 9, name : 'texascarregistration.org', key: 'texascarregistration.org' } );\n    this.domains.push( { id: 10, name : 'virginiacarregistration.org', key: 'virginiacarregistration.org' } );\n    this.domains.push( { id: 11, name : 'pennsylvaniacarregistration.org', key: 'pennsylvaniacarregistration.org' } );\n    this.domains.push( { id: 12, name : 'californiacarreg.com', key: 'californiacarreg.com' } );\n    this.domains.push( { id: 13, name : 'floridacarregistration.com', key: 'floridacarregistration.com' } );\n    this.selectedDomains = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];\n  }\n\n  private initRange(){\n    //this.loadDefaultDomains();\n    this.loadDomains();\n  }\n\n  public downloadMain(){\n    var csv = 'Date,Billing Site,Source,Campaign,Content,Term,Billing Hits,Small Form,Big Form,Submits,Billing,Sales\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.date + ','\n            + row.billing_site + ','\n            + row.source + ','\n            + row.campaign + ','\n            + row.content + ','\n            + row.term + ','\n            + row.billing_hits + ','\n            + row.smallform + ','\n            + row.bigform + ','\n            + row.submits + ','\n            + row.billing + ','\n            + row.sales + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'aims-sales-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  public calculateDivision (pNumerator, pDenominator) {\n    if (pDenominator > 0) { \n      return ((pNumerator/pDenominator)*100).toFixed(2);\n    }\n    else {\n      return 0;\n    }\n  }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/aim-sales/dashboard.component.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\nimport {Router} from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\n\nimport {StatsService} from '../../../shared/services/stats.service';\nimport {TypeByDayComponent} from './../../../components/chartjs/type-by-day/by-day';\n\n@Component({\n  selector: 'dashboard-balance-by-day',\n  template: require('./dashboard.component.html'),\n  providers: [StatsService]\n})\n\nexport class BalanceByDayDashboardComponent implements OnInit {\n  @ViewChild(TypeByDayComponent) thechart:TypeByDayComponent;\n\n  ranges: any[] = [];\n  rangeId: any = 1;\n  form: FormGroup;\n\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private query: any = {};\n\n  constructor(private statsService: StatsService,\n              private router: Router) { }\n\n  private initRange(){\n\n    this.query = { };\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n\n    // -30 days\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 30 );\n\n    this.ranges.push( { id: 1, name : 'Ads and Networks', fromDate : this.fromDate, toDate: this.toDate, query : this.query } );\n\n    var network = { query : { network_type : 'advertiser' } , description : 'Advertisers'} ;\n    this.ranges.push( { id: 2, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    var network = { query : { network_type : 'network' } , description : 'Networks'} ;\n    this.ranges.push( { id: 3, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n  }\n\n  loadGraph(value: any){\n        value = value - 1;\n        console.log('year=', this.ranges[value].year);\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.thechart.load( this.ranges[value].fromDate, this.ranges[value].toDate, this.ranges[value].query );\n  }\n\n  onChange(value: any) {\n    this.loadGraph(value);\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/balance-by-day/dashboard.component.ts\n **/","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { StatsService } from '../../../shared/services/stats.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport { BillingStatementsService } from '../../../shared/services/billing_statements';\n\n@Component({\n  selector: 'billing-statements',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService, SettingsService, NetworksService, BillingStatementsService]\n})\n\nexport class BillingStatementsDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  datadetails: Array<any>;\n  \n  network: any = '';\n  networkkey: any = '';\n  networks: any[] = [];\n  networkId: any = 1;\n  networkErrors: any[] = [];\n  networkError: boolean = false;\n  _networkDelay: boolean = false;\n\n  get networkDelay(){\n    return !this.networkError && this._networkDelay;\n  };\n\n  set networkDelay(value){\n    this._networkDelay = value;\n  };\n\n  dayreport: boolean = false\n  showBadDebt: boolean = false\n  aggregate: boolean = false;\n  fulldetailreport = false;\n\n  subChannel: any = '';\n  subChannelkey: any = '';\n  subChannels: any[] = [];\n  subChannelId: any = 1;\n\n  billingStatementUser: any = '';\n  billingStatementUserKey: any = '';\n  billingStatementUsers: any[] = [];\n  billingStatementUserId: any = 1;\n\n  billingStatementCompany: any = '';\n  billingStatementCompanyKey: any = '';\n  billingStatementCompanies: any[] = [];\n  billingStatementCompanyId: any = 1;    \n  \n  offer: any = '';\n  offerkey: any = '';\n  offers: any[] = [];\n  offerId: any = 1;\n  \n  day: any = '';\n  days: any[] = [];\n  dayId: any = 1;\n\n  dates: any[] = [];\n  dateId: any = 1;\n\n  columns: any[] = [];\n  \n  private searching: boolean = false;\n  //private query: any = { network_name : 'tonic', sub_id_domain : 'Section 8', sub_id_tech : 'TEXT'};\n  private query: any = { };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private statsService: StatsService, \n    private settingsService: SettingsService,\n    private networksService: NetworksService,\n    private billingStatementsService: BillingStatementsService,\n    private router: Router) {\n  }\n\n  private changeDates(value: any) {\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  private isInfinite(num) {\n    return !isFinite(num);\n   }\n\n  private fixNumberFormat(pNumber, pDecimals){\n    if (isNaN(pNumber) || this.isInfinite(pNumber)){\n      return \"0\";\n    }\n    if (pNumber !== \"\" && pNumber !== null && pNumber !== undefined && (typeof Number(pNumber) === \"number\")) {\n      return pNumber.toFixed(pDecimals);\n    }\n    else {\n      return \"0\";\n    }\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.billingStatementsService.getData( this.fromDate, toDate, this.query, this.aggregate ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        response.forEach( (data: any) => {\n            if(data._id !== null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                var datestr = data._id.network_datetime.split(\"T\")[0];\n                this.data.push( { showdetails : false,\n                                  date: datestr,\n                                  network_name: data._id.network_name,\n                                  billing_company: data._id.billing_company,\n                                  user: data._id.user,\n                                  amount: this.fixNumberFormat(data.amount, 2)\n                                } );\n                this.pagination.totalItems++;\n            }\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n  }\n\n  private getNextDate(pInitialDate){\n    var result = new Date(pInitialDate);\n    result.setDate(result.getDate() + 1);\n    return result.toISOString().split('T')[0];\n  }  \n\n  loadDataDetails( data ){\n    this.searching = true;\n    var fromDate = this.aggregate ? this.fromDate : data.date;\n    var toDate = this.getNextDate(fromDate);\n    this.query.user = data.user;\n\n    this.billingStatementsService.getDataDetails(  fromDate, toDate, this.query ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id !== null) {\n              this.datadetails.push({\n                network_name: data._id.network_name,\n                billing_company: data._id.billing_company,\n                user: data._id.user,\n                description: data._id.description,\n                amount: this.fixNumberFormat(data.amount, 2)\n              });\n            }\n        });\n        this.searching = false;\n        data.details = this.datadetails;\n    });\n\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n}\n\n  loadSubChannels(){\n    this.subChannels.push( { id: 1, name : 'All sub channels', key : '' } );\n    this.subChannel = this.subChannels[0];\n    this.settingsService.getSubChannels().then(response => {\n      const subChannelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      subChannelsFromResponse.forEach( (subChannel: any) => {\n        if (subChannel.name !== \"All sub channels\") {\n          this.subChannels.push(subChannel);\n        }\n      })\n    });\n  }\n\n  loadBillingStatementUsers(){\n    var count = 1;\n    this.billingStatementUsers.push( { id: count, name : 'All Users', key : '' } );\n    this.billingStatementUser = this.billingStatementUsers[0];\n    this.settingsService.getBillingStatementUsers().then(response => {\n      const BILLING_STATEMENTS_USER_RES = this.sortArrayOfObjects(response, 'key');\n      BILLING_STATEMENTS_USER_RES.forEach( (billingStatementUser: any) => {\n        if (billingStatementUser.name !== \"All Users\") {\n          count += 1;\n          billingStatementUser.id = count;\n          this.billingStatementUsers.push(billingStatementUser);\n        }\n      })\n    });\n  }\n  \n  loadBillingStatementCompanies(){\n    var count = 1;\n    this.billingStatementCompanies.push( { id: count, name : 'All Companies', key : '' } );\n    this.billingStatementCompany = this.billingStatementCompanies[0];\n    this.settingsService.getBillingStatementCompanies().then(response => {\n      const BILLING_STATEMENTS_COMPANIES_RES = this.sortArrayOfObjects(response, 'key');\n      BILLING_STATEMENTS_COMPANIES_RES.forEach( (billingStatementCompany: any) => {\n        if (billingStatementCompany.name !== \"All Companies\") {\n          count += 1;\n          billingStatementCompany.id = count;\n          this.billingStatementCompanies.push(billingStatementCompany);\n        }\n      })\n    });\n  }   \n\n  loadOffers(){\n    this.offers.push( { id: 1, name : 'All offers', key : '' } );\n    this.offer = this.offers[0].name;\n\n    this.settingsService.getOffers( ).then(response => { \n        var index = 2;\n        for( var i = 2; i < 300; i++ ){\n          var offer = response.data[ ( \"000\" + i ).slice(-3) ];\n          if( offer != undefined ){\n            this.offers.push( { id: index, name : offer, key : offer  } );\n            index++;\n          }\n        }\n    });\n  }\n\n  splitAvenueDomainValue(pStr){\n    var indexOfSlash = pStr.indexOf('/');\n    if(indexOfSlash !== -1){\n      return pStr.slice(0, indexOfSlash);\n    }\n    else{\n      return \"\";\n    }\n  }\n\n  checkErrors(){\n    this.settingsService.getNetworkErrors().then(response => { \n      this.networkErrors = response.data;\n      this.networkError = (this.networkErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.networksWithdelay().then(response => { \n      this.networkDelay = (response.length > 0)\n    });\n  }\n\n  downloadDayxreport(){\n    var csv = 'Date, Domain, Channel, Network, Clicks, Gross Revenue, Net Revenue\\n';\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    var query = (this.day == '' )?{}: { sub_id_day : parseInt(this.day) }\n    this.statsService.getDayxreport(  fromDate, toDate, query ).then(response => { \n      response.forEach( (row: any) => {\n        var datestr = row._id.nw_dt_month + '/' + row._id.nw_dt_day + '/' + row._id.nw_dt_year;\n        csv += datestr + ',' + row._id.domain + ',' + row._id.channel + ',' + row._id.network + ',' + row.clicks + ',' + row.revenue + ',' + row.net_revenue + '\\n'\n      })\n      var blob = new Blob([csv], { type: 'text/csv' });\n      var url= window.URL.createObjectURL(blob);\n      var anchor = document.createElement(\"a\");\n      anchor.download = 'day-x-report.csv';\n      anchor.href = url;\n      anchor.click();  \n    });\n  }\n\n  private reportColumnsToString() {\n    var reportColumnsAsStr = \"\";\n    this.columns.forEach(function(column){\n      reportColumnsAsStr += column.toLowerCase().replace(\" \", \"_\");\n      reportColumnsAsStr += \",\";\n    });\n    // Remove last comma\n    if(reportColumnsAsStr.length >= 1) {\n      reportColumnsAsStr = reportColumnsAsStr.slice(0, -1);\n    }\n    // Change sub_id value to subid\n    reportColumnsAsStr = reportColumnsAsStr.replace(\"sub_id\", \"subid\");\n    return reportColumnsAsStr;\n  }\n\n  private getColumnValue(pRow, pColumnName){\n    pColumnName = pColumnName.toLowerCase();\n    return ( pRow[pColumnName] == undefined ? '': pRow[pColumnName] );\n  }\n\n  downloadMain(){\n    // var csv = 'date,day,network,domain,channel,sub_channel,offer,gross_revenue,net_revenue,clicks,rpc\\n';\n    var csv = \"Date,Network_Name,Billing_Company,User,Description,Amount\";\n    var headerArr = csv.split(\",\");\n    csv += \"\\n\";\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        var csvRow = \"\";\n        for(var currentColumn = 0; currentColumn < headerArr.length; currentColumn++) {\n          if (currentColumn+1 === headerArr.length) {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + '\\n';\n          }\n          else {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + ',';\n          }\n        }\n        csv += csvRow;\n    });\n\n\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  downloadDetails(){\n    this.searching = true;\n    var fromDate = this.fromDate;\n    var toDate = this.toDate;\n    this.billingStatementsService.getDataDetails(  fromDate, toDate, this.query ).then(response => { \n        var fulldatadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                   var datestr = data._id.network_datetime.split(\"T\")[0];\n                   fulldatadetails.push({  \n                                            date : datestr,\n                                            network_name: data._id.network_name,\n                                            billing_company: data._id.billing_company,\n                                            user: data._id.user,\n                                            description: data._id.description,\n                                            amount: this.fixNumberFormat(data.amount, 2)\n                                        });\n            }else{\n              console.log('empty');\n            }\n        });\n        var csv = \"Date,Network_Name,Billing_Company,User,Description,Amount\";\n        var headerArr = csv.split(\",\");\n        csv += \"\\n\";\n        csv = this.getReadyNormalReport(fulldatadetails, csv);\n\n        var blob = new Blob([csv], { type: 'text/csv' });\n        var url= window.URL.createObjectURL(blob);\n        var anchor = document.createElement(\"a\");\n        anchor.download = 'detail-report.csv';\n        anchor.href = url;\n        anchor.click();\n        \n        this.searching = false;\n    });\n\n  }\n  getReadyNormalReport(fulldatadetails, pCsv){\n    fulldatadetails.forEach( (row: any) =>{\n      pCsv += row.date + ',' + \n             (row.network_name == undefined ? '': row.network_name ) + ',' + \n             (row.billing_company == undefined ? '': row.billing_company ) + ',' + \n             (row.user == undefined ? '': row.user ) + ',' + \n             (row.description == undefined ? '': row.description ) + ',' + \n             (row.amount == undefined ? '': row.amount ) + '\\n'; \n    });\n    return pCsv;\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n\n  onChangeSubChannel(value: any) {\n    this.subChannel = this.subChannels.filter(x => x.id === value)[0];\n    this.subChannelkey = this.subChannel.key;\n\n    if(this.subChannel.key === '')\n      delete this.query.sub_id_sub_channel;\n    else{\n      this.query.sub_id_sub_channel = this.subChannel.key;\n    }\n    this.loadData();\n} \n\nonChangeBillingStatementUser(value: any) {\n  this.billingStatementUser = this.billingStatementUsers.filter(x => x.id === value)[0];\n  this.billingStatementUserKey = this.billingStatementUser.key;\n\n  if(this.billingStatementUser.key === '')\n    delete this.query.user;\n  else{\n    this.query.user = this.billingStatementUser.key;\n  }\n  this.loadData();\n}\n\nonChangeBillingStatementCompany(value: any) {\n  this.billingStatementCompany = this.billingStatementCompanies.filter(x => x.id === value)[0];\n  this.billingStatementCompanyKey = this.billingStatementCompany.key;\n\n  if(this.billingStatementCompany.key === '')\n    delete this.query.billing_company;\n  else{\n    this.query.billing_company = this.billingStatementCompany.key;\n  }\n  this.loadData();\n}\n      \n  private pressEnter = true;\n  private lastday = '';\n  onKeyup(event){\n        if( this.day != this.lastday )\n          this.pressEnter = false;\n        this.lastday = this.day;\n  }\n\n  onChangeAge(){\n        this.pressEnter = true;\n        this._onChangeAge();\n        this.loadData();\n  }\n\n  _onChangeAge(){\n    if( this.day != '' )\n      this.query.sub_id_day = parseInt(this.day);\n    else\n      delete this.query.sub_id_day;\n  }\n\n  onChangeAggregate(){\n    //this.aggregate = !this.aggregate;\n        this.loadData();\n  }\n\n  onChangeBadDebt(){\n    this.loadData();\n  }\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.loadData();\n  }\n\n  showDetails( data: any ) {\n    if( !data.showdetails ){ \n      // open details\n      this.loadDataDetails( data );\n    }\n    data.showdetails = !data.showdetails;\n  }\n\n  private initRange(){\n    this.loadSubChannels();\n    this.loadBillingStatementUsers();\n    this.loadBillingStatementCompanies();\n  }\n\n  public calculateGrossCtr(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // clicks / impressions\n      return this.fixNumberFormat((dataDocument.clicks / dataDocument.impressions)*100, 2) + \"%\";\n    }\n    else{\n      return dataDocument.ctr;\n    }\n  }\n\n  public calculateAdCtr(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // payable clicks / payable impressions\n      if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return dataDocument.ad_ctr;\n    }\n  }\n\n  public calculateRPC(dataDocument){\n    var displayNames = [\"Madrivo 3P\", \"Rev Track 3P\"];\n    var valueNames = [\"madrivo3p\", \"revtrack\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return \"\";\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // revenue / ad_clicks\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_clicks') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_clicks), 2);\n      }\n      else{\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n      }\n    }\n    else{\n      return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n    }\n  }\n\n  public calculateRPM(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions) * 1000\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions)*1000, 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n  \n  public calculateVPR(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions)\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions), 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n\n  public calculateConversion(dataDocument){\n    // var displayNames = [\"7ROI\", \"Ad Mediary\", \"Advatiz\", \"CJ\", \"CX3\", \"Diablo\", \"H2H\", \"Madrivo\", \"Orange Blue\", \"Revenue Ads\", \"W4\"];\n    // var valueNames = [\"roi7\", \"admediary\", \"advatiz\", \"cj\", \"cx3\", \"diablo\", \"h2h\", \"madrivo\", \"orangeblue\", \"revenueads\", \"w4\"];\n    var displayNames = [\"Tonic\", \"Inuvo\"];\n    var valueNames = [\"tonic\", \"inuvo\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return dataDocument.clicks;\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (ad_clicks / ad_impressions)\n      if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/billing-statements/dashboard.component.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\nimport {Router} from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\n\nimport {StatsService} from '../../../shared/services/stats.service';\nimport {ByDayComponent} from './../../../components/chartjs/by-day/by-day';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-by-day',\n  template: require('./dashboard.component.html'),\n  providers: [StatsService]\n})\n\nexport class ByDayDashboardComponent implements OnInit {\n  @ViewChild(ByDayComponent) thechart:ByDayComponent;\n\n  ranges: any[] = [];\n  rangeId: any = 1;\n  form: FormGroup;\n\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private query: any = {};\n\n  constructor(private statsService: StatsService,\n              private router: Router) { }\n\n  private initRange(){\n\n    this.query = { network_type : 'network'};\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n\n    // -30 days\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 30 );\n\n    this.ranges.push( { id: 1, name : 'All networks', query : { network_type : 'network' } } );\n    this.ranges.push( { id: 2, name : 'Ad Mediary', query : { network_name : 'admediary'} } );\n    this.ranges.push( { id: 3, name : 'Conduit', query : { network_name : 'conduit'} } );\n    this.ranges.push( { id: 4, name : 'CJ', query : { network_name : 'cj'} } );\n    this.ranges.push( { id: 5, name : 'Diablo', query : { network_name : 'diablo'} } );\n    this.ranges.push( { id: 6, name : 'H2H', query : { network_name : 'h2h'} } );\n    this.ranges.push( { id: 7, name : 'Media Alpha', query : { network_name : 'mediaalpha'} } );\n    this.ranges.push( { id: 8, name : 'Reliant', query : { network_name : 'reliant'} } );\n    this.ranges.push( { id: 9, name : 'Tonic', query : { network_name : 'tonic'} } );\n    this.ranges.push( { id: 10, name : 'Valid Click', query : { network_name : 'validclick'} } );\n    this.ranges.push( { id: 11, name : 'W4', query : { network_name : 'w4'} } );\n    this.ranges.push( { id: 12, name : '7ROI', query : { network_name : 'roi7'} } );\n\n  }\n\n  loadGraph(value: any){\n        value = value - 1;\n        this.thechart.load( this.fromDate, this.toDate, this.ranges[value].query );\n  }\n\n  onChange(value: any) {\n    this.loadGraph(value);\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n  }\n\n  downloadData(){\n    var csv = [];\n    var data : any[] = this.thechart.chartData;\n    var from = new Date(this.fromDate);\n    csv.push(',Date');\n    for( var i = 0; i < 30; i++){\n       csv.push( moment(from).format('MM/DD/YYYY') );\n       from.setDate( from.getDate() + 1);\n    }\n    //csv += '\\n';\n    data.forEach( (network: any) =>{\n        //console.log('net ' + network.label);\n        csv[0] = csv[0] + ',' + network.label;\n        for( var i = 1; i <= 30; i++){\n          csv[i] = csv[i] + ',' + network.data[i-1];\n        }\n        //csv += row.date + ',' + row.network + ',' + row.domain + ',' + row.media + ',' + row.revenue + ',' + row.clicks + ',' + row.rpc + '\\n';\n    });\n\n    for( var i = 0; i < 30; i++){\n       csv[i] = csv[i] + '\\n';//.push( moment(from).format('MM/DD/YYYY') );\n    }\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    window.open(url);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/by-day/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GatewayService } from '../../../shared/services/gateway.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { ChargebacksService } from '../../../shared/services/chargebacks.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-gateway-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [GatewayService, SettingsService,ChargebacksService]\n})\n\nexport class CBTrackerDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  gateways: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n  users: any[] = [];\n  userId: any = 1;\n  processors: any[] = [];\n  processorId: any = 1;\n  isos: any[] = [];\n  isoId: any = 1;\n  ccs: any[] = [];\n  ccId: any = 1;\n  \n  private searching: boolean = false;\n  private query: any = {};\n  private dataQuery: any = {};\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private aggregate: boolean = true;\n  \n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private gatewayService: GatewayService,\n              private settingsService: SettingsService,\n              private chargebacksService: ChargebacksService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadGateways();\n  }\n\n  onRangeChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.loadGateways();\n  }\n\n  onChangeCC(value: any) {\n        value = value - 1;\n        if(this.users[value].key === '')\n          delete this.dataQuery.cc\n        else\n          this.dataQuery.cc = this.ccs[value].key;\n        this.loadGateways();\n  }\n\n  onChangeUser(value: any) {\n        value = value - 1;\n        if(this.users[value].key === '')\n          delete this.query.user\n        else\n          this.query.user = this.users[value].key;\n        this.loadGateways();\n  }\n\n  onChangeProcessor(value: any) {\n        value = value - 1;\n        if(this.processors[value].key === '')\n          delete this.query.processor\n        else\n          this.query.processor = this.processors[value].key;\n        this.loadGateways();\n  }\n\n  onChangeIso(value: any) {\n        value = value - 1;\n        if(this.isos[value].key === '')\n          delete this.query.iso\n        else\n          this.query.iso = this.isos[value].key;\n        this.loadGateways();\n  }\n\n  _loadGateways(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.settingsService.getGateways( this.query ).then(response => { \n        \n        this.pagination.totalItems = 0;\n        this.gateways = response;\n        \n        this.loadData();\n    });\n\n  }\n\n  getUsageColor( value ){\n    if( value > 90 )\n       return 'red';    \n    if( value > 80 )\n       return 'rgb(255, 110, 64)';\n    if( value > 70 )\n       return 'yellow';\n    return '';\n  }\n\n  getProjectionColor( value ){\n    if( value < 25 )\n       return 'red';\n    if( value < 30 )\n       return 'rgb(255, 110, 64)';\n    if( value < 35 )\n       return 'yellow';    \n    return '';\n  }\n\n  loadGateways(){\n    this.searching = true;\n    this.data = [];\n    this.pagination.totalItems = 0;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.query.status = 1;  \n    this.chargebacksService.getChargebacksReport( this.fromDate, toDate, this.query, this.dataQuery, this.aggregate ).then(response => { \n      this.data = response\n      this.pagination.totalItems = response.length\n      console.log(response)\n      this.refreshTable();\n    });\n  }\n\n  mergeData( gatewaysdata, chargebacks ){\n          this.data = [];\n          var days = new Date().getDate();\n          gatewaysdata.forEach( ( gatewaydata: any ) => {\n              var gatewaysetting = this.findGateway( gatewaydata )\n              var chargeback = this.findChargeback( chargebacks, gatewaysetting, gatewaydata );\n              if( gatewaysetting.processor_id != undefined ){\n                var maxXmonth = gatewaysetting.mo_cap;\n                this.data.push( { \n                  user : gatewaysetting.user,\n                  processor_id : gatewaysetting.processor_id,\n                  operating : gatewaysetting.operating,\n                  processor : gatewaysetting.processor,\n                  iso : gatewaysetting.iso,\n                  mid : gatewaysetting.mid,\n                  product : gatewaysetting.product,\n                  domain : gatewaysetting.domain, \n                  cc : (this.dataQuery.cc != undefined)?this.dataQuery.cc:\"All cards\",\n                  sales : (gatewaydata.charges != undefined )?gatewaydata.charges.toFixed(2):0,\n                  chargebacks : (chargeback.cb_amount != undefined)?chargeback.cb_amount.toFixed(2):0,\n                  ratio : (chargeback.cb_amount > 0)?((chargeback.cb_amount*100)/gatewaydata.charges).toFixed(2):0,\n                  // transactions : processor.transactions,\n                  chargebackstx : (chargeback.cb_amount != undefined)?chargeback.cb_transactions:0\n                } );\n                this.pagination.totalItems++;\n              }\n          });\n          this.data = this.data.sort( function( a, b ){\n              return b.chargebackstx - a.chargebackstx;\n          })\n          this.refreshTable();\n\n  }\n\n  findGateway( gatewaydata ):any{\n    var result = { };\n    this.gateways.forEach(gateway => {\n      if( (gatewaydata._id.processor_id.toUpperCase() == gateway.processor_id.toUpperCase()) &&\n          (gatewaydata._id.user.toUpperCase() == gateway.processor.toUpperCase()) ){\n        result = gateway;\n      }\n    });\n    return result;\n  }\n\n  findChargeback( chargebacks, gatewaysetting, gatewaydata  ):any{\n    var result = { };\n    chargebacks.forEach(chargeback => {\n      //if( (gateway.mid == chargeback.merchant_id ) && ( processor._id.cc == chargeback.cb_credit_card_type ) ){\n      if(chargeback.iso == 'qualpay'){\n        if( (gatewaysetting.mid == chargeback.merchant_id ) ){\n          result = chargeback;\n        }  \n      }\n      if(chargeback.iso == 'vantiv'){\n        if( (gatewaysetting.domain == chargeback.merchant_id ) && ( gatewaysetting.iso.toUpperCase() == chargeback.iso.toUpperCase() ) ){\n          result = chargeback;\n        }  \n      }\n      if(chargeback.iso == 'splash'){\n        if( (gatewaysetting.domain == chargeback.merchant_id ) && ( gatewaysetting.iso.toUpperCase() == chargeback.iso.toUpperCase() ) ){\n          result = chargeback;\n        }  \n      }\n      if(chargeback.iso == 'humboldt'){\n        if( (gatewaysetting.domain == chargeback.merchant_id ) && ( gatewaysetting.iso.toUpperCase() == chargeback.iso.toUpperCase() ) ){\n          result = chargeback;\n        }  \n      }\n    });\n    return result;\n  }\n\n  loadData( ){\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.gatewayService.getTransactions( this.fromDate, toDate, this.dataQuery, this.aggregate ).then(response => { \n        this.pagination.totalItems = 0;\n        this.loadChargebacks( response );\n    });\n  }\n\n  loadChargebacks( processors ){\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.chargebacksService.getChargebacks( this.fromDate, toDate, this.dataQuery, this.aggregate ).then(response => { \n      this.mergeData( processors, response );\n    });\n  }\n\n  downloadData(){\n    var csv = 'Log User,Processor Id,Processing Co.,ISO,MID,Domain,Current Sales,Prior Sales,# Visa CB,# Masterdcard CB,Visa Ratio,Mastercard Ratio\\n';\n    this.data.forEach( (row: any) =>{\n      csv += row.user + ',' +  row.processor_id + ',' +  row.processor + ',' +  row.iso + ',\"' +  row.mid + '\",' +  row.domain + ',\"' +  row.csales + '\",\"' +  row.psales + '\",' +  row.vchargebackstx + ',' +  row.mchargebackstx + ',' +  row.vratio + ',' +  row.mratio + '\\n'\n    });\n\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n    this.searching = false;\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    this.loadGateways();\n  }\n\n  loadUsers(){\n    var id = 1;\n    this.users = [];\n    this.users.push( { id: id, name : 'All users', key : '' } );\n    this.settingsService.getGatewaySettings({ user: '$user' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.users.push( { id: id, name : row._id.user, key : row._id.user } );\n      })\n    });\n  }\n  \n  loadProcessors(){\n    var id = 1;\n    this.processors = [];\n    this.processors.push( { id: id, name : 'All processors', key : '' } );\n    this.settingsService.getGatewaySettings({ processor: '$processor' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.processors.push( { id: id, name : row._id.processor, key : row._id.processor } );\n      })\n    });\n  }\n\n  loadIsos(){\n    var id = 1;\n    this.isos = [];\n    this.isos.push( { id: id, name : 'All ISOs', key : '' } );\n    this.settingsService.getGatewaySettings({ iso: '$iso' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.isos.push( { id: id, name : row._id.iso, key : row._id.iso } );\n      })\n    });\n  }\n\n  private initRange(){\n\n    this.loadUsers();\n    this.loadProcessors();\n    this.loadIsos();\n    // first day of the month\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), 1 );\n    // last day of the month\n    this.toDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth() + 1, 0, 23, 59, 59, 999 );\n    \n    this.ranges.push( { id: 1, name : 'Current Month', fromDate : this.fromDate, toDate: this.toDate } );\n    var lastFrom = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth() - 1, this.fromDate.getDate() );\n    var lastTo = new Date( lastFrom.getFullYear(), lastFrom.getMonth() + 1, 0, 23, 59, 59, 999 );\n    this.ranges.push( { id: 2, name : 'Last Month', fromDate : lastFrom, toDate: lastTo } );\n\n    this.ccs.push( { id: 1, name : 'All Credit Cards', key: '' } );\n    this.ccs.push( { id: 2, name : 'Visa', key: 'visa' } );\n    this.ccs.push( { id: 3, name : 'Mastercard', key: 'mastercard' } );\n    this.ccs.push( { id: 4, name : 'Discover', key: 'discover' } );\n    this.ccs.push( { id: 5, name : 'Other...', key: 'other' } );\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/cb-tracker/dashboard.component.ts\n **/","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { StatsService } from '../../../shared/services/stats.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport { BillingStatementsService } from '../../../shared/services/billing_statements';\nimport { CreditCardsService } from '../../../shared/services/credits_cards';\n\n@Component({\n  selector: 'credit-cards',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService, SettingsService, NetworksService, BillingStatementsService, CreditCardsService]\n})\n\nexport class CreditCardsDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  datadetails: Array<any>;\n  \n  network: any = '';\n  networkkey: any = '';\n  networks: any[] = [];\n  networkId: any = 1;\n  networkErrors: any[] = [];\n  networkError: boolean = false;\n  _networkDelay: boolean = false;\n\n  get networkDelay(){\n    return !this.networkError && this._networkDelay;\n  };\n\n  set networkDelay(value){\n    this._networkDelay = value;\n  };\n\n  dayreport: boolean = false\n  showBadDebt: boolean = false\n  aggregate: boolean = false;\n  fulldetailreport = false;\n\n  subChannel: any = '';\n  subChannelkey: any = '';\n  subChannels: any[] = [];\n  subChannelId: any = 1;\n\n  billingStatementUser: any = '';\n  billingStatementUserKey: any = '';\n  billingStatementUsers: any[] = [];\n  billingStatementUserId: any = 1;\n\n  billingStatementCompany: any = '';\n  billingStatementCompanyKey: any = '';\n  billingStatementCompanies: any[] = [];\n  billingStatementCompanyId: any = 1;    \n  \n  offer: any = '';\n  offerkey: any = '';\n  offers: any[] = [];\n  offerId: any = 1;\n  \n  day: any = '';\n  days: any[] = [];\n  dayId: any = 1;\n\n  dates: any[] = [];\n  dateId: any = 1;\n\n  columns: any[] = [];\n  \n  private searching: boolean = false;\n  //private query: any = { network_name : 'tonic', sub_id_domain : 'Section 8', sub_id_tech : 'TEXT'};\n  private query: any = { };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private statsService: StatsService, \n    private settingsService: SettingsService,\n    private networksService: NetworksService,\n    private billingStatementsService: BillingStatementsService,\n    private creditCardsService: CreditCardsService,\n    private router: Router) {\n  }\n\n  private changeDates(value: any) {\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  private isInfinite(num) {\n    return !isFinite(num);\n   }\n\n  private fixNumberFormat(pNumber, pDecimals){\n    if (isNaN(pNumber) || this.isInfinite(pNumber)){\n      return \"0\";\n    }\n    if (pNumber !== \"\" && pNumber !== null && pNumber !== undefined && (typeof Number(pNumber) === \"number\")) {\n      return pNumber.toFixed(pDecimals);\n    }\n    else {\n      return \"0\";\n    }\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.creditCardsService.getData( this.fromDate, toDate, this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        response.forEach( (data: any) => {\n          //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n          var datestr = data.network_datetime.split(\"T\")[0];\n          this.data.push( { \n            showdetails : false,\n            date: datestr,\n            network_name: data.network_name,\n            user: data.user,\n            account_number: data.account_number,\n            netsuite_account_number: data.netsuite_account_number,\n            bank: data.bank,\n            account_name: data.account_name,\n            description: data.description,\n            card_member: data.card_member,\n            amount: this.fixNumberFormat(data.amount, 2)\n          } );\n          this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n  }\n\n  private getNextDate(pInitialDate){\n    var result = new Date(pInitialDate);\n    result.setDate(result.getDate() + 1);\n    return result.toISOString().split('T')[0];\n  }  \n\n  loadDataDetails( data ){\n    this.searching = true;\n    var fromDate = this.aggregate ? this.fromDate : data.date;\n    var toDate = this.getNextDate(fromDate);\n    this.query.user = data.user;\n\n    this.billingStatementsService.getDataDetails(  fromDate, toDate, this.query ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id !== null) {\n              this.datadetails.push({\n                network_name: data._id.network_name,\n                billing_company: data._id.billing_company,\n                user: data._id.user,\n                description: data._id.description,\n                amount: this.fixNumberFormat(data.amount, 2)\n              });\n            }\n        });\n        this.searching = false;\n        data.details = this.datadetails;\n    });\n\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n}\n\n  loadSubChannels(){\n    this.subChannels.push( { id: 1, name : 'All sub channels', key : '' } );\n    this.subChannel = this.subChannels[0];\n    this.settingsService.getSubChannels().then(response => {\n      const subChannelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      subChannelsFromResponse.forEach( (subChannel: any) => {\n        if (subChannel.name !== \"All sub channels\") {\n          this.subChannels.push(subChannel);\n        }\n      })\n    });\n  }\n\n  loadBillingStatementUsers(){\n    var count = 1;\n    this.billingStatementUsers.push( { id: count, name : 'All Users', key : '' } );\n    this.billingStatementUser = this.billingStatementUsers[0];\n    this.settingsService.getBillingStatementUsers().then(response => {\n      const BILLING_STATEMENTS_USER_RES = this.sortArrayOfObjects(response, 'key');\n      BILLING_STATEMENTS_USER_RES.forEach( (billingStatementUser: any) => {\n        if (billingStatementUser.name !== \"All Users\") {\n          count += 1;\n          billingStatementUser.id = count;\n          this.billingStatementUsers.push(billingStatementUser);\n        }\n      })\n    });\n  }\n  \n  loadBillingStatementCompanies(){\n    var count = 1;\n    this.billingStatementCompanies.push( { id: count, name : 'All Companies', key : '' } );\n    this.billingStatementCompany = this.billingStatementCompanies[0];\n    this.settingsService.getBillingStatementCompanies().then(response => {\n      const BILLING_STATEMENTS_COMPANIES_RES = this.sortArrayOfObjects(response, 'key');\n      BILLING_STATEMENTS_COMPANIES_RES.forEach( (billingStatementCompany: any) => {\n        if (billingStatementCompany.name !== \"All Companies\") {\n          count += 1;\n          billingStatementCompany.id = count;\n          this.billingStatementCompanies.push(billingStatementCompany);\n        }\n      })\n    });\n  }   \n\n  loadOffers(){\n    this.offers.push( { id: 1, name : 'All offers', key : '' } );\n    this.offer = this.offers[0].name;\n\n    this.settingsService.getOffers( ).then(response => { \n        var index = 2;\n        for( var i = 2; i < 300; i++ ){\n          var offer = response.data[ ( \"000\" + i ).slice(-3) ];\n          if( offer != undefined ){\n            this.offers.push( { id: index, name : offer, key : offer  } );\n            index++;\n          }\n        }\n    });\n  }\n\n  splitAvenueDomainValue(pStr){\n    var indexOfSlash = pStr.indexOf('/');\n    if(indexOfSlash !== -1){\n      return pStr.slice(0, indexOfSlash);\n    }\n    else{\n      return \"\";\n    }\n  }\n\n  checkErrors(){\n    this.settingsService.getNetworkErrors().then(response => { \n      this.networkErrors = response.data;\n      this.networkError = (this.networkErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.networksWithdelay().then(response => { \n      this.networkDelay = (response.length > 0)\n    });\n  }\n\n  downloadDayxreport(){\n    var csv = 'Date, Domain, Channel, Network, Clicks, Gross Revenue, Net Revenue\\n';\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    var query = (this.day == '' )?{}: { sub_id_day : parseInt(this.day) }\n    this.statsService.getDayxreport(  fromDate, toDate, query ).then(response => { \n      response.forEach( (row: any) => {\n        var datestr = row._id.nw_dt_month + '/' + row._id.nw_dt_day + '/' + row._id.nw_dt_year;\n        csv += datestr + ',' + row._id.domain + ',' + row._id.channel + ',' + row._id.network + ',' + row.clicks + ',' + row.revenue + ',' + row.net_revenue + '\\n'\n      })\n      var blob = new Blob([csv], { type: 'text/csv' });\n      var url= window.URL.createObjectURL(blob);\n      var anchor = document.createElement(\"a\");\n      anchor.download = 'day-x-report.csv';\n      anchor.href = url;\n      anchor.click();  \n    });\n  }\n\n  private reportColumnsToString() {\n    var reportColumnsAsStr = \"\";\n    this.columns.forEach(function(column){\n      reportColumnsAsStr += column.toLowerCase().replace(\" \", \"_\");\n      reportColumnsAsStr += \",\";\n    });\n    // Remove last comma\n    if(reportColumnsAsStr.length >= 1) {\n      reportColumnsAsStr = reportColumnsAsStr.slice(0, -1);\n    }\n    // Change sub_id value to subid\n    reportColumnsAsStr = reportColumnsAsStr.replace(\"sub_id\", \"subid\");\n    return reportColumnsAsStr;\n  }\n\n  private getColumnValue(pRow, pColumnName){\n    pColumnName = pColumnName.toLowerCase();\n    return ( pRow[pColumnName] == undefined ? '': pRow[pColumnName] );\n  }\n\n  downloadMain(){\n    // var csv = 'date,network_name,user,bank,account_name,description,card_member,amount\\n';\n    var csv = \"Date,Network_Name,User,Bank,Account_Name,account_number,netsuite_account_number,Description,Card_Member,Amount\";\n    var headerArr = csv.split(\",\");\n    csv += \"\\n\";\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        var csvRow = \"\";\n        for(var currentColumn = 0; currentColumn < headerArr.length; currentColumn++) {\n          if (currentColumn+1 === headerArr.length) {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + '\\n';\n          }\n          else {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + ',';\n          }\n        }\n        csv += csvRow;\n    });\n\n\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  getReadyNormalReport(fulldatadetails, pCsv){\n    fulldatadetails.forEach( (row: any) =>{\n      pCsv += row.date + ',' + \n             (row.network_name == undefined ? '': row.network_name ) + ',' + \n             (row.billing_company == undefined ? '': row.billing_company ) + ',' + \n             (row.user == undefined ? '': row.user ) + ',' + \n             (row.description == undefined ? '': row.description ) + ',' + \n             (row.amount == undefined ? '': row.amount ) + '\\n'; \n    });\n    return pCsv;\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n\n  onChangeSubChannel(value: any) {\n    this.subChannel = this.subChannels.filter(x => x.id === value)[0];\n    this.subChannelkey = this.subChannel.key;\n\n    if(this.subChannel.key === '')\n      delete this.query.sub_id_sub_channel;\n    else{\n      this.query.sub_id_sub_channel = this.subChannel.key;\n    }\n    this.loadData();\n} \n\nonChangeBillingStatementUser(value: any) {\n  this.billingStatementUser = this.billingStatementUsers.filter(x => x.id === value)[0];\n  this.billingStatementUserKey = this.billingStatementUser.key;\n\n  if(this.billingStatementUser.key === '')\n    delete this.query.user;\n  else{\n    this.query.user = this.billingStatementUser.key;\n  }\n  this.loadData();\n}\n\nonChangeBillingStatementCompany(value: any) {\n  this.billingStatementCompany = this.billingStatementCompanies.filter(x => x.id === value)[0];\n  this.billingStatementCompanyKey = this.billingStatementCompany.key;\n\n  if(this.billingStatementCompany.key === '')\n    delete this.query.billing_company;\n  else{\n    this.query.billing_company = this.billingStatementCompany.key;\n  }\n  this.loadData();\n}\n      \n  private pressEnter = true;\n  private lastday = '';\n  onKeyup(event){\n        if( this.day != this.lastday )\n          this.pressEnter = false;\n        this.lastday = this.day;\n  }\n\n  onChangeAge(){\n        this.pressEnter = true;\n        this._onChangeAge();\n        this.loadData();\n  }\n\n  _onChangeAge(){\n    if( this.day != '' )\n      this.query.sub_id_day = parseInt(this.day);\n    else\n      delete this.query.sub_id_day;\n  }\n\n  onChangeAggregate(){\n    //this.aggregate = !this.aggregate;\n        this.loadData();\n  }\n\n  onChangeBadDebt(){\n    this.loadData();\n  }\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.loadData();\n  }\n\n  showDetails( data: any ) {\n    if( !data.showdetails ){ \n      // open details\n      this.loadDataDetails( data );\n    }\n    data.showdetails = !data.showdetails;\n  }\n\n  private initRange(){\n    this.loadSubChannels();\n    this.loadBillingStatementUsers();\n    this.loadBillingStatementCompanies();\n  }\n\n  public calculateGrossCtr(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // clicks / impressions\n      return this.fixNumberFormat((dataDocument.clicks / dataDocument.impressions)*100, 2) + \"%\";\n    }\n    else{\n      return dataDocument.ctr;\n    }\n  }\n\n  public calculateAdCtr(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // payable clicks / payable impressions\n      if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return dataDocument.ad_ctr;\n    }\n  }\n\n  public calculateRPC(dataDocument){\n    var displayNames = [\"Madrivo 3P\", \"Rev Track 3P\"];\n    var valueNames = [\"madrivo3p\", \"revtrack\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return \"\";\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // revenue / ad_clicks\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_clicks') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_clicks), 2);\n      }\n      else{\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n      }\n    }\n    else{\n      return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n    }\n  }\n\n  public calculateRPM(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions) * 1000\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions)*1000, 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n  \n  public calculateVPR(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions)\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions), 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n\n  public calculateConversion(dataDocument){\n    // var displayNames = [\"7ROI\", \"Ad Mediary\", \"Advatiz\", \"CJ\", \"CX3\", \"Diablo\", \"H2H\", \"Madrivo\", \"Orange Blue\", \"Revenue Ads\", \"W4\"];\n    // var valueNames = [\"roi7\", \"admediary\", \"advatiz\", \"cj\", \"cx3\", \"diablo\", \"h2h\", \"madrivo\", \"orangeblue\", \"revenueads\", \"w4\"];\n    var displayNames = [\"Tonic\", \"Inuvo\"];\n    var valueNames = [\"tonic\", \"inuvo\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return dataDocument.clicks;\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (ad_clicks / ad_impressions)\n      if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/credit-cards/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport {Router} from '@angular/router';\nimport {StatsService} from '../../../shared/services/stats.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-by-subid',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService]\n})\n\nexport class DataByNetworkDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 9;\n  subid : String = '';\n  \n  private searching: boolean = false;\n  private query: any = { network_name : 'tonic' };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private statsService: StatsService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.statsService.getDataByNetwork( this.fromDate, toDate, this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n            this.data.push( { network_datetime: datestr, network_name : data._id.network_name, user: data._id.user, subid: data._id.sub_id, revenue : data.revenue.toFixed(2), clicks : data.clicks } );\n            this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  downloadData(){\n    var csv = '';\n    this.data.forEach( (row: any) =>{\n        csv += row.network_datetime + ',' + row.network_name + ',' + row.user + ',' + row.subid + ',' + row.revenue + ',' + row.clicks + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    window.open(url);\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        this.query = this.ranges[value].query;\n        this._updateSubid();\n        this.loadData();\n  }\n\n  updateSubid(){\n        this._updateSubid();\n        this.loadData();\n  }\n\n  _updateSubid(){\n    if( this.subid != '' )\n      this.query.sub_id = this.subid;\n    else\n      delete this.query.sub_id;\n  }\n\n  private initRange(){\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    \n    this.ranges.push( { id: 1, name : 'All networks', query : { } } );\n    this.ranges.push( { id: 2, name : 'Ad Mediary', query : { network_name : 'admediary'} } );\n    this.ranges.push( { id: 3, name : 'Conduit', query : { network_name : 'conduit'} } );\n    this.ranges.push( { id: 4, name : 'CJ', query : { network_name : 'cj'} } );\n    this.ranges.push( { id: 5, name : 'Diablo', query : { network_name : 'diablo'} } );\n    this.ranges.push( { id: 6, name : 'H2H', query : { network_name : 'h2h'} } );\n    this.ranges.push( { id: 7, name : 'Media Alpha', query : { network_name : 'mediaalpha'} } );\n    this.ranges.push( { id: 8, name : 'Reliant', query : { network_name : 'reliant'} } );\n    this.ranges.push( { id: 9, name : 'Tonic', query : { network_name : 'tonic'} } );\n    this.ranges.push( { id: 10, name : 'Valid Click', query : { network_name : 'validclick'} } );\n    this.ranges.push( { id: 11, name : 'W4', query : { network_name : 'w4'} } );\n    this.ranges.push( { id: 12, name : '7ROI', query : { network_name : 'roi7'} } );\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/data-by-network/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EDWService } from '../../../shared/services/edw.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'dashboard-edw-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [EDWService, SettingsService]\n})\n\nexport class BillingPerformanceDashboardComponent implements OnInit {\n  data: Array<any>;\n  datadetails: Array<any>;\n  dataDetailsCampaign: Array<any>;\n  dataDetailsContent: Array<any>;\n  dataDetailsTerm: Array<any>;\n  pagedData: Array<any> = [];\n  aggregate: boolean = false;\n\n  sourceId: any = 1;\n  sourcekey: any = '';\n  source: any = '';\n  sources: any[] = [];\n  selectedSources: any[] = [1];\n\n  domainId: any = 1;\n  domainkey: any = '';\n  domain: any = '';\n  domains: any[] = [];\n  selectedDomains: any[] = [1];\n\n  verticalId: any = 1;\n  verticalkey: any = '';\n  vertical: any = '';\n  verticals: any[] = [];  \n\n  billingSiteId: any = 1;\n  billingSitekey: any = '';\n  billingSite: any = '';\n  billingSites: any[] = [];\n\n  campaignId: any = 1;\n  campaignkey: any = '';\n  campaign: any = '';\n  campaigns: any[] = [];\n\n  tradeMarkerId: any = 1;\n  trademarkerkey: any = '';\n  tradeMarker: any = '';\n  tradeMarkers: any[] = [];\n\n  filtersLevel1: any[] = [];\n  filterLevel1Id: any = 1;\n  filterLevel1: any = '';\n\n  filtersLevel2: any[] = [];\n  filterLevel2Id: any = 1;\n  filterLevel2: any = '';\n  isInvalidLevel2: any = true;\n  \n  filtersLevel3: any[] = [];\n  filterLevel3Id: any = 1;\n  filterLevel3: any = '';\n  isInvalidLevel3: any = true;\n\n  groupingId: any = 1;\n  groupingkey: any = '';\n  grouping: any = '';\n  groupings: any[] = [];\n\n  isInitialLoad: any = true;\n\n  showBillingSiteColumn: any = true;\n  showDateColumn: any = false;\n  showSourceColumn: any = false;\n  \n\n  private searching: boolean = false;\n  private displayDateField: boolean = false;\n  private displayDetailColumns: boolean = false;\n  private openedDetailDocuments: number = 0;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private startDate: any = new Date(1990, 0, 1);\n  private dateHasChanged: boolean = false;\n  private query: any = '';\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 50,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [50, 100, 200, 500, 1000];\n  \n  constructor(private edwService : EDWService, private settingsService: SettingsService, private mdlSnackbarService: MdlSnackbarService) {\n    \n  }\n\n  ngOnInit(): void {\n    this.fromDate.setDate(this.fromDate.getDate());\n    this.toDate.setDate(this.toDate.getDate() + 1);\n    this.initRange();\n    this.filterData();\n    this.isInitialLoad = false;\n  }\n\n  private populateFiltersLevel1() {\n    this.filtersLevel1.push( { id: 1, name: \"Select a value\", value: \"\" } );\n    this.filtersLevel1.push( { id: 2, name: \"Date\", value: \"date\" } );\n    this.filtersLevel1.push( { id: 3, name: \"Billing Site\", value: \"billingsite\" } );\n    this.filtersLevel1.push( { id: 4, name: \"Source\", value: \"source\" } );\n  }\n\n  private initFiltersLevel2() {\n    this.filtersLevel2 = [];\n    this.filtersLevel2.push( { id: 1, name: \"Select a value\", value: \"\" } );\n    this.filterLevel2Id = 1;\n  }\n\n  private initFiltersLevel3() {\n    this.filtersLevel3 = [];\n    this.filtersLevel3.push( { id: 1, name: \"Select a value\", value: \"\" } );\n    this.filterLevel3Id = 1;\n  }  \n\n  public onChangeSource(sourceID){\n    this.source = this.sources.filter(x => x.id === sourceID);\n    this.filterData();\n  }  \n\n  public onChangeDomain(domainID) {\n    this.domain = this.domains.filter(x => x.id === domainID);\n    this.filterData();\n  }\n\n  public onChangeVertical(verticalID){\n    this.vertical = this.verticals.filter(x => x.id === verticalID);\n    this.filterData();\n  }    \n\n  public onChangeTradeMarker(tradeMarkerId) {\n    this.tradeMarker = this.tradeMarkers.filter(x => x.id === tradeMarkerId);\n    //this.loadData();\n    this.mdlSnackbarService.showToast('Filter in progress');\n  }\n\n  private setShowColumns (pValue) {\n    if(pValue === \"billing_site\"){\n      this.showBillingSiteColumn = true;\n      this.showDateColumn = false;\n      this.showSourceColumn = false;\n    }\n    if(pValue === \"date\"){\n      this.showDateColumn = true;\n      this.showBillingSiteColumn = false;\n      this.showSourceColumn = false;\n    }\n    if(pValue === \"source\"){\n      this.showSourceColumn = true;\n      this.showDateColumn = false;\n      this.showBillingSiteColumn = false;\n    }    \n  }\n\n  public onChangeGrouping(groupingID){\n    this.grouping = this.groupings.filter(x => x.id === groupingID)[0];\n    this.setShowColumns(this.grouping.value);\n    this.filterData();\n  }    \n\n  public onChangeCampaign(campaignID){\n    alert(\"Filter in progress\");\n  }\n\n  onChangeAggregate(){\n    this.filterData();\n  }  \n\n  public changeDates(value: any) {\n    this.dateHasChanged = true;\n    this.filterData();\n  }\n\n  public changeDisplayDateCheckbox(value: any) {\n    this.displayDateField = value;\n    this.filterData();\n  }\n\n  public detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  public refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  public splitDateFromResponse(pDate){\n    if(pDate !== undefined && pDate !== null){\n      return pDate.split(\"T\")[0];\n    }\n    else{\n      return pDate;\n    }\n  }\n\n  public showDrillDown1(data) {\n    if( !data.showdetails ){\n      this.loadDrillDown1(data);\n      data.showdetails = !data.showdetails;\n      this.openedDetailDocuments += 1;\n    }\n    else{\n      data.showdetails = !data.showdetails;\n      this.openedDetailDocuments -= 1;\n    }\n    this.displayDetailColumns = this.openedDetailDocuments > 0;\n  }\n\n  private getNextDate(pInitialDate){\n    var result = new Date(pInitialDate);\n    result.setDate(result.getDate() + 1);\n    return result.toISOString().split('T')[0];\n  }\n\n  private getFilterValueBasedOnGrouping (pBaseGroup, pData) {\n    if (pBaseGroup === \"billing_site\") {\n      return pData.billing_site;\n    }\n    if (pBaseGroup === \"date\") {\n      return pData.date;\n    }\n    if (pBaseGroup === \"source\") {\n      var sourceObject = this.sources.filter(x => x.name === pData.source);\n      if (sourceObject[0] !== undefined && sourceObject[0] !== null) {\n        return sourceObject[0].key;\n      }\n      else {\n        return '';\n      }\n    }        \n  }\n\n  private loadDrillDown1(pData) {\n    this.searching = true;\n    var baseGroup = this.grouping.value;\n    var baseGroupFilter = this.getFilterValueBasedOnGrouping(baseGroup, pData);\n    var sourceStr = this.createFilterString(this.selectedSources,  this.sources);\n    var domainStr = this.createFilterString(this.selectedDomains,  this.domains);\n    var verticalNameFilter = this.getVerticalName(this.vertical[0].name);\n    this.edwService.getBillingPerformanceDetail(this.fromDate, this.toDate, baseGroup, baseGroupFilter, sourceStr, domainStr, verticalNameFilter).then(response => {\n      this.datadetails = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (data: any) => {\n        this.datadetails.push( { \n                          date: \"hey\",\n                          showdetails : false,\n                          source: data.Source,\n                          billing_site: data.BillingSite,\n                          billing_impressions: data[\"Billing impressions\"],\n                          billing_site_visits: data.BillingSiteVisits,\n                          billingSiteVisitsTrend: data.BillingSiteVisitsTrend,\n                          form_1_impressions: data.Form1Impressions,\n                          form_2_impressions: data.Form2Impressions,\n                          sales: data.Sales,\n                          salesTrend: data.SalesTrend,\n                          confirmation: data.confirmation,\n                          notices: data.notices,\n                          submits: data.submits\n                        }\n                      );\n          this.pagination.totalItems++;\n      });\n      this.searching = false;\n      pData.details = this.datadetails;\n    });    \n    \n  }    \n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  };\n\n  private loadDomains(){\n    this.domains.push( { id: 1, name : 'All Domains', key: '' } );\n    this.domain = this.domains[0].name;\n    this.edwService.getDomains().then(response => {\n      response.sort(this.sortByProperty('name'));\n      response.forEach( (data: any) => {\n        if(data.name !== '' && data.name !== undefined){\n          this.domains.push({id: data.id+1, name: data.name, key: data.name});\n        }\n      });\n      this.domain = this.domains[0].name;\n    });\n  }\n\n  private loadSources(){\n    this.sources.push( { id: 1, name : 'All Sources', key: '' } );\n    this.source = this.sources[0].name;\n    this.edwService.getSources().then(response => {\n      response.sort(this.sortByProperty('value'));\n      response.forEach( (data: any) => {\n        if(data.value !== '' && data.value !== undefined){\n          this.sources.push({id: data.id+1, name: data.alias, key: data.value});\n        }\n      });\n      this.source = this.sources[0].name;\n    });\n  }\n\n  private loadVerticals(){\n    var countID = 1;\n    this.verticals.push( { id: countID, name : 'All Verticals', key: '' } );\n    this.vertical = this.verticals[0].name;\n    this.edwService.getVerticals().then(response => {\n      response.sort(this.sortByProperty('vertical'));\n      response.forEach( (data: any) => {\n        countID += 1;\n        this.verticals.push({id: countID, name: data.vertical, key: data.vertical});\n      });\n      this.vertical = this.verticals[0].name;\n    });\n  }  \n\n  private loadTradeMarkers(){\n    this.tradeMarkers.push( { id: 1, name : 'Same day last week', key: 'week' } );\n    this.tradeMarkers.push( { id: 2, name : 'Yesterday', key: 'yesterday' } );\n    this.tradeMarker = this.tradeMarkers[0].name;\n  }\n\n  private loadGroupings() {\n    this.groupings.push( { id: 1, name: \"Billing Site\", value: \"billing_site\" } );\n    this.groupings.push( { id: 2, name: \"Date\", value: \"date\" } );\n    this.groupings.push( { id: 3, name: \"Source\", value: \"source\" } );\n    this.grouping = this.groupings[0];\n  }  \n\n  private initRange(){\n    this.loadDomains();\n    this.loadSources();\n    this.loadVerticals();\n    this.loadTradeMarkers();\n    this.loadGroupings();\n    // this.populateFiltersLevel1();\n    // this.initFiltersLevel2();\n    // this.initFiltersLevel3();\n  }\n\n  public downloadMain(){\n    var csv = 'Source,Domain,Hit Portal Site,Hit Billing Site,Form 1 Impressions,Form 2 Impressions,Submits,Billing Impressions,Sales,Confirmations\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.source + ',' + row.domain + ',' + row.portal_visits + ',' + row.billing_site_visits + ',' + row.form_1_impressions + ','  + row.form_2_impressions + ',' \n            + row.submits + ',' + row.billing_impressions + ',' + row.sales + ',' + row.confirmation + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'traffic-conversions-main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  public downloadDetail(){\n    alert(\"Work in progress\");\n  }\n\n  private isValidFilterCriteria() {\n    /*\n    if(!this.isInitialLoad) {\n      if(this.filterLevel1Id === 1) {\n        this.mdlSnackbarService.showToast('Please enter a value for parameter -Level 1-.  The parameter cannot be blank.');\n        return false;\n      }\n      if(this.filterLevel2Id === 1) {\n        this.mdlSnackbarService.showToast('Please enter a value for parameter -Level 2-.  The parameter cannot be blank.');\n        return false;\n      }\n      if(this.filterLevel3Id === 1) {\n        this.mdlSnackbarService.showToast('Please enter a value for parameter -Level 3-.  The parameter cannot be blank.');\n        return false;\n      }\n      else {\n        return true;\n      }\n    }\n    */\n  }\n\n  public filterData() {\n    this.searching = true;\n    var baseGroup = this.grouping.value;\n    var sourceStr = this.createFilterString(this.selectedSources,  this.sources);\n    var domainStr = this.createFilterString(this.selectedDomains,  this.domains);\n    var verticalNameFilter = this.getVerticalName(this.vertical[0].name);\n    this.edwService.getBillingPerformance(this.fromDate, this.toDate, baseGroup, sourceStr, domainStr, verticalNameFilter).then(response => {\n      this.data = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (data: any) => {\n        this.data.push( { \n                          date: this.showDateColumn ? data.Date.split(\"T\")[0] : data.Date,\n                          showdetails : false,\n                          source: data.Source,\n                          billing_site: data.BillingSite,\n                          billing_impressions: data[\"Billing impressions\"],\n                          billing_site_visits: data.BillingSiteVisits,\n                          billingSiteVisitsTrend: data.BillingSiteVisitsTrend,\n                          form_1_impressions: data.Form1Impressions,\n                          form_2_impressions: data.Form2Impressions,\n                          sales: data.Sales,\n                          salesTrend: data.SalesTrend,\n                          confirmation: data.confirmation,\n                          notices: data.notices,\n                          submits: data.submits\n                        } );\n          this.pagination.totalItems++;\n      });\n      this.searching = false;\n      this.refreshTable();\n    });\n  }\n  \n  public cleanFilter(pFilter){\n    if(pFilter === 'source') {\n      this.selectedSources = [];\n    }\n    if(pFilter === 'domain') {\n      this.selectedDomains = [];\n    }    \n  }\n\n  private createFilterString(pSelectedArray, pOriginArray){\n    var filterStr = \"\";\n    if (pSelectedArray.length === 0) {\n      return filterStr;\n    }\n    if (pSelectedArray.length === 1 && pSelectedArray[0] === 1) {\n      return filterStr;\n    }\n    else {\n      for(var objectCount = 0; objectCount < pOriginArray.length; objectCount++) {\n        var obj = pOriginArray[objectCount];\n        if(obj.id !== 1 && pSelectedArray.includes(obj.id)){\n          filterStr += obj.key;\n          filterStr += \",\";\n        }\n      }\n      if(filterStr.length !== 0){\n        var lastChar = filterStr[filterStr.length - 1];\n        if(lastChar === ','){\n          filterStr = filterStr.substr(0, filterStr.length-1);\n        }\n      }\n      return filterStr;\n    }  \n  }\n\n  private getVerticalName(pVerticalName){\n    if(pVerticalName === \"All Verticals\"){\n      return null;\n    }\n    else{\n      return pVerticalName\n    }\n  }\n\n  public onChangeFilterLevel1(filterLevel1ID) {\n    this.filterLevel1 = this.filtersLevel1.filter(x => x.id === filterLevel1ID);\n    // Reset dropdown filter level 2\n    this.initFiltersLevel2();\n    // Reset dropdown filter level 3\n    this.initFiltersLevel3();\n    if(filterLevel1ID !== 1) {\n      // Populate filter 2 dropdown\n      for(var filter1Count = 0; filter1Count < this.filtersLevel1.length; filter1Count++){\n        var currentFilter1Element = this.filtersLevel1[filter1Count];\n        if(currentFilter1Element.id !== filterLevel1ID && currentFilter1Element.id !== 1){\n          this.filtersLevel2.push(currentFilter1Element);\n        }\n      }\n    }\n    // enable/disable dropdown level 2\n    if(filterLevel1ID !== 1) {\n      this.isInvalidLevel2 = false;\n    }\n    else {\n      this.isInvalidLevel2 = true;\n    }\n    // disable dropdown level 3\n    this.isInvalidLevel3 = true;\n  }\n\n  public onChangeFilterLevel2(filterLevel2ID) {\n    // Reset dropdown filter level 3\n    this.initFiltersLevel3();\n    if(filterLevel2ID !== 1) {\n      this.isInvalidLevel3 = false;\n      // Populate filter 3 dropdown\n      for(var filter1Count = 0; filter1Count < this.filtersLevel1.length; filter1Count++){\n        var currentFilter1Element = this.filtersLevel1[filter1Count];\n        if(currentFilter1Element.id !== this.filterLevel1Id && currentFilter1Element.id !== this.filterLevel2Id && currentFilter1Element.id !== 1){\n          this.filtersLevel3.push(currentFilter1Element);\n        }\n      }      \n    }\n    else {\n      this.isInvalidLevel3 = true;\n    }\n  }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/edw-billing-performance/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EDWService } from '../../../shared/services/edw.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'dashboard-edw-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [EDWService, SettingsService]\n})\n\nexport class TrafficConversionsDashboardComponent implements OnInit {\n  data: Array<any>;\n  groupedByData: Array<any>;\n  datadetails: Array<any>;\n  dataDetailsCampaign: Array<any>;\n  dataDetailsContent: Array<any>;\n  dataDetailsTerm: Array<any>;\n  pagedData: Array<any> = [];\n  aggregate: boolean = false;\n  disableAggregate: boolean = false;\n  disableGroupBy: boolean = false;\n\n  sourceId: any = 1;\n  sourcekey: any = '';\n  source: any = '';\n  sources: any[] = [];\n  selectedSources: any[] = [1];\n\n  fromHourId: any = 1;\n  fromHourkey: any = '';\n  fromHour: any = '';\n  fromHours: any[] = [];\n\n  toHourId: any = 1;\n  toHourkey: any = '';\n  toHour: any = '';\n  toHours: any[] = [];\n\n  hoursArray: any[] = [];\n\n  domainId: any = 1;\n  domainkey: any = '';\n  domain: any = '';\n  domains: any[] = [];\n  selectedDomains: any[] = [1];\n\n  verticalId: any = 1;\n  verticalkey: any = '';\n  vertical: any = '';\n  verticals: any[] = [];\n  selectedVerticals: any[] = [1];\n\n  billingSiteId: any = 1;\n  billingSitekey: any = '';\n  billingSite: any = '';\n  billingSites: any[] = [];\n\n  campaignId: any = 1;\n  campaignkey: any = '';\n  campaign: any = '';\n  campaigns: any[] = [];\n\n  tradeMarkerId: any = 1;\n  trademarkerkey: any = '';\n  tradeMarker: any = '';\n  tradeMarkers: any[] = [];\n\n  groupingId: any = 1;\n  groupingkey: any = '';\n  grouping: any = '';\n  groupings: any[] = [];\n  \n  showVerticalColumn: any = true;\n  showDomainColumn: any = true;\n  showSourceColumn: any = true;\n  showDateColumn: any = false;\n\n  private searching: boolean = false;\n  private displayDateField: boolean = false;\n  private displayDetailColumns: boolean = false;\n  private openedDetailDocuments: number = 0;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private startDate: any = new Date(1990, 0, 1);\n  private dateHasChanged: boolean = false;\n  private query: any = '';\n\n  public NO_GROUPING = \"No Grouping\";\n  public DOMAIN_GROUPING = \"Domain\";\n  public VERTICAL_GROUPING = \"Vertical\";\n  public SOURCE_GROUPING = \"Source\";\n  public DATE_GROUPING = \"Date\";\n\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 50,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [50, 100, 200, 500, 1000];\n  \n  constructor(private edwService : EDWService, private settingsService: SettingsService, private mdlSnackbarService: MdlSnackbarService) {\n    \n  }\n\n  ngOnInit(): void {\n    this.fromDate.setDate(this.fromDate.getDate());\n    this.toDate.setDate(this.toDate.getDate() + 1);\n    this.initRange();\n    this.filterData();\n  }\n\n  public onChangeSource(sourceID){\n    this.source = this.sources.filter(x => x.id === sourceID);\n    this.filterData();\n  }  \n\n  public onChangeDomain(domainID) {\n    this.domain = this.domains.filter(x => x.id === domainID);\n    this.filterData();\n  }\n\n  public onChangeVertical(verticalID){\n    this.vertical = this.verticals.filter(x => x.id === verticalID);\n    this.filterData();\n  }    \n\n  public onChangeTradeMarker(tradeMarkerId) {\n    this.tradeMarker = this.tradeMarkers.filter(x => x.id === tradeMarkerId);\n    //this.loadData();\n    this.mdlSnackbarService.showToast('Filter in progress');\n  }\n\n  public onChangeFromHour(fromHourId) {\n    this.fromHour = this.fromHours.filter(x => x.id === fromHourId)[0].value;\n    //this.mdlSnackbarService.showToast('Changing From Hour to ' + this.fromHour);\n  }\n\n  public onChangeToHour(toHourId) {\n    this.toHour = this.toHours.filter(x => x.id === toHourId)[0].value;\n    //this.mdlSnackbarService.showToast('Changing To Hour to ' + this.toHour);\n  }\n\n  public onChangeCampaign(campaignID){\n    alert(\"Filter in progress\");\n  }\n\n  onChangeAggregate(){\n    if (this.aggregate) {\n      this.disableGroupBy = true;\n    }\n    else {\n      this.disableGroupBy = false;\n    }\n    this.filterData();\n  }\n\n  private setShowColumnsAux (pShowDate, pShowDomain, pShowSource, pShowVertical) {\n    this.showDateColumn = pShowDate;\n    this.showDomainColumn = pShowDomain;\n    this.showSourceColumn = pShowSource;\n    this.showVerticalColumn = pShowVertical;\n  }\n\n  private setShowColumns (pValue) {\n    if(pValue === this.NO_GROUPING){\n      this.setShowColumnsAux(true, true, true, true);\n\n    }\n    if(pValue === this.DOMAIN_GROUPING){\n      this.setShowColumnsAux(false, true, false, false);\n    }\n    if(pValue === this.VERTICAL_GROUPING){\n      this.setShowColumnsAux(false, false, false, true);\n    }\n    if(pValue === this.SOURCE_GROUPING){\n      this.setShowColumnsAux(false, false, true, false);\n    }\n    if(pValue === this.DATE_GROUPING){\n      this.setShowColumnsAux(true, false, false, false);\n    }        \n  }\n\n  public onChangeGrouping(groupingID){\n    this.grouping = this.groupings.filter(x => x.id === groupingID)[0].name;\n    if (this.grouping !== this.NO_GROUPING) {\n      this.disableAggregate = true;\n    }\n    else {\n      this.disableAggregate = false;\n    }\n    this.setShowColumns(this.grouping);\n    this.filterData();\n  }  \n\n  public changeDates(value: any) {\n    this.dateHasChanged = true;\n    this.filterData();\n  }\n\n  /*\n  public changeDisplayDateCheckbox(value: any) {\n    this.displayDateField = value;\n    this.filterData();\n  }\n  */\n\n  public detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  public refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  public splitDateFromResponse(pDate){\n    if(pDate !== undefined && pDate !== null){\n      return pDate.split(\"T\")[0];\n    }\n    else{\n      return pDate;\n    }\n  }\n\n  public loadLevel1ClickFunc(data) {\n    if( !data.showdetails ){\n      this.loadDataForLevel1(data);\n      data.showdetails = !data.showdetails;\n      this.openedDetailDocuments += 1;\n    }\n    else{\n      data.showdetails = !data.showdetails;\n      this.openedDetailDocuments -= 1;\n    }\n    this.displayDetailColumns = this.openedDetailDocuments > 0;\n  }\n\n  public loadLevel2ClickFun(pDataL0, pDataL1) {\n    if( !pDataL1.showdetails ){\n      this.loadDataForLevel2(pDataL0, pDataL1);\n      pDataL1.showdetails = !pDataL1.showdetails;\n    }\n    else{\n      pDataL1.showdetails = !pDataL1.showdetails;\n    }\n  }\n\n  public loadLevel3ClickFun(pDataL0, pDataL1, pDataL2) {\n    if( !pDataL2.showdetails ){\n      this.loadDataForLevel3(pDataL0, pDataL1, pDataL2);\n      pDataL2.showdetails = !pDataL2.showdetails;\n    }\n    else{\n      pDataL2.showdetails = !pDataL2.showdetails;\n    }\n  }\n\n  public loadLevel4ClickFun(pDataL0, pDataL1, pDataL2, pDataL3) {\n    if( !pDataL3.showdetails ){\n      this.loadDataForLevel4(pDataL0, pDataL1, pDataL2, pDataL3);\n      pDataL3.showdetails = !pDataL3.showdetails;\n    }\n    else{\n      pDataL3.showdetails = !pDataL3.showdetails;\n    }\n  }\n\n  public loadLevel5ClickFun(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4) {\n    if (this.grouping !== this.NO_GROUPING) {\n      if( !pDataL4.showdetails ){\n        this.loadDataForLevel5(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4);\n        pDataL4.showdetails = !pDataL4.showdetails;\n      }\n      else{\n        pDataL4.showdetails = !pDataL4.showdetails;\n      }\n    }\n  } \n  \n  public loadLevel6ClickFun(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4, pDataL5) {\n    if (this.grouping === this.VERTICAL_GROUPING || this.grouping === this.DATE_GROUPING || this.grouping === this.SOURCE_GROUPING) {\n      if( !pDataL5.showdetails ){\n        this.loadDataForLevel6(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4, pDataL5);\n        pDataL5.showdetails = !pDataL5.showdetails;\n      }\n      else{\n        pDataL5.showdetails = !pDataL5.showdetails;\n      }\n    }\n  } \n\n  private getNextDate(pInitialDate){\n    var result = new Date(pInitialDate);\n    result.setDate(result.getDate() + 1);\n    return result.toISOString().split('T')[0];\n  }\n\n  private getSourceKeyValue (pSourceName) {\n    var sourceObject = this.sources.filter(x => x.name === pSourceName);\n    if (sourceObject[0] !== undefined && sourceObject[0] !== null) {\n      return sourceObject[0].key;\n    }\n    else {\n      return pSourceName;\n    }\n  }\n\n  private callTraficConversionsDetail(pData, pFromDate, pToDate, pSource, pDomain, pBillingSite, pCampaign, pContent){\n    this.searching = true;\n    this.edwService.getTrafficConversionsDetail(pFromDate, pToDate, pSource, pDomain, pBillingSite, pCampaign, pContent).then(response => {\n      this.datadetails = [];\n      response.forEach( (data: any) => {\n        this.datadetails.push( {\n          showdetails : false,\n          domain: data.BillingSite,\n          billing_site_visits: data.BillingSiteVisits,\n          form_1_impressions: data.Form1Impressions,\n          form_2_impressions: data.Form2Impressions,\n          visits: data.Visits,\n          smallform: data.smallform,\n          bigform: data.bigform,\n          submits: data.submits,\n          notice: data.notice,\n          billing_impressions: data[\"Billing impressions\"],\n          sales: data.Sales,\n          confirmation: data.confirmation,\n          checklist: data.checklist,\n          source: data.Source,\n          billing_site: data.BillingSite,\n          campaign : data.Campaign,\n          content : data.Content,\n          term : data.Term\n        } );\n      });\n      this.searching = false;\n      pData.details = this.datadetails;\n    });\n\n  }\n\n  private getFromDateBasedOnGrouping (pData) {\n    if(!this.aggregate){\n      if (this.grouping === this.NO_GROUPING) {\n        return pData.date;\n      }\n      else {\n        return this.fromDate;\n      }\n    }\n    else{\n      return this.fromDate;\n    }    \n  }\n\n  private getToDateBasedOnGrouping (pFromDate) {\n    if(!this.aggregate){\n      if (this.grouping === this.NO_GROUPING) {\n        return this.getNextDate(pFromDate);\n      }\n      else {\n        return this.toDate;\n      }\n    }\n    else{\n      return this.toDate; \n    }\n  }\n\n  private loadDataForLevel1(pData){\n    var fromDateParam = this.getFromDateBasedOnGrouping(pData);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var sourceParam = this.getSourceKeyValue(pData.source);\n    var verticalStr = this.createFilterString(this.selectedVerticals,  this.verticals);\n    var domainParam = pData.domain;\n    var billingSiteParam = null;\n    var campaignParam = null;\n    var contentParam = null;\n    if (this.grouping === this.NO_GROUPING) {\n      this.callTraficConversionsDetail(pData, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n    }\n    if (this.grouping === this.DOMAIN_GROUPING) {\n      sourceParam = this.createFilterString(this.selectedSources,  this.sources);\n      this.callTrafficConversionsSimple(pData, fromDateParam, toDateParam, sourceParam, domainParam, verticalStr, this.SOURCE_GROUPING, this.aggregate);\n    }\n    if (this.grouping === this.VERTICAL_GROUPING) {\n      sourceParam = this.createFilterString(this.selectedSources,  this.sources);\n      domainParam = this.createFilterString(this.selectedDomains,  this.domains);\n      verticalStr = pData.vertical;\n      this.callTrafficConversionsSimple(pData, fromDateParam, toDateParam, sourceParam, domainParam, verticalStr, this.SOURCE_GROUPING, this.aggregate);\n    }\n    if (this.grouping === this.SOURCE_GROUPING) {\n      this.callTrafficConversionsSimple(pData, fromDateParam, toDateParam, sourceParam, null, verticalStr, this.VERTICAL_GROUPING, this.aggregate);\n    }\n    if (this.grouping === this.DATE_GROUPING) {\n      sourceParam = this.createFilterString(this.selectedSources,  this.sources);\n      domainParam = this.createFilterString(this.selectedDomains,  this.domains);\n      var verticalParam = this.createFilterString(this.selectedVerticals,  this.verticals);\n      var nextDay = this.getNextDate(pData.date);\n      sourceParam = this.createFilterString(this.selectedSources,  this.sources);\n      this.callTrafficConversionsSimple(pData, pData.date, nextDay, sourceParam, domainParam, verticalParam, this.SOURCE_GROUPING, this.aggregate);\n    }\n  }\n\n  private loadDataForLevel2(pDataL0, pDataL1){\n    this.searching = true;\n    var fromDateParam = this.getFromDateBasedOnGrouping(pDataL0);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var domainParam = null;\n    var billingSiteParam = null;\n    var sourceParam = null;\n    var verticalParam = null;\n    var campaignParam = null;\n    var contentParam = null;\n    if (this.grouping === this.NO_GROUPING) {\n      sourceParam = pDataL1.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL1.domain;\n      this.callTraficConversionsDetail(pDataL1, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n    }\n    if (this.grouping === this.DOMAIN_GROUPING) {\n      sourceParam = this.getSourceKeyValue(pDataL1.source);\n      domainParam = pDataL0.domain;\n      this.callTraficConversionsDetail(pDataL1, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n    }\n    if (this.grouping === this.VERTICAL_GROUPING) {\n      sourceParam = this.getSourceKeyValue(pDataL1.source);\n      domainParam = this.createFilterString(this.selectedDomains,  this.domains);\n      verticalParam = pDataL0.vertical;\n      this.callTrafficConversionsSimple(pDataL1, fromDateParam, toDateParam, sourceParam, domainParam, verticalParam, this.DOMAIN_GROUPING, this.aggregate);\n      console.log(\"pDataL0\");\n      console.log(pDataL0);\n      console.log(\"pDataL1\");\n      console.log(pDataL1);\n    }\n    if (this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = this.getSourceKeyValue(pDataL0.source);\n      verticalParam = pDataL1.vertical;\n      this.callTrafficConversionsSimple(pDataL1, fromDateParam, toDateParam, sourceParam, null, verticalParam, this.DOMAIN_GROUPING, this.aggregate);\n    }\n    if (this.grouping === this.DATE_GROUPING) {\n      fromDateParam = pDataL0.date;\n      toDateParam = this.getNextDate(fromDateParam);\n      sourceParam = this.getSourceKeyValue(pDataL1.source);\n      domainParam = this.createFilterString(this.selectedDomains,  this.domains);\n      verticalParam = this.createFilterString(this.selectedVerticals,  this.verticals);\n      this.callTrafficConversionsSimple(pDataL1, fromDateParam, toDateParam, sourceParam, domainParam, verticalParam, this.DOMAIN_GROUPING, this.aggregate);\n    }\n  }\n\n  private loadDataForLevel3(pDataL0, pDataL1, pDataL2){\n    this.searching = true;\n    var fromDateParam = this.getFromDateBasedOnGrouping(pDataL0);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var sourceParam = null;\n    var domainParam = null;\n    var billingSiteParam = null;\n    var campaignParam = pDataL2.campaign;\n    var contentParam = null;\n    if (this.grouping === this.NO_GROUPING) {\n      sourceParam = pDataL0.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL1.domain;\n    }\n    if (this.grouping === this.DOMAIN_GROUPING) {\n      sourceParam = pDataL2.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL2.billing_site;\n    }\n    if (this.grouping === this.VERTICAL_GROUPING || this.grouping === this.DATE_GROUPING) {\n      sourceParam = this.getSourceKeyValue(pDataL1.source);\n      domainParam = pDataL2.domain;\n    }\n    if (this.grouping === this.DATE_GROUPING) {\n      fromDateParam = pDataL0.date;\n      toDateParam = this.getNextDate(fromDateParam);\n      sourceParam = this.getSourceKeyValue(pDataL1.source);\n      domainParam = pDataL2.domain;\n    }\n    if (this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = this.getSourceKeyValue(pDataL0.source);\n      domainParam = pDataL2.domain;\n    }\n    this.callTraficConversionsDetail(pDataL2, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n  }\n\n  private loadDataForLevel4(pDataL0, pDataL1, pDataL2, pDataL3){\n    this.searching = true;\n    var fromDateParam = this.getFromDateBasedOnGrouping(pDataL0);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var sourceParam = pDataL0.source;\n    var domainParam = pDataL0.domain;\n    var billingSiteParam = pDataL1.domain;\n    var campaignParam = pDataL2.campaign;\n    var contentParam = pDataL3.content;\n    if (this.grouping === this.NO_GROUPING) {\n      sourceParam = pDataL0.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL1.domain;\n      campaignParam = pDataL2.campaign;\n    }\n    if (this.grouping === this.DOMAIN_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL3.billing_site;\n      campaignParam = pDataL3.campaign;\n    } \n    if (this.grouping === this.VERTICAL_GROUPING || this.grouping === this.DATE_GROUPING || this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = null;\n    }\n    if (this.grouping === this.DATE_GROUPING) {\n      fromDateParam = pDataL0.date;\n      toDateParam = this.getNextDate(fromDateParam);\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = null;\n    }\n    this.callTraficConversionsDetail(pDataL3, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n  }\n  \n  private loadDataForLevel5(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4){\n    this.searching = true;\n    var fromDateParam = this.getFromDateBasedOnGrouping(pDataL0);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var sourceParam;\n    var domainParam;\n    var billingSiteParam;\n    var campaignParam;\n    var contentParam;\n    if (this.grouping === this.NO_GROUPING) {\n      sourceParam = pDataL0.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL1.domain;\n      campaignParam = pDataL2.campaign;\n      contentParam = pDataL3.content;\n    }\n    if (this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL1.domain;\n      billingSiteParam = pDataL2.domain;\n      campaignParam = pDataL3.campaign;\n      contentParam = pDataL4.content;\n    }\n    if (this.grouping === this.DOMAIN_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL0.domain;\n      billingSiteParam = pDataL2.domain;\n      campaignParam = pDataL4.campaign;\n      contentParam = pDataL4.content;\n    } \n    if (this.grouping === this.VERTICAL_GROUPING || this.grouping === this.DATE_GROUPING || this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = pDataL4.campaign;\n      contentParam = null;\n    }\n    if (this.grouping === this.DATE_GROUPING) {\n      fromDateParam = pDataL0.date;\n      toDateParam = this.getNextDate(fromDateParam);\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = pDataL4.campaign;\n      contentParam = null;\n    }\n    this.callTraficConversionsDetail(pDataL4, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n  }\n  \n  private loadDataForLevel6(pDataL0, pDataL1, pDataL2, pDataL3, pDataL4, pDataL5){\n    this.searching = true;\n    var fromDateParam = this.getFromDateBasedOnGrouping(pDataL0);\n    var toDateParam = this.getToDateBasedOnGrouping(fromDateParam);\n    var sourceParam;\n    var domainParam;\n    var billingSiteParam;\n    var campaignParam;\n    var contentParam;\n    if (this.grouping === this.DATE_GROUPING) {\n      fromDateParam = pDataL0.date;\n      toDateParam = this.getNextDate(fromDateParam);\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = pDataL4.campaign;\n      contentParam = pDataL5.content; \n    }\n    if (this.grouping === this.VERTICAL_GROUPING || this.grouping === this.DATE_GROUPING || this.grouping === this.SOURCE_GROUPING) {\n      sourceParam = pDataL3.source;\n      domainParam = pDataL2.domain;\n      billingSiteParam = pDataL3.domain;\n      campaignParam = pDataL4.campaign;\n      contentParam = pDataL5.content; \n    }\n    this.callTraficConversionsDetail(pDataL5, fromDateParam, toDateParam, sourceParam, domainParam, billingSiteParam, campaignParam, contentParam);\n  } \n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  };\n\n  private loadDomains(){\n    var countID = 1;\n    this.domains.push( { id: countID, name : 'All Domains', key: '' } );\n    this.domain = this.domains[0].name;\n    this.edwService.getDomains().then(response => {\n      response.sort(this.sortByProperty('name'));\n      response.forEach( (data: any) => {\n        if(data.name !== '' && data.name !== undefined){\n          countID += 1;\n          this.domains.push({id: countID, name: data.name, key: data.name});\n        }\n      });\n      this.domain = this.domains[0].name;\n    });\n  }\n\n  private loadSources(){\n    this.sources.push( { id: 1, name : 'All Sources', key: '' } );\n    this.source = this.sources[0].name;\n    this.edwService.getSources().then(response => {\n      response.sort(this.sortByProperty('value'));\n      response.forEach( (data: any) => {\n        if(data.value === '' && data.value !== undefined){\n          this.sources.push({id: data.id+1, name: data.alias, key: \"EMPTY_SOURCE\"});\n        }\n        else {\n          this.sources.push({id: data.id+1, name: data.alias, key: data.value});\n        }\n      });\n      this.source = this.sources[0].name;\n    });\n  }\n\n  private loadVerticals(){\n    var countID = 1;\n    this.verticals.push( { id: countID, name : 'All Verticals', key: '' } );\n    this.vertical = this.verticals[0].name;\n    this.edwService.getVerticals().then(response => {\n      response.sort(this.sortByProperty('vertical'));\n      response.forEach( (data: any) => {\n        countID += 1;\n        this.verticals.push({id: countID, name: data.vertical, key: data.vertical});\n      });\n      this.vertical = this.verticals[0].name;\n    });\n  }  \n\n  private loadTradeMarkers(){\n    this.tradeMarkers.push( { id: 1, name : 'Same day last week', key: 'week' } );\n    this.tradeMarkers.push( { id: 2, name : 'Yesterday', key: 'yesterday' } );\n    this.tradeMarker = this.tradeMarkers[0].name;\n  }  \n\n  private loadCampaigns(){\n    this.campaigns.push( { id: 1, name : 'All Campaigns', key: '' } );\n    this.campaign = this.campaigns[0].name;\n    this.settingsService.getChannels().then(response => {\n      var testCampaignsResponse = [\n        { id: 1, name : 'All Campaign', key: '' },\n        { id: 2, name : 'Campaign 2', key: 'campaign2' },\n        { id: 3, name : 'Campaign 3', key: 'campaign3' }\n      ];\n      this.campaigns = testCampaignsResponse;\n      this.campaign = this.campaigns[0].name;\n    });\n  }\n\n  private loadGroupings() {\n    this.groupings.push( { id: 1, name: this.NO_GROUPING, value: \"\" } );\n    this.groupings.push( { id: 2, name: this.DOMAIN_GROUPING, value: this.DOMAIN_GROUPING } );\n    this.groupings.push( { id: 3, name: this.VERTICAL_GROUPING, value: this.VERTICAL_GROUPING } );\n    this.groupings.push( { id: 4, name: this.SOURCE_GROUPING, value: this.SOURCE_GROUPING } );\n    this.groupings.push( { id: 5, name: this.DATE_GROUPING, value: this.DATE_GROUPING } );\n    this.grouping = this.groupings[0].name;\n  }\n\n  private populateHoursArray () {\n    this.hoursArray.push( { id: 2, name : '12 AM', value: '0' } );\n    this.hoursArray.push( { id: 3, name : '01 AM', value: '1' } );\n    this.hoursArray.push( { id: 4, name : '02 AM', value: '2' } );\n    this.hoursArray.push( { id: 5, name : '03 AM', value: '3' } );\n    this.hoursArray.push( { id: 6, name : '04 AM', value: '4' } );\n    this.hoursArray.push( { id: 7, name : '05 AM', value: '5' } );\n    this.hoursArray.push( { id: 8, name : '06 AM', value: '6' } );\n    this.hoursArray.push( { id: 9, name : '07 AM', value: '7' } );\n    this.hoursArray.push( { id: 10, name : '08 AM', value: '8' } );\n    this.hoursArray.push( { id: 11, name : '09 AM', value: '9' } );\n    this.hoursArray.push( { id: 12, name : '10 AM', value: '10' } );\n    this.hoursArray.push( { id: 13, name : '11 AM', value: '11' } );\n    this.hoursArray.push( { id: 14, name : '12 PM', value: '12' } );\n    this.hoursArray.push( { id: 15, name : '01 PM', value: '13' } );\n    this.hoursArray.push( { id: 16, name : '02 PM', value: '14' } );\n    this.hoursArray.push( { id: 17, name : '03 PM', value: '15' } );\n    this.hoursArray.push( { id: 18, name : '04 PM', value: '16' } );\n    this.hoursArray.push( { id: 19, name : '05 PM', value: '17' } );\n    this.hoursArray.push( { id: 20, name : '06 PM', value: '18' } );\n    this.hoursArray.push( { id: 21, name : '07 PM', value: '19' } );\n    this.hoursArray.push( { id: 22, name : '08 PM', value: '20' } );\n    this.hoursArray.push( { id: 23, name : '09 PM', value: '21' } );\n    this.hoursArray.push( { id: 24, name : '10 PM', value: '22' } );\n    this.hoursArray.push( { id: 25, name : '11 PM', value: '23' } );\n  }  \n\n  private loadFromHours(){\n    this.fromHours.push( { id: 1, name : 'From Hour', value: '0' } );\n    for (var position in this.hoursArray) {\n      this.fromHours.push(this.hoursArray[position]);\n    }\n    this.fromHour = this.fromHours[0].name;\n  }\n\n  private loadToHours(){\n    this.toHours.push( { id: 1, name : 'To Hour', value: '24' } );\n    for (var position in this.hoursArray) {\n      this.toHours.push(this.hoursArray[position]);\n    }\n    this.toHour = this.toHours[0].name;\n  }\n\n  private initRange(){\n    this.loadDomains();\n    this.loadSources();\n    this.loadVerticals();\n    this.loadCampaigns();\n    this.loadTradeMarkers();\n    this.loadGroupings();\n    this.populateHoursArray();\n    this.loadFromHours();\n    this.loadToHours();\n  }\n\n  public downloadMain(){\n    var csv = 'Source,Domain,Portal site,Billing site,Transfer rate,Form 1,Form 2,Submits,Registration rate,Billing page,Sales,Conversion rate,Billing to Sale ratio,Confirmations\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.source + ','\n            + row.domain + ','\n            + row.portal_visits + ','\n            + row.billing_site_visits + ','\n            + this.calculateDivision(row.billing_site_visits, row.portal_visits) + \"%,\"\n            + row.form_1_impressions + ','\n            + row.form_2_impressions + ','\n            + row.submits + ','\n            + this.calculateDivision(row.submits, row.portal_visits) + \"%,\"\n            + row.billing_impressions + ','\n            + row.sales + ','\n            + this.calculateDivision(row.sales, row.portal_visits) + \"%,\"\n            + this.calculateDivision(row.sales, row.billing_site_visits) + \"%,\"\n            + row.confirmation + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'traffic-conversions-main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  public downloadDetail(){\n    alert(\"Work in progress\");\n  }\n\n  private getFromHour () {\n    if (this.fromHour === \"From Hour\") {\n     return '0';\n    }\n    else {\n      return this.fromHour;\n    }\n  }\n\n  private getToHour () {\n    if (this.toHour === \"To Hour\") {\n     return '24';\n    }\n    else {\n      return this.toHour;\n    }\n  }\n\n  private callTrafficConversionsSimple (pData, pFromDate, pToDate, pSource, pDomain, pVertical, pGrouping, pAggregate) {\n    this.searching = true;\n    this.edwService.getTrafficConversions(pFromDate, pToDate, this.getFromHour(), this.getToHour(), pSource, pDomain, pVertical, pGrouping, pAggregate).then(response => {\n      this.data = [];\n      this.groupedByData = [];\n      this.pagination.totalItems = 0;\n      if ((!this.aggregate && this.grouping === this.NO_GROUPING) || this.grouping === this.DATE_GROUPING){\n        this.displayDateField = true;\n      }\n      else {\n        this.displayDateField = false; \n      }\n      response.forEach( (data: any) => {\n\n        if (this.grouping === this.DATE_GROUPING && (data.confirmation === \"0\" && data.Form1Impressions === \"0\" && data.Form2Impressions === \"0\" && data.Sales === \"0\") ) {\n          return;\n        }\n        var jsonObj = {\n          showdetails : false, \n          vertical: data.Vertical,\n          domain: data.Domain, \n          source: data.Source, \n          portal_visits: data.PortalVisits,\n          billing_site_visits: data.BillingSiteVisits,\n          form_1_impressions: data.Form1Impressions,\n          form_2_impressions: data.Form2Impressions,\n          submits: data.submits,\n          billing_impressions: data[\"Billing impressions\"],\n          sales: data.Sales,\n          confirmation: data.confirmation,\n          portalVisitsTrend: data.PortalVisitsTrend,\n          billingSiteVisitsTrend: data.BillingSiteVisitsTrend,\n          salesTrend: data.SalesTrend\n        };\n        if (pData !== null) {\n          jsonObj[ \"date\" ] = data.Date;\n          this.groupedByData.push(jsonObj);\n          pData.details = this.groupedByData;\n        }\n        else {\n          jsonObj[ \"date\" ] = this.displayDateField ? data.Date.split(\"T\")[0] : data.Date\n          this.data.push( jsonObj );\n          this.pagination.totalItems++;\n          this.refreshTable();\n        }\n      });\n      this.searching = false;\n      if (response.length === 0) {\n        this.pagination.totalItems = 0;\n        this.refreshTable();\n      }\n    });    \n  }\n\n  public filterData(){\n    var sourceStr = this.createFilterString(this.selectedSources,  this.sources);\n    var domainStr = this.createFilterString(this.selectedDomains,  this.domains);\n    var verticalStr = this.createFilterString(this.selectedVerticals,  this.verticals);\n    this.callTrafficConversionsSimple(null, this.fromDate, this.toDate, sourceStr, domainStr, verticalStr, this.grouping, this.aggregate);\n  }\n  \n  public cleanFilter(pFilter){\n    if(pFilter === 'source') {\n      this.selectedSources = [];\n    }\n    if(pFilter === 'domain') {\n      this.selectedDomains = [];\n    }\n    if(pFilter === 'vertical') {\n      this.selectedVerticals = [];\n    }    \n  }\n\n  public createFilterString(pSelectedArray, pOriginArray){\n    var filterStr = \"\";\n    if (pSelectedArray.length === 0) {\n      return filterStr;\n    }\n    if (pSelectedArray.length === 1 && pSelectedArray[0] === 1) {\n      return filterStr;\n    }\n    else {\n      for(var objectCount = 0; objectCount < pOriginArray.length; objectCount++) {\n        var obj = pOriginArray[objectCount];\n        if(obj.id !== 1 && pSelectedArray.includes(obj.id)){\n          filterStr += obj.key;\n          filterStr += \",\";\n        }\n      }\n      if(filterStr.length !== 0){\n        var lastChar = filterStr[filterStr.length - 1];\n        if(lastChar === ','){\n          filterStr = filterStr.substr(0, filterStr.length-1);\n        }\n      }\n      return filterStr;\n    }  \n  }\n\n  private getVerticalName(pVerticalName){\n    if(pVerticalName === \"All Verticals\"){\n      return null;\n    }\n    else{\n      return pVerticalName\n    }\n  }\n\n  public calculateDivision (pNumerator, pDenominator) {\n    if (pDenominator > 0) { \n      return ((pNumerator/pDenominator)*100).toFixed(2);\n    }\n    else {\n      return 0;\n    }\n  }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EDWService } from '../../../shared/services/edw.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'visitor-id-pivoted-edw',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [EDWService, SettingsService]\n})\n\nexport class EDWVisitorIdPivotedReportComponent implements OnInit {\n  data: Array<any>;\n  pagedData: Array<any> = [];\n\n  private searching: boolean = false;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private query: any = '';\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 50,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [50, 100, 200, 500, 1000];\n  \n  constructor(private edwService : EDWService, private settingsService: SettingsService, private mdlSnackbarService: MdlSnackbarService) {\n    \n  }\n\n  ngOnInit(): void {\n    this.fromDate.setDate(this.fromDate.getDate());\n    this.toDate.setDate(this.toDate.getDate() + 1);\n    this.loadData();\n  }\n\n  public detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  public refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  public splitDateFromResponse(pDate){\n    if(pDate !== undefined && pDate !== null){\n      return pDate.split(\"T\")[0];\n    }\n    else{\n      return pDate;\n    }\n  } \n\n  private loadData(){\n    this.searching = true;\n    this.edwService.getVisitorIdPivoted(this.fromDate, this.toDate).then(response => {\n      this.data = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (data: any) => {\n        this.data.push( { \n                          cookieEmailsSucceeded: data.CookieEmailsSucceeded,\n                          cookieResponded: data.CookieResponded,\n                          cookieSelected: data.CookieSelected,\n                          cookieSucceeded: data.CookieSucceeded,\n                          date: data.Date.split(\"T\")[0],\n                          domain: data.Domain,\n                          towerMd5EmailsSucceeded: data.TowerMd5EmailsSucceeded,\n                          towerMd5Responded: data.TowerMd5Responded,\n                          towerMd5Selected: data.TowerMd5Selected,\n                          towerMd5Succeeded: data.TowerMd5Succeeded,\n                          traverseMd5EmailsSucceeded: data.TraverseMd5EmailsSucceeded,\n                          traverseMd5Responded: data.TraverseMd5Responded,\n                          traverseMd5Selected: data.TraverseMd5Selected,\n                          traverseMd5Succeeded: data.TraverseMd5Succeeded,\n                          visits: data.Visits\n                        } );\n        this.pagination.totalItems++;\n      });\n      this.searching = false;\n      this.refreshTable();\n    });\n  }\n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  };\n\n  public downloadMain(){\n    var csv = 'Source,Domain,Hit Portal Site,Hit Billing Site,Form 1 Impressions,Form 2 Impressions,Submits,Billing Impressions,Sales,Confirmations\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.source + ',' + row.domain + ',' + row.portal_visits + ',' + row.billing_site_visits + ',' + row.form_1_impressions + ','  + row.form_2_impressions + ',' \n            + row.submits + ',' + row.billing_impressions + ',' + row.sales + ',' + row.confirmation + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'traffic-conversions-main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  public downloadDetail(){\n    alert(\"Work in progress\");\n  }\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EDWService } from '../../../shared/services/edw.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'visitor-id-report-edw',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [EDWService, SettingsService]\n})\n\nexport class EDWVisitorIdReportComponent implements OnInit {\n  data: Array<any>;\n  dataSecondLevel: Array<any>;\n  dataThirdLevel: Array<any>;\n  dataDetailsContent: Array<any>;\n  dataDetailsTerm: Array<any>;\n  pagedData: Array<any> = [];\n\n  private searching: boolean = false;\n  private displayDateField: boolean = false;\n  private displayDetailColumns: boolean = false;\n  private openedDetailDocuments: number = 0;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private startDate: any = new Date(1990, 0, 1);\n  private dateHasChanged: boolean = false;\n  private query: any = '';\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 50,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [50, 100, 200, 500, 1000];\n  \n  constructor(private edwService : EDWService, private settingsService: SettingsService, private mdlSnackbarService: MdlSnackbarService) {\n    \n  }\n\n  ngOnInit(): void {\n    this.fromDate.setDate(this.fromDate.getDate());\n    this.toDate.setDate(this.toDate.getDate() + 1);\n    this.initRange();\n    this.loadData();\n  }\n\n  public changeDates(value: any) {\n    this.dateHasChanged = true;\n    this.loadData();\n  }\n\n  public changeDisplayDateCheckbox(value: any) {\n    this.displayDateField = value;\n    this.loadData();\n  }\n\n  public detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  public refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  public splitDateFromResponse(pDate){\n    if(pDate !== undefined && pDate !== null){\n      return pDate.split(\"T\")[0];\n    }\n    else{\n      return pDate;\n    }\n  }\n\n  public showSecondLevel(data) {\n    if( !data.showSecondLevel ){\n      this.loadSecondLevelData(data);\n      data.showSecondLevel = !data.showSecondLevel;\n      this.openedDetailDocuments += 1;\n    }\n    else{\n      data.showSecondLevel = !data.showSecondLevel;\n      this.openedDetailDocuments -= 1;\n    }\n    this.displayDetailColumns = this.openedDetailDocuments > 0;\n  } \n\n  public showThirdLevel(dataLevel1, dataLevel2) {\n    if( !dataLevel2.showThirdLevel ){\n      this.loadThirdLevelData(dataLevel1, dataLevel2);\n      dataLevel2.showThirdLevel = !dataLevel2.showThirdLevel;\n    }\n    else{\n      dataLevel2.showThirdLevel = !dataLevel2.showThirdLevel;\n    }\n    this.displayDetailColumns = this.openedDetailDocuments > 0;\n  } \n\n  private loadData(){\n    this.searching = true;\n    this.edwService.getVisitorIdProviderPerformance(this.fromDate, this.toDate).then(response => {\n      this.data = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (data: any) => {\n        this.data.push( { showSecondLevel : false, \n                          date: data.Date.split(\"T\")[0],\n                          visitCount: data.VisitCount\n                        } );\n        this.pagination.totalItems++;\n      });\n      this.searching = false;\n      this.refreshTable();\n    });\n  }\n\n  private loadSecondLevelData(pData){\n    this.searching = true;\n    this.edwService.getVisitorIdProviderPerformanceDetail(pData.date).then(response => {\n      this.dataSecondLevel = [];\n      response.forEach( (data: any) => {\n        this.dataSecondLevel.push( {\n          showThirdLevel: false,\n          domain: data.Domain,\n          publisher: data.Publisher,\n          slot: data.Slot,\n          page: data.Page,\n          MD5ProviderId: data.MD5ProviderId,\n          provider: data[\"MD5 Provider\"],\n          selected: data.Selected,\n          responded: data.Responded,\n          succeeded: data.Succeeded\n        } );\n      });\n      this.searching = false;\n      pData.details = this.dataSecondLevel;\n    });\n  }\n\n  private loadThirdLevelData(dataLevel1, pData){\n    this.searching = true;\n    this.edwService.getVisitorIdProviderPerformanceDetail_2(dataLevel1.date, pData.domain, pData.slot, pData.page, pData.MD5ProviderId).then(response => {\n      this.dataThirdLevel = [];\n      response.forEach( (data: any) => {\n        this.dataThirdLevel.push( {\n          showThirdLevel: false,\n          slot: data.Slot,\n          page: data.Page,\n          provider: data[\"Email Provider\"],\n          selected: data.Selected,\n          responded: data.Responded,\n          succeeded: data.Succeeded\n        } );\n      });\n      this.searching = false;\n      pData.details = this.dataThirdLevel;\n    });\n  }  \n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  };\n\n  private initRange(){\n  }\n\n  public downloadMain(){\n    var csv = 'Source,Domain,Hit Portal Site,Hit Billing Site,Form 1 Impressions,Form 2 Impressions,Submits,Billing Impressions,Sales,Confirmations\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.source + ',' + row.domain + ',' + row.portal_visits + ',' + row.billing_site_visits + ',' + row.form_1_impressions + ','  + row.form_2_impressions + ',' \n            + row.submits + ',' + row.billing_impressions + ',' + row.sales + ',' + row.confirmation + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'traffic-conversions-main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  public downloadDetail(){\n    alert(\"Work in progress\");\n  }\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GatewayService } from '../../../shared/services/gateway.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-gateway-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [GatewayService,SettingsService,NetworksService]\n})\n\nexport class GatewayDataDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n  processors: any[] = [];\n  processorId: any = 1;\n\n  gatewayErrors: any[] = [];\n  gatewayError: boolean = false;\n  _gatewayDelay: boolean = false;\n\n  get gatewayDelay(){\n    return !this.gatewayError && this._gatewayDelay;\n  };\n\n  set gatewayDelay(value){\n    this._gatewayDelay = value;\n  };\n  \n  private searching: boolean = false;\n  private query: any = { user : 'bbm'};\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private aggregate: boolean = false;\n  \n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private gatewayService: GatewayService,\n              private settingsService: SettingsService,\n              private networksService: NetworksService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  onChangeAggregate(){\n    //this.aggregate = !this.aggregate;\n        this.loadData();\n  }\n\n  checkErrors(){\n    this.settingsService.getGatewayskErrors().then(response => { \n      this.gatewayErrors = response.data;\n      this.gatewayError = (this.gatewayErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.gatewaysWithdelay().then(response => { \n      this.gatewayDelay = (response.length > 0)\n      console.log(this.gatewayDelay);\n    });\n  }\n\n  loadData(){\n    this.searching = true;\n    this.checkErrors();\n    this.checkDelays();\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.gatewayService.getDataByUser( this.fromDate, toDate, this.query, this.aggregate ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            var datestr = (this.aggregate)? '-/-/-' : moment( data._id.transaction_day ).format( 'MM/DD/YYYY' );\n            this.data.push( { transaction_day: datestr, processor_id : data._id.processor_id, charges : data.charges.toFixed(2), refunds : data.refunds.toFixed(2), voids : data.voids.toFixed(2), totals : data.totals.toFixed(2) } );\n            this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'date,processor,charges,refunds,voids,totals\\n';\n    this.data.forEach( (row: any) =>{\n        csv += row.transaction_day + ',' + row.processor_id + ',' + row.charges + ',' + row.refunds + ',' + row.voids + ',' + row.totals + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        this.query.user = this.ranges[value].query.user;\n        this.loadData();\n  }\n\n  onProcessorChange(value: any) {\n    value = value - 1;\n    if(this.processors[value].key === '')\n        delete this.query.processor_id\n    else\n      this.query.processor_id = this.processors[value].key;\n    this.loadData();\n}\n\n  loadProcessors(){\n    var id = 1;\n    this.processors = [];\n    this.processors.push( { id: id, name : 'All processors', key : '' } );\n    this.settingsService.getGatewaySettings({ processor_id: '$processor_id' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.processors.push( { id: id, name : row._id.processor_id.toLowerCase(), key : row._id.processor_id.toLowerCase() } );\n      })\n    });\n  }\n\n  private initRange(){\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    this.loadProcessors();\n    \n    this.ranges.push( { id: 1, name : 'bbm',          query : { user : 'bbm'} } );\n    this.ranges.push( { id: 2, name : 'borat',        query : { user : 'borat'} } );\n    this.ranges.push( { id: 3, name : 'chametz',      query : { user : 'chametz'} } );\n    this.ranges.push( { id: 4, name : 'eagle',        query : { user : 'eagle'} } );\n    this.ranges.push( { id: 5, name : 'gnr',          query : { user : 'gnr'} } );\n    this.ranges.push( { id: 6, name : 'mbl',          query : { user : 'mbl'} } );\n    this.ranges.push( { id: 7, name : 'orangegrove',  query : { user : 'orangegrove'} } );\n    this.ranges.push( { id: 8, name : 'pjgroove',     query : { user : 'pjgroove'} } );\n    this.ranges.push( { id: 9, name : 'yamazaki',     query : { user : 'yamazaki'} } );\n    this.ranges.push( { id: 10, name : 'pirate',       query : { user : 'pirate'} } );\n    this.ranges.push( { id: 11, name : 'chelsea',       query : { user : 'chelsea'} } );\n    this.ranges.push( { id: 12, name : 'skylar',       query : { user : 'skylar'} } );\n    this.ranges.push( { id: 13, name : 'verybusy',       query : { user : 'verybusy'} } );\n    this.ranges.push( { id: 14, name : 'slayer',       query : { user : 'slayer'} } );\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/gateway-data/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GatewayService } from '../../../shared/services/gateway.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-gateway-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [GatewayService, SettingsService,NetworksService]\n})\n\nexport class GatewayStatusDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  gateways: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n  users: any[] = [];\n  userId: any = 1;\n  processors: any[] = [];\n  operatings: any[] = [];\n  processorId: any = 1;\n  operatingId: any = 1;\n  isos: any[] = [];\n  isoId: any = 1;\n\n  gatewayErrors: any[] = [];\n  gatewayError: boolean = false;\n  _gatewayDelay: boolean = false;\n\n  get gatewayDelay(){\n    return !this.gatewayError && this._gatewayDelay;\n  };\n\n  set gatewayDelay(value){\n    this._gatewayDelay = value;\n  };\n  \n  \n  private searching: boolean = false;\n  private query: any = {};\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private aggregate: boolean = true;\n  \n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private gatewayService: GatewayService,\n              private settingsService: SettingsService,\n              private networksService: NetworksService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadGateways();\n  }\n\n  checkErrors(){\n    this.settingsService.getGatewayskErrors().then(response => { \n      this.gatewayErrors = response.data;\n      this.gatewayError = (this.gatewayErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.gatewaysWithdelay().then(response => { \n      this.gatewayDelay = (response.length > 0)\n      console.log(this.gatewayDelay);\n    });\n  }\n  \n  onRangeChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.loadGateways();\n  }\n\n  onChangeUser(value: any) {\n        value = value - 1;\n        if(this.users[value].key === '')\n          delete this.query.user\n        else\n          this.query.user = this.users[value].key;\n        this.loadGateways();\n  }\n\n  onChangeProcessor(value: any) {\n        value = value - 1;\n        if(this.processors[value].key === '')\n          delete this.query.processor\n        else\n          this.query.processor = this.processors[value].key;\n        this.loadGateways();\n  }\n\n  onChangeOperating(value: any) {\n    value = value - 1;\n    if(this.operatings[value].key === '')\n      delete this.query.operating\n    else\n      this.query.operating = this.operatings[value].key;\n    this.loadGateways();\n}\n\n  onChangeIso(value: any) {\n        value = value - 1;\n        if(this.isos[value].key === '')\n          delete this.query.iso\n        else\n          this.query.iso = this.isos[value].key;\n        this.loadGateways();\n  }\n\n  loadGateways(){\n    this.searching = true;\n    this.checkErrors();\n    this.checkDelays();\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.query.status = 1;    \n    this.settingsService.getGateways( this.query ).then(response => { \n        \n        this.pagination.totalItems = 0;\n        this.gateways = response;\n        \n        this.loadData();\n    });\n\n  }\n\n  getUsageColor( value ){\n    if( value > 90 )\n       return 'red';    \n    if( value > 80 )\n       return 'rgb(255, 110, 64)';\n    if( value > 70 )\n       return 'yellow';\n    return '';\n  }\n\n  getProjectionColor( value ){\n    if( value < 25 )\n       return 'red';\n    if( value < 30 )\n       return 'rgb(255, 110, 64)';\n    if( value < 35 )\n       return 'yellow';    \n    return '';\n  }\n\n  mergeData(data){\n          this.data = [];\n          var days = new Date().getDate();\n          this.gateways.forEach( (gateway: any) => {\n              var processor = this.findProcessor( data, gateway.processor_id, gateway.processor);\n              var usagepercent = ((100*processor.charges.toFixed(2))/gateway.mo_cap);\n\n              var charges = processor.charges;\n              var averagexday = (days <= 1 )?0:charges/(days-1);\n              var projection = averagexday * 30;\n              var maxXmonth = gateway.mo_cap;\n              var projecteddays = maxXmonth/averagexday;\n\n              this.data.push( { \n                user :gateway.user,\n                processor_id :gateway.processor_id,\n                processor_name :gateway.processor_name,\n                operating :gateway.operating,\n                processor :gateway.processor,\n                iso :gateway.iso,\n                mid :gateway.mid,\n                product :gateway.product,\n                domain :gateway.domain, \n                mo_cap :gateway.mo_cap.toFixed(2),\n                charges : processor.charges.toFixed(2),\n                usagepercent : usagepercent.toFixed(2),\n                background : this.getUsageColor(usagepercent),\n                projection : projection.toFixed(0),\n                projecteddays : (projecteddays - days).toFixed(0),\n                projectioncolor : this.getProjectionColor(projecteddays)\n              } );\n              this.pagination.totalItems++;\n          });\n            this.data = this.data.sort( function( a, b ){\n              return b.usagepercent - a.usagepercent;\n            })\n          this.refreshTable();\n\n  }\n\n  findProcessor( data, processor_id, processorname ):any{\n    var result = {charges : 0};\n    data.forEach(processor => {\n      if( (processor._id.processor_id.toUpperCase() == processor_id.toUpperCase()) &&\n          (processor._id.processor.toUpperCase() == processorname.toUpperCase()) ){\n        result = processor;\n      }\n    });\n    return result;\n  }\n\n  loadData( ){\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.gatewayService.getDataByUser( this.fromDate, toDate, {}, this.aggregate ).then(response => { \n        this.pagination.totalItems = 0;\n        this.mergeData( response );\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'user,processor_name,operating,processor,iso,mid,product,domain,mo_cap,charges,usagepercent,projection,projecteddays\\n';\n    this.data.forEach( (row: any) =>{\n        csv += row.user + ',' + row.processor_name + ',' + row.operating + ',' + row.processor + ',' + row.iso + ',' + row.mid + ',' + row.product + ',' + row.domain + ',' + row.mo_cap + ',' + row.charges + ',' + row.usagepercent + ',' + row.projection + ',' + row.projecteddays + '\\n';\n    });      \n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n    this.searching = false;\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadGateways();\n  }\n\n  loadUsers(){\n    var id = 1;\n    this.users = [];\n    this.users.push( { id: id, name : 'All users', key : '' } );\n    this.settingsService.getGatewaySettings({ user: '$user' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.users.push( { id: id, name : row._id.user, key : row._id.user } );\n      })\n    });\n  }\n  \n  loadProcessors(){\n    var id = 1;\n    this.processors = [];\n    this.processors.push( { id: id, name : 'All processors', key : '' } );\n    this.settingsService.getGatewaySettings({ processor: '$processor' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.processors.push( { id: id, name : row._id.processor, key : row._id.processor } );\n      })\n    });\n  }\n\n  loadOperatings(){\n    var id = 1;\n    this.operatings = [];\n    this.operatings.push( { id: id, name : 'All operatings', key : '' } );\n    this.settingsService.getGatewaySettings({ operating: '$operating' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.operatings.push( { id: id, name : row._id.operating, key : row._id.operating } );\n      })\n    });\n  }\n\n  loadIsos(){\n    var id = 1;\n    this.isos = [];\n    this.isos.push( { id: id, name : 'All ISOs', key : '' } );\n    this.settingsService.getGatewaySettings({ iso: '$iso' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.isos.push( { id: id, name : row._id.iso, key : row._id.iso } );\n      })\n    });\n  }\n\n  private initRange(){\n\n    this.loadUsers();\n    this.loadProcessors();\n    this.loadOperatings();\n    this.loadIsos();\n    // first day of the month\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), 1 );\n    // last day of the month\n    this.toDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth() + 1, 0, 23, 59, 59, 999 );\n    \n    this.ranges.push( { id: 1, name : 'Current Month', fromDate : this.fromDate, toDate: this.toDate } );\n    var lastFrom = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth() - 1, this.fromDate.getDate() );\n    var lastTo = new Date( lastFrom.getFullYear(), lastFrom.getMonth() + 1, 0, 23, 59, 59, 999 );\n    this.ranges.push( { id: 2, name : 'Last Month', fromDate : lastFrom, toDate: lastTo } );\n\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/gateway-status/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IsoService } from '../../../shared/services/iso.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-iso-data',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [IsoService,SettingsService,NetworksService]\n})\n\nexport class IsoDataDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n\n  isos: any[] = [];\n  isoId: any = 1;\n\n  isoErrors: any[] = [];\n  isoError: boolean = false;\n  _isoDelay: boolean = false;\n\n  get isoDelay(){\n    return !this.isoError && this._isoDelay;\n  };\n\n  set isoDelay(value){\n    this._isoDelay = value;\n  };\n  \n  \n  private searching: boolean = false;\n  private query: any = {};\n  private reconciliation: boolean = false;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private isoService: IsoService,\n    private settingsService: SettingsService,\n    private networksService: NetworksService,\n    private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  checkErrors(){\n    this.settingsService.getISOsErrors().then(response => { \n      this.isoErrors = response.data;\n      this.isoError = (this.isoErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.isosWithdelay().then(response => { \n      this.isoDelay = (response.length > 0)\n      console.log(this.isoDelay);\n    });\n  }\n\n  loadData(){\n    this.searching = true;\n    this.checkErrors();\n    this.checkDelays();\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.isoService.getDataByUser( this.fromDate, toDate, this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            var datestr = moment( data._id.transaction_day ).format( 'MM/DD/YYYY' );\n            this.data.push( { transaction_day: datestr, merchant_id : data._id.merchant_id, dba_name : data._id.dba_name, \n                              charges : data.charges.toFixed(2), refunds : data.refunds.toFixed(2), adjustments : data.adjustments.toFixed(2), \n                              netsales : data.netsales.toFixed(2), fees : data.fees.toFixed(2), deposits : data.deposits.toFixed(2) } );\n\n            this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'date,merchant_id,dba_name,charges,refunds,adjustments,netsales,fees,deposits\\n';\n    this.data.forEach( (row: any) =>{\n        csv += row.transaction_day + ',' + \n                row.merchant_id + ',' + \n                row.dba_name + ',' + \n                (( row.charges != undefined ) ? row.charges: '0') + ',' + \n                (( row.refunds != undefined ) ? row.refunds: '0') + ',' + \n                (( row.adjustments != undefined ) ? row.adjustments: '0') + ',' + \n                (( row.netsales != undefined ) ? row.netsales: '0') + ',' + \n                (( row.fees != undefined ) ? row.fees: '0') + ',' + \n                (( row.deposits != undefined ) ? row.deposits: '0') + ',' + \n                '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        if(this.ranges[value].key == '')\n          delete this.query.user\n        else\n          this.query.user = this.ranges[value].key;\n        this.loadData();\n  }\n\n  onChangeIso(value: any) {\n        value = value - 1;\n        if(this.isos[value].key === '')\n          delete this.query.network_name\n        else\n          this.query.network_name = this.isos[value].key.replace(\" \", \"\");\n        this.loadData();\n  }\n\n  loadProcessors(){\n    var id = 1;\n    this.ranges = [];\n    this.ranges.push( { id: id, name : 'All processors', key : '' } );\n    this.settingsService.getGatewaySettings({ processor: '$processor' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.ranges.push( { id: id, name : row._id.processor, key : row._id.processor.toLowerCase() } );\n      })\n    });\n  }\n\n  loadIsos(){\n    var id = 1;\n    this.isos = [];\n    this.isos.push( { id: id, name : 'All ISOs', key : '' } );\n    this.settingsService.getGatewaySettings({ iso: '$iso' } ,{}).then(response => { \n      response.forEach( (row: any) =>{\n        id++;\n        this.isos.push( { id: id, name : row._id.iso, key : row._id.iso.toLowerCase() } );\n      })\n    });\n  }\n\n  private initRange(){\n\n    this.loadIsos();\n    this.loadProcessors();\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    \n     //this.ranges.push( { id: 1, reconciliation : false, name : 'bbm',          key : 'bbm' } );\n     //this.ranges.push( { id: 2, reconciliation : false, name : 'borat',        key : 'borat' } );\n     //this.ranges.push( { id: 3, reconciliation : false, name : 'chametz',      key : 'chametz' } );\n     //this.ranges.push( { id: 4, reconciliation : false, name : 'eagle',        key : 'eagle' } );\n     //this.ranges.push( { id: 5, reconciliation : false, name : 'gnr',          key : 'gnr' } );\n     //this.ranges.push( { id: 6, reconciliation : false, name : 'mbl',          key : 'mbl' } );\n     //this.ranges.push( { id: 7, reconciliation : false, name : 'orangegrove',  key : 'orangegrove' } );\n     //this.ranges.push( { id: 8, reconciliation : false, name : 'pjgroove',     key : 'pjgroove' } );\n     //this.ranges.push( { id: 9, reconciliation : false, name : 'yamazaki',     key : 'yamazaki' } );\n     //this.ranges.push( { id: 10, reconciliation : false, name : 'skylar',     key : 'skylar' } );\n     //this.ranges.push( { id: 11, reconciliation : false, name : 'slayer',     key : 'slayer' } );\n     //this.ranges.push( { id: 12, reconciliation : false, name : 'chelsea',     key : 'chelsea' } );\n     //this.ranges.push( { id: 13, reconciliation : false, name : 'pirate',     key : 'pirate' } );\n     //this.ranges.push( { id: 14, reconciliation : false, name : 'verybusy',     key : 'verybusy' } );\n     //this.ranges.push( { id: 15, reconciliation : false, name : 'wasabi',     key : 'wasabi' } );\n     //this.ranges.push( { id: 15, reconciliation : false, name : 'island',     key : 'island' } );\n    \n\n    //this.isos.push( { id: 1, name : 'All Isos', key : '' } );\n    //this.isos.push( { id: 2, name : 'Qualpay', key : 'qualpay' } );\n    //this.isos.push( { id: 3, name : 'Splash', key : 'splash' } );\n    //this.isos.push( { id: 4, name : 'SignaPay', key : 'signapay' } );\n    //this.isos.push( { id: 5, name : 'RMS', key : 'rms' } );\n    //this.isos.push( { id: 6, name : 'Payarc', key : 'payarc' } );\n    //this.isos.push( { id: 7, name : 'EMS', key : 'ems' } );\n    //this.isos.push( { id: 8, name : 'WestAmerica', key : 'westamerica' } );\n    //this.isos.push( { id: 9, name : 'Island', key : 'island' } );    \n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/iso-data/dashboard.component.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\nimport {Router} from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\n\nimport {StatsService} from '../../../shared/services/stats.service';\nimport {ByNetworkComponent} from './../../../components/chartjs/by-network/by-network';\n\n@Component({\n  selector: 'dashboard',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService]\n})\n\nexport class MainDashboardComponent implements OnInit {\n  @Input()\n  stats = { \n    revenue : 0,\n    net_revenue : 0,\n    clicks : 0,\n    spend : 0,\n    bynetwork : []\n  };\n\n  @ViewChild(ByNetworkComponent) thechart:ByNetworkComponent;\n\n  ranges: any[] = [];\n  rangeId: any = 1;\n  form: FormGroup;\n\n  private loadingExpense: boolean = false;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  constructor(private statsService: StatsService,\n              private router: Router) { }\n\n  private initRange(){\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n\n    // -1 is yesterday\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1 );\n    this.ranges.push( { id: 1, name : 'Yesterday', fromDate : this.fromDate, toDate: this.toDate } );\n\n    // -7 is last 7 days\n    var day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 7 );\n    this.ranges.push( { id: 2, name : 'Last 7 days', fromDate : day, toDate: this.toDate } );\n\n    // -30 is last 30 days\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 30 );\n    this.ranges.push( { id: 3, name : 'Last 30 days', fromDate : day, toDate: this.toDate } );\n\n    // -90 is last 3 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 90 );\n    this.ranges.push( { id: 4, name : 'Last 3 months', fromDate : day, toDate: this.toDate } );\n\n    // -365 days last 12 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 365 );\n    this.ranges.push( { id: 5, name : 'Last 12 months', fromDate : day, toDate: this.toDate } );\n\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        console.log('year=', this.ranges[value].year);\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.loadData( this.ranges[value].fromDate, this.ranges[value].toDate );\n        this.thechart.load( this.ranges[value].fromDate, this.ranges[value].toDate );\n  }\n\n  private loadRevenueStats(fromDate, toDate) {\n    this.statsService.getTotal( fromDate, toDate ).then(response => {\n      for( var i = 0; i < response.length; i++){\n        var result = response[i];\n        if (result != null) {\n          if( result._id.network_type === 'network' ) {\n            this.stats.revenue = result.revenue.toFixed(2);\n            this.stats.net_revenue = result.net_revenue.toFixed(2);\n            this.stats.clicks = result.clicks;\n         } \n        }\n      }\n    });\n  }\n\n  private loadExpenseData(fromDate, toDate) {\n    this.loadingExpense = true;\n    this.statsService.getExpenseSummary( fromDate, toDate ).then(response => {\n      for( var i = 0; i < response.length; i++){\n        var result = response[i];\n        if (result != null) {\n          if( result._id.network_type === 'spend' ) {\n            this.stats.spend = result.spend.toFixed(2);\n         } \n        }\n      }\n      this.loadingExpense=false;\n    });    \n  }\n\n  private loadData( fromDate, toDate ) {\n    this.loadRevenueStats(fromDate, toDate);\n    this.loadExpenseData(fromDate, toDate);\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData( this.fromDate, this.toDate );\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/main/dashboard.component.ts\n **/","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport * as moment from 'moment';\nimport { MdlDialogService } from 'angular2-mdl';\nimport { MdlDialogComponent } from 'angular2-mdl';\nimport { SettingsService } from '../../../shared/services/settings.service';\n\n@Component({\n  selector: 'dashboard-subids',\n  template: require('./dashboard.component.html'),\n  providers: [NetworksService, SettingsService]\n})\n\nexport class NetworksDashboardComponent implements OnInit {\n  \n  errors: Array<any>;\n  delays: Array<any>;\n  \n  private searching: boolean = false;\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  errorpagination = { currentPage: 1, itemsPerPage: 10, totalItems: 24};\n  errorpagedData: Array<any> = [];\n\n  delaypagination = { currentPage: 1, itemsPerPage: 10, totalItems: 24};\n  delaypagedData: Array<any> = [];\n\n  constructor(private networksService: NetworksService,\n              private settingsService: SettingsService,\n              private router: Router) {\n  }\n\n  ngOnInit(): void {\n    this.loadErrors();\n    this.loadDelays();\n  }\n\n  loadErrors(){\n    this.searching = true;\n    this.settingsService.getErrors( {status: 1} ).then(response => { \n        this.errors = [];\n        this.errorpagination.totalItems = 0;\n        \n        response.data.forEach( (data: any) => {\n            //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n            this.errors.push( data );\n            this.errorpagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshErrors();\n    });\n\n  }\n\n  refreshErrors() {\n    let start = (this.errorpagination.currentPage - 1) * this.errorpagination.itemsPerPage,\n      end = start + this.errorpagination.itemsPerPage;\n    this.errorpagedData = (this.errors != undefined) ? this.errors.slice(start, end) : [];\n  }\n\n  detectErrorChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.errorpagination = event.pagination;\n      this.refreshErrors();\n    }\n  }\n\n  loadDelays(){\n    this.searching = true;\n    this.networksService.withdelay({}).then(response => { \n        this.delays = [];\n        this.delaypagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n            this.delays.push( data );\n            this.delaypagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshDelays();\n    });\n\n  }\n  \n  refreshDelays() {\n    let start = (this.delaypagination.currentPage - 1) * this.delaypagination.itemsPerPage,\n      end = start + this.delaypagination.itemsPerPage;\n    this.delaypagedData = (this.delays != undefined) ? this.delays.slice(start, end) : [];\n  }\n\n  detectDelayChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.delaypagination = event.pagination;\n      this.refreshDelays();\n    }\n  }\n\n  public onDialogShow(){\n  }\n\n\n  public onDialogHide(){\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/networks/dashboard.component.ts\n **/","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { SpendService } from '../../../shared/services/spend.service';\nimport { StatsService } from '../../../shared/services/stats.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'spend-analysis',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [SpendService, SettingsService,StatsService]\n})\n\nexport class PAndLDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  spend: Array<any>;\n  spenddetails: Array<any>;\n  revenue: Array<any>;\n  revenuedetails: Array<any>;\n  datadetails: Array<any>;\n  \n  domain: any = '';\n  domainkey: any = '';\n  domains: any[] = [];\n  domainId: any = 1;\n\n  vendor: any = '';\n  vendorkey: any = '';\n  vendors: any[] = [];\n  vendorId: any = 1;\n\n  aggregate: boolean = false;\n  trading: boolean = false;\n  \n  dates: any[] = [];\n  dateId: any = 1;\n\n  fulldetailreport = false;\n  \n  private searching: boolean = false;\n  private revenuequery: any = { sub_id_channel : { $ne : 'TRADING' } };\n  private spendquery: any = { };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private spendService: SpendService, \n              private settingsService: SettingsService,\n              private statsService: StatsService,\n              private router: Router) {\n  }\n\n  private changeDates(value: any) {\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.loadRevenue( toDate );\n  }\n\n  loadRevenue( toDate ){\n    this.statsService.getDataDailyRevenue( this.fromDate, toDate, this.revenuequery, this.aggregate, false ).then(response => { \n      this.revenue = [];\n      this.pagination.totalItems = 0;\n      response.forEach( (data: any) => {\n          if(data._id != null){\n              //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n              var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n              this.revenue.push( { showdetails : false, date: datestr, year: data._id.nw_dt_year, month : data._id.nw_dt_month, nwday : data._id.nw_dt_day, \n                                domain : this.domain, \n                                revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(4) } );\n              this.pagination.totalItems++;\n          }\n      });\n      console.log(this.revenue);\n      this.loadSpend( toDate );\n    });\n  }\n\n  loadSpend( toDate ){\n    this.spendService.getDataDailySpend( this.fromDate, toDate, this.spendquery, this.aggregate ).then(response => { \n        this.spend = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                this.spend.push( { showdetails : false, date: datestr, year: data._id.nw_dt_year, month : data._id.nw_dt_month, nwday : data._id.nw_dt_day, \n                                  domain : this.domain, spend : data.spend.toFixed(2) } );\n                this.pagination.totalItems++;\n            }\n        });\n        console.log(this.spend);\n        this.mergeData();\n    });\n\n  }\n\n  mergeData(){\n    this.data = [];\n    this.spend.forEach( ( ele: any ) => {\n      var revenue:any= this.findRevenue( ele )\n      this.data.push( { date: ele.date, domain: ele.domain, revenue : revenue.revenue, spend : ele.spend,\n                        year: ele.year, month : ele.month, nwday : ele.nwday, \n                        net : (revenue.revenue - ele.spend).toFixed(2),\n                        roas : ((revenue.revenue*100)/ele.spend).toFixed(2)\n                      })\n    });\n    this.refreshTable();\n    this.searching = false;\n  }\n\n  findRevenue( spend ){\n    var result = {};\n    this.revenue.forEach( ( ele: any ) => {\n      if(spend.date == ele.date ) result = ele;\n    })\n    return result;\n  }\n\n  showDetails( data: any, group : any, type : any ) {\n    console.warn('         column  - ' + JSON.stringify(group) );\n    if( !data.showdetails ){ // open details\n      this.loadDataDetails( data, group, type );\n    }\n    data.showdetails = !data.showdetails;\n  }\n\n  loadDataDetails( data, group, type ){\n    this.searching = true;\n    var fromDate = this.aggregate ? this.fromDate : new Date( data.year, data.month - 1, data.nwday );\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    \n    toDate = this.aggregate ? this.toDate : new Date( data.year, data.month -1, data.nwday + 1);\n    this.statsService.getDataDailyRevenueDetails(  fromDate, toDate, this.revenuequery, {group_name : '$sub_id_domain'}, false, {} ).then(response => { \n        this.revenuedetails = [];\n        response.forEach( (data: any) => {\n          if(data._id != null){\n            this.revenuedetails.push( {    date : '' , \n                                        domain : type === 'domain' ? data._id.group_name : '', \n                                        revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(4) } );\n          }else{\n            console.log('empty');\n          }\n        });\n        console.log(\"this.revenuedetails\");\n        console.log(this.revenuedetails);\n        this.loadSpendDetails( data, toDate, group );      \n    });\n    \n  }\n\n  loadSpendDetails( data, toDate, gg ){\n    var group = { domain : '$domain' };\n\n    this.spendService.getDataDailySpendDetails( this.fromDate, toDate, this.spendquery, group ).then(response => { \n        this.spenddetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                console.log(data);\n                this.spenddetails.push( { showdetails : false,  \n                                          domain : data._id.domain, spend : data.spend.toFixed(2) } );\n            }\n        });\n        console.log(\"this.spenddetails\");\n        console.log(this.spenddetails);\n        this.mergeDataDetails(data);\n    });\n\n  }\n\n  mergeDataDetails(data){\n    this.datadetails = [];\n    this.spenddetails.forEach( ( ele: any ) => {\n      var revenue:any= this.findRevenueDetails( ele )\n      this.datadetails.push( { date: ele.date, domain: ele.domain, revenue : revenue.revenue, spend : ele.spend, \n                        net : (revenue.revenue - ele.spend).toFixed(2),\n                        roas : ((revenue.revenue*100)/ele.spend).toFixed(2)\n                      })\n    });\n    console.log(\"this.datadetails\");\n    console.log(this.datadetails);\n    data.details = this.datadetails;\n    //this.refreshTable();\n    this.searching = false;\n  }\n\n  findRevenueDetails( spend ){\n    var result = {};\n    this.revenuedetails.forEach( ( ele: any ) => {\n      if(spend.domain == ele.domain ) result = ele;\n    })\n    return result;\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n  }\n\n  loadDomains(){\n    this.domains.push( { id: 1, name : 'All domains', key : '' } );\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.domains.push(domain);\n        }\n      })      \n    });\n  }\n\n  loadVendors(){\n    this.vendors.push( { id: 1, name : 'All vendors', key : '' } );\n    this.vendor = this.vendors[0].name;\n    this.settingsService.getSpendNetworks().then(response => { \n      this.vendors = response.data;\n      this.vendor = this.vendors[0].name;\n    });\n    \n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  onChangeDomain(value: any) {\n        value = value - 1;\n        this.domain = this.domains[value].name;\n        this.domainkey = this.domains[value].key;        \n\n        if(this.domains[value].key === ''){\n          delete this.spendquery.domain;\n          delete this.revenuequery.sub_id_domain;\n        }\n        else{\n          this.spendquery.domain = this.domains[value].key;\n          this.revenuequery.sub_id_domain = this.domains[value].key;\n        }\n          \n        this.loadData();\n  }\n\n  onChangeVendor(value: any) {\n    value = value - 1;\n    this.vendor = this.vendors[value].name;\n    this.vendorkey = this.vendors[value].key;        \n\n    if(this.vendors[value].key === '')\n      delete this.spendquery.vendor;\n    else\n      this.spendquery.vendor = this.vendors[value].key;\n    this.loadData();\n}\n\n\n  onChangeAggregate(){\n    this.loadData();\n  }\n\n  onChangeTrading(){\n    if(!this.trading)\n      this.revenuequery.sub_id_channel = { $ne : 'TRADING' };\n    else\n      delete this.revenuequery.sub_id_channel\n    this.loadData();\n  }\n\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.loadData();\n  }\n\n  private initRange(){\n    \n    this.loadDomains();\n    this.loadVendors();\n\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    \n    this.dates.push( { id: 1, name : 'Yesterday', fromDate : this.fromDate, toDate: this.toDate } );\n    var day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 6 );\n    this.dates.push( { id: 2, name : 'Last 7 days', fromDate : day, toDate: this.toDate } );\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 29 );\n    this.dates.push( { id: 3, name : 'Last 30 days', fromDate : day, toDate: this.toDate } );\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 89 );\n    this.dates.push( { id: 4, name : 'Last 3 months', fromDate : day, toDate: this.toDate } );\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 364 );\n    this.dates.push( { id: 5, name : 'Last 12 months', fromDate : day, toDate: this.toDate } );\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/pandl/dashboard.component.ts\n **/","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport { RevSplitValuesService } from '../../../shared/services/rev_split_values.service';\n\nimport { MdlDialogService } from 'angular2-mdl';\nimport { MdlDialogComponent } from 'angular2-mdl';\nimport { MdlSnackbarService } from 'angular2-mdl';\n\n@Component({\n  selector: 'dashboard-rev-split-values',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [SettingsService, NetworksService, RevSplitValuesService]\n})\n\nexport class RevSplitValuesDashboardComponent implements OnInit {\n  \n  public revSplitValue: any = {};\n  private searching: boolean = false;\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  networkId: any = 1;\n  networkkey: any = '';\n  network: any = '';\n  networks: any[] = [];\n  history: boolean = false;\n\n  data: Array<any>;\n  @ViewChild(MdlDialogComponent) editNetworkCoefficient:MdlDialogComponent;\n\n  pagination = { currentPage: 1, itemsPerPage: 10, totalItems: 24};\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n  pagedData: Array<any> = [];\n\n  constructor(private settingsService: SettingsService, \n              private networksService: NetworksService,\n              private revSplitValuesService: RevSplitValuesService,\n              private router: Router,\n              private mdlSnackbarService: MdlSnackbarService) {\n  }\n\n  ngOnInit(): void {\n    this.loadNetworks();\n    this.loadData();\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n  }\n\n  loadNetworks(){\n    this.networks.push( { id: 1, name : 'All networks', key : '' } );\n    this.network = this.networks[0];\n    this.settingsService.getNetworks().then(response => { \n      const networksFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      networksFromResponse.forEach( (network: any) => {\n        if (network.name !== \"All networks\") {\n          this.networks.push(network);\n        }\n      })\n    });\n  }  \n\n  onChangeNetwork(value: any) {\n    this.network = this.networks.filter(x => x.id === value)[0];\n    this.networkkey = this.network.key;\n    this.loadData();\n}\n\n  loadData(){\n    this.searching = true;\n    var query = { network_name: this.networkkey, from_date: this.fromDate, to_date: this.toDate, history: this.history };\n    if(this.history === false) {\n      this.revSplitValuesService.revSplitValuesMain(query).then(response => {\n        this.data = [];\n        this.pagination.totalItems = 0;\n        this.populateByNetwork(response, this.data);\n      });\n    }\n    else {\n      this.revSplitValuesService.revSplitValuesMain(query).then(response => {\n        this.data = [];\n        this.pagination.totalItems = 0;\n        this.populateByHistory(response, this.data);\n      });\n    }\n\n  }\n\n  private populateByNetwork(pResponse, pData) {\n    pResponse.forEach( (pData: any) => {\n      this.data.push( {\n                        type: \"network\",\n                        date: \"-\",\n                        network_name : pData._id.network_name,\n                        name: pData._id.name,\n                        coefficient: pData._id.rev_share,\n                        extra_field: pData._id.extra_field\n                      } );\n      this.pagination.totalItems++;\n    });\n    this.searching = false;\n    this.refreshTable(); \n  }\n\n  private populateByHistory(pResponse, pData) {\n    pResponse.forEach( (pData: any) => {\n      this.data.push({ \n                        type: \"history\",\n                        network_name : pData.network_name,\n                        name: pData.name,\n                        date: pData.date,\n                        coefficient: pData.coefficient,\n                        created_by: pData.created_by,\n                        updated_by: pData.updated_by\n                      });\n      this.pagination.totalItems++;\n    });\n    this.searching = false;\n    this.refreshTable();\n  }   \n\n  private sortByProperty = function (property) {\n    return function (x, y) {\n        return ((x[property] === y[property]) ? 0 : ((x[property] > y[property]) ? 1 : -1));\n    };\n  }; \n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    this.data = [];\n    this.loadData();\n  }  \n\n  onChangeHistory(){\n    this.data = [];\n    this.loadData();\n  }\n\n  public editCoefficient( revSplitValue: any ){\n    this.revSplitValue = revSplitValue;\n    this.editNetworkCoefficient.show();\n  }\n\n  public onDialogShow(){\n  }\n\n  public onDialogHide(){\n  }\n\n  public saveRevSplitValue(){\n    this.revSplitValuesService.saveRevSplitValue( this.revSplitValue ).then(response => {\n      if(response.hasOwnProperty('nModified')){\n        this.mdlSnackbarService.showToast(response.nModified + \" document/s updated\");\n      }\n      else{\n        this.mdlSnackbarService.showToast(\"Update is not working\");\n      }\n    });\n    this.editNetworkCoefficient.close();\n  }  \n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/rev-split-values/dashboard.component.ts\n **/","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { StatsService } from '../../../shared/services/stats.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport { NetworksService } from '../../../shared/services/networks.service';\nimport * as moment from 'moment';\nimport { first } from '@angular/router/src/utils/collection';\n\n@Component({\n  selector: 'revenue-analysis',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService, SettingsService, NetworksService]\n})\n\nexport class RevAnalysisDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  datadetails: Array<any>;\n  \n  network: any = '';\n  networkkey: any = '';\n  networks: any[] = [];\n  networkId: any = 1;\n\n  audience: any = '';\n  audiencekey: any = '';\n  audiences: any[] = [];\n  audienceId: any = 1;  \n\n  networkErrors: any[] = [];\n  networkError: boolean = false;\n  _networkDelay: boolean = false;\n\n  get networkDelay(){\n    return !this.networkError && this._networkDelay;\n  };\n\n  set networkDelay(value){\n    this._networkDelay = value;\n  };\n\n  dayreport: boolean = false\n  showBadDebt: boolean = false\n  aggregate: boolean = false;\n  fulldetailreport = false;\n\n  domain: any = '';\n  domainkey: any = '';\n  domains: any[] = [];\n  domainId: any = 1;\n\n  originatingDomain: any = '';\n  originatingDomains: any[] = [];\n  originatingDomainkey: any = '';\n  originatingDomainId: any = 1;\n\n  channel: any = '';\n  channelkey: any = '';\n  channels: any[] = [];\n  channelId: any = 1;\n\n  subChannel: any = '';\n  subChannelkey: any = '';\n  subChannels: any[] = [];\n  subChannelId: any = 1;\n\n  campaign: any = '';\n  campaignkey: any = '';\n  campaigns: any[] = [];\n  campaignId: any = 1;  \n  \n  offer: any = '';\n  offerkey: any = '';\n  offers: any[] = [];\n  offerId: any = 1;\n  \n  day: any = '';\n  days: any[] = [];\n  dayId: any = 1;\n\n  dates: any[] = [];\n  dateId: any = 1;\n\n  columns: any[] = [];\n\n  subidfilter: any = '';\n  \n  private searching: boolean = false;\n  //private query: any = { network_name : 'tonic', sub_id_domain : 'Section 8', sub_id_tech : 'TEXT'};\n  private query: any = { };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private statsService: StatsService, \n    private settingsService: SettingsService,\n    private networksService: NetworksService,\n    private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  private changeDates(value: any) {\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  private isInfinite(num) {\n    return !isFinite(num);\n   }\n\n  private fixNumberFormat(pNumber, pDecimals){\n    if (isNaN(pNumber) || this.isInfinite(pNumber)){\n      return \"0\";\n    }\n    if (pNumber !== \"\" && pNumber !== null && pNumber !== undefined && (typeof Number(pNumber) === \"number\")) {\n      return pNumber.toFixed(pDecimals);\n    }\n    else {\n      return \"0\";\n    }\n  }\n\n  loadData(){\n    this.searching = true;\n    this.checkErrors();\n    this.checkDelays();\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.statsService.getDataDailyRevenue( this.fromDate, toDate, this.query, this.aggregate, this.showBadDebt ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                this.data.push( { showdetails : false, date: datestr, year: data._id.nw_dt_year, month : data._id.nw_dt_month, nwday : data._id.nw_dt_day, \n                                  network : this.network.name, originating_domain : this.originatingDomain.name, domain : this.domain.name, channel : this.channel.name, \n                                  sub_channel : this.subChannel.name, campaign: this.campaign.name, offer : this.offer, audience: this.audience.name, \n                                  day : (this.day != '' ? this.day : 'All days'), revenue : this.fixNumberFormat(data.revenue, 2), \n                                  gross_revenue : this.fixNumberFormat(data.gross_revenue, 2), net_revenue : this.fixNumberFormat(data.net_revenue, 2), \n                                  clicks : data.clicks, ad_clicks : data.ad_clicks, rpc : this.fixNumberFormat(data.rpc, 4), active_view: this.fixNumberFormat(data.active_view, 1), \n                                  page_views: data.page_views, impressions: data.impressions, visitors: data.visitors, ad_requests: data.ad_requests, \n                                  ad_impressions: data.ad_impressions, coverage: this.fixNumberFormat(data.coverage, 2), page_ctr : this.fixNumberFormat(data.page_ctr, 2), \n                                  ad_request_ctr : this.fixNumberFormat(data.ad_request_ctr, 2), matched_ad_ctr : data.matched_ad_ctr, ctr: this.fixNumberFormat(data.ctr, 2), \n                                  ad_ctr: this.fixNumberFormat(data.ad_ctr, 2), ad_request_rpm: this.fixNumberFormat(data.ad_request_rpm, 2), \n                                  impression_rpm: this.fixNumberFormat(data.impression_rpm, 2), conversions: data.conversions, \n                                  ad_rpm: this.fixNumberFormat(data.ad_rpm, 2), cpc: this.fixNumberFormat(data.cpc, 2)\n                                } );\n                this.pagination.totalItems++;\n            }\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  loadDataDetails( data, group, type ){\n    this.searching = true;\n    var fromDate = this.aggregate ? this.fromDate : new Date( data.year, data.month - 1, data.nwday );\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    toDate = this.aggregate ? toDate : new Date( data.year, data.month -1, data.nwday + 1);\n    var sort = { revenue : -1 };\n    this.statsService.getDataDailyRevenueDetails(  fromDate, toDate, this.query, group, this.showBadDebt, sort ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                //var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                if(type === 'fullreport'){\n                   this.datadetails.push( {  \n                                          network : data._id.network , subid : data._id.subid, originating_domain : data._id.originating_domain, domain : data._id.domain, \n                                          channel : data._id.channel, sub_channel : data._id.sub_channel, utm_medium: data._id.utm_medium, utm_campaign: data._id.utm_campaign, offer : data._id.offer, \n                                          audience: data._id.audience, utm_content: data._id.utm_content, utm_source: data._id.utm_source, day : group.group_name === '$sub_id_sub_channel' ? \"\" : data._id.group_name, \n                                          impressions : data.impressions, visitors: data.visitors, avenue_domain : data._id.avenue_domain, \n                                          active_view : this.fixNumberFormat(data.active_view, 1), page_views: data.page_views, \n                                          impressions_rpm: this.fixNumberFormat(data.impressions_rpm, 2), page_rpm: this.fixNumberFormat(data.page_rpm, 2), \n                                          revenue : this.fixNumberFormat(data.revenue, 2), gross_revenue : this.fixNumberFormat(data.gross_revenue, 2), \n                                          net_revenue : this.fixNumberFormat(data.net_revenue, 2), clicks : data.clicks, ad_clicks : data.ad_clicks, \n                                          rpc : this.fixNumberFormat(data.rpc, 4), ad_requests: data.ad_requests, ad_impressions: data.ad_impressions, \n                                          coverage: this.fixNumberFormat(data.coverage, 2), page_ctr : this.fixNumberFormat(data.page_ctr, 2), \n                                          ad_request_ctr : this.fixNumberFormat(data.ad_request_ctr, 2), matched_ad_ctr : this.fixNumberFormat(data.matched_ad_ctr, 2),\n                                          ctr: this.fixNumberFormat(data.ctr, 2), ad_ctr: this.fixNumberFormat(data.ad_ctr, 2), \n                                          ad_request_rpm: this.fixNumberFormat(data.ad_request_rpm, 2), impression_rpm: this.fixNumberFormat(data.impression_rpm, 2),\n                                          conversions: data.conversions, ad_rpm: this.fixNumberFormat(data.ad_rpm, 2), cpc: this.fixNumberFormat(data.cpc, 2)\n                                        } );\n                }else{\n                   this.datadetails.push( {  \n                                          network : type === 'network' ? data._id.group_name : ( type === 'day' ? data._id.network : '' )  , \n                                          originating_domain : type === 'originating_domain' ? data._id.group_name : '',\n                                          domain : type === 'domain' ? data._id.group_name : '', \n                                          avenue_domain : type === 'avenue_domain' ? data._id.group_name : '', \n                                          channel : type === 'channel' ? data._id.group_name : ( type === 'dayreport' ? data._id.channel : '' ),\n                                          sub_channel : type === 'sub_channel' ? data._id.group_name : ( type === 'dayreport' ? data._id.sub_channel : '' ),\n                                          utm_medium : type === 'utm_medium' ? data._id.group_name : ( type === 'day' ? data._id.utm_medium : '' ),\n                                          utm_campaign : type === 'utm_campaign' ? data._id.group_name : ( type === 'day' ? data._id.utm_campaign : '' ),\n                                          offer : type === 'offer' ? data._id.group_name : ( type === 'day' ? data._id.offer : '' ) ,\n                                          audience : type === 'audience' ? data._id.group_name : ( type === 'day' ? data._id.audience : '' ),\n                                          utm_content : type === 'utm_content' ? data._id.group_name : ( type === 'day' ? data._id.utm_content : '' ),\n                                          utm_source : type === 'utm_source' ? data._id.group_name : ( type === 'day' ? data._id.utm_source : '' ),\n                                          day : (type === 'day' || type === 'dayreport') ? data._id.group_name : '' , \n                                          revenue : this.fixNumberFormat(data.revenue, 2), gross_revenue : this.fixNumberFormat(data.gross_revenue, 2), \n                                          net_revenue : this.fixNumberFormat(data.net_revenue, 2), clicks : data.clicks, ad_clicks : data.ad_clicks, \n                                          rpc : this.fixNumberFormat(data.rpc, 4), ad_requests: data.ad_requests, ad_impressions: data.ad_impressions, \n                                          coverage: this.fixNumberFormat(data.coverage, 2), page_ctr : this.fixNumberFormat(data.page_ctr, 2),\n                                          ad_request_ctr : this.fixNumberFormat(data.ad_request_ctr, 2), matched_ad_ctr : this.fixNumberFormat(data.matched_ad_ctr, 2),\n                                          ctr: data.ctr, ad_ctr: this.fixNumberFormat(data.ad_ctr, 2), ad_request_rpm: this.fixNumberFormat(data.ad_request_rpm, 2),\n                                          impressions : data.impressions, impression_rpm: this.fixNumberFormat(data.impression_rpm, 2), conversions: data.conversions,\n                                          ad_rpm: this.fixNumberFormat(data.ad_rpm, 2), cpc: this.fixNumberFormat(data.cpc, 2)\n                                         } );\n                }\n            }else{\n              console.log('empty');\n            }\n        });\n        this.searching = false;\n        data.details = this.datadetails;\n    });\n\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n}\n\n  loadChannels(){\n    this.channels.push( { id: 1, name : 'All channels', key : '' } );\n    this.channel = this.channels[0];\n    this.settingsService.getChannels().then(response => {\n      const channelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      channelsFromResponse.forEach( (channel: any) => {\n        if (channel.name !== \"All channels\") {\n          this.channels.push(channel);\n        }\n      })\n    });\n  }\n\n  loadCampaigns(){\n    this.campaigns.push( { id: 1, name : 'All campaigns', key : '' } );\n    this.campaign = this.campaigns[0];\n    //TODO: ADD getCampaigns method in settingsService\n  }  \n\n  loadSubChannels(){\n    this.subChannels.push( { id: 1, name : 'All sub channels', key : '' } );\n    this.subChannel = this.subChannels[0];\n    this.settingsService.getSubChannels().then(response => {\n      const subChannelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      subChannelsFromResponse.forEach( (subChannel: any) => {\n        if (subChannel.name !== \"All sub channels\") {\n          this.subChannels.push(subChannel);\n        }\n      })\n    });\n  }  \n\n  loadDomains(){\n    this.domains.push( { id: 1, name : 'All domains', key : '' } );\n    this.domain = this.domains[0];\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.domains.push(domain);\n        }\n      })      \n    });\n  }\n\n  loadOriginatingDomains(){\n    this.originatingDomains.push( { id: 1, name : 'All domains', key : '' } );\n    this.originatingDomain = this.originatingDomains[0];\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.originatingDomains.push(domain);\n        }\n      })      \n    });\n  }  \n\n  loadNetworks(){\n    this.networks.push( { id: 1, name : 'All networks', key : '' } );\n    this.network = this.networks[0];\n    this.settingsService.getNetworks().then(response => { \n      const networksFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      networksFromResponse.forEach( (network: any) => {\n        if (network.name !== \"All networks\") {\n          this.networks.push(network);\n        }\n      })\n    });\n  }\n\n  loadAudiences () {\n    this.audiences.push( { id: 1, name : 'All signals', key : '' } );\n    this.audience = this.audiences[0];\n    this.settingsService.getAudiences().then(response => { \n      const audiencesFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      audiencesFromResponse.forEach( (audience: any) => {\n        idCounter += 1;\n        audience.id = idCounter;\n        if (audience.name !== \"All signals\") {\n          this.audiences.push(audience);\n        }\n      })\n    });\n  }  \n\n  loadReportColumns() {\n    var type = 'report_columns';\n    var name = this.network.name;\n    this.settingsService.getReportColumns(type, name).then(response => { \n      this.columns = response;\n      if(!this.fulldetailreport){\n        // Remove Sub Id column\n        if (this.channelkey !== 'SMS') {\n          var index = this.columns.indexOf(\"Sub Id\");\n          if (index !== -1) {\n            this.columns.splice(index, 1);\n          }\n        }\n      }\n    });\n  }\n\n  loadOffers(){\n    this.offers.push( { id: 1, name : 'All offers', key : '' } );\n    this.offer = this.offers[0].name;\n\n    this.settingsService.getOffers( ).then(response => { \n        var index = 2;\n        for( var i = 2; i < 300; i++ ){\n          var offer = response.data[ ( \"000\" + i ).slice(-3) ];\n          if( offer != undefined ){\n            this.offers.push( { id: index, name : offer, key : offer  } );\n            index++;\n          }\n        }\n    });\n  }\n\n  splitAvenueDomainValue(pStr){\n    var indexOfSlash = pStr.indexOf('/');\n    if(indexOfSlash !== -1){\n      return pStr.slice(0, indexOfSlash);\n    }\n    else{\n      return \"\";\n    }\n  }\n\n  checkErrors(){\n    this.settingsService.getNetworkErrors().then(response => { \n      this.networkErrors = response.data;\n      this.networkError = (this.networkErrors.length > 0)\n    });\n  }\n\n  checkDelays(){\n    this.networksService.networksWithdelay().then(response => { \n      this.networkDelay = (response.length > 0)\n    });\n  }\n\n  onChangeSubid(){\n    this.onChangeSubIdAux();\n    this.loadData();\n  }\n\n  onChangeSubIdAux() {\n    if (this.subidfilter != '') {\n      this.query.sub_id = { $regex : this.subidfilter, $options: 'i' }\n    } else{\n      delete this.query.sub_id;\n    }\n    this.checkFullDetailReport();\n  }  \n\n  downloadDayxreport(){\n    var csv = 'Date, Source Domain, Domain, Channel, Network, Clicks, Gross Revenue, Net Revenue\\n';\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    var query = (this.day == '' )?{}: { sub_id_day : parseInt(this.day) }\n    this.statsService.getDayxreport(  fromDate, toDate, query ).then(response => { \n      response.forEach( (row: any) => {\n        var source_domain = row._id.originating_domain !== null && row._id.originating_domain !== undefined ? row._id.originating_domain : \"\" ;\n        var domain = row._id.domain !== null && row._id.domain !== undefined ? row._id.domain : \"\" ;\n        var datestr = row._id.nw_dt_month + '/' + row._id.nw_dt_day + '/' + row._id.nw_dt_year;\n        csv += datestr + ',' + source_domain + ',' + domain + ',' + row._id.channel + ',' + row._id.network + ',' + row.clicks + ',' + row.revenue + ',' + row.net_revenue + '\\n'\n      })\n      var blob = new Blob([csv], { type: 'text/csv' });\n      var url= window.URL.createObjectURL(blob);\n      var anchor = document.createElement(\"a\");\n      anchor.download = 'day-x-report.csv';\n      anchor.href = url;\n      anchor.click();  \n    });\n  }\n\n  downloadSubChannelDayReport(){\n    var csv = 'Date, Channel, SubChannel, Network, Clicks, Gross Revenue, Net Revenue\\n';\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    var query = (this.day == '' )?{}: { sub_id_day : parseInt(this.day) }\n    this.statsService.getSubChannelDayReport(  fromDate, toDate, query ).then(response => { \n      response.forEach( (row: any) => {\n        var datestr = row._id.nw_dt_month + '/' + row._id.nw_dt_day + '/' + row._id.nw_dt_year;\n        csv += datestr + ',' + row._id.channel + ',' + row._id.sub_channel + ',' + row._id.network + ',' + row.clicks + ',' + row.revenue + ',' + row.net_revenue + '\\n'\n      })\n      var blob = new Blob([csv], { type: 'text/csv' });\n      var url= window.URL.createObjectURL(blob);\n      var anchor = document.createElement(\"a\");\n      anchor.download = 'sub-channel-day-report.csv';\n      anchor.href = url;\n      anchor.click();  \n    });\n  }  \n\n  private reportColumnsToString() {\n    var reportColumnsAsStr = \"\";\n    this.columns.forEach(function(column){\n      reportColumnsAsStr += column.toLowerCase().replace(\" \", \"_\");\n      reportColumnsAsStr += \",\";\n    });\n    // Remove last comma\n    if(reportColumnsAsStr.length >= 1) {\n      reportColumnsAsStr = reportColumnsAsStr.slice(0, -1);\n    }\n    // Change sub_id value to subid\n    reportColumnsAsStr = reportColumnsAsStr.replace(\"sub_id\", \"subid\");\n    reportColumnsAsStr = reportColumnsAsStr.replace(\"source_domain\", \"originating_domain\");\n    return reportColumnsAsStr;\n  }\n\n  private getColumnValue(pRow, pColumnName){\n    if(pColumnName === \"ctr\") {\n      return (pRow.ctr == undefined ? '': this.calculateGrossCtr(pRow) );\n    }\n    if(pColumnName === \"ad_ctr\") {\n      return (pRow.ad_ctr == undefined ? '': this.calculateAdCtr(pRow) );\n    }\n    if(pColumnName === \"rpc\") {\n      return (pRow.rpc == undefined ? '': this.calculateRPC(pRow) );\n    }\n    if(pColumnName === \"rpm\") {\n      return (pRow.rpm == undefined ? '': this.calculateRPM(pRow) );\n    }\n    if(pColumnName === \"vpr\") {\n      return (pRow.vpr == undefined ? '': this.calculateVPR(pRow) );\n    }\n    if(pColumnName === \"conversion\") {\n      return (pRow.conversions == undefined ? '': this.calculateConversion(pRow) );\n    }\n    else{\n      return ( pRow[pColumnName] == undefined ? '': pRow[pColumnName] );\n    }          \n  }\n\n  downloadMain(){\n    // var csv = 'date,day,network,domain,channel,sub_channel,campaign_name,offer,gross_revenue,net_revenue,clicks,rpc\\n';\n    var csv = this.reportColumnsToString();\n    var headerArr = csv.split(\",\");\n    csv += \"\\n\";\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        var csvRow = \"\";\n        for(var currentColumn = 0; currentColumn < headerArr.length; currentColumn++) {\n          if (currentColumn+1 === headerArr.length) {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + '\\n';\n          }\n          else {\n            csvRow += this.getColumnValue(row, headerArr[currentColumn]) + ',';\n          }\n        }\n        csv += csvRow;\n    });\n\n\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  _downloadDetails(){\n    var csv = 'date,day,network,domain,channel,sub_channel,offer,gross_revenue,net_revenue,clicks,rpc,conversions\\n';\n    var datareport = (this.datadetails)? this.datadetails : this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.date + ',' + row.day + ',' + row.network + ',' + row.domain + ',' + row.channel + ',' + row.sub_channel + ',' + row.offer + ',' + row.revenue + ',' + row.net_revenue + ',' + row.clicks + ',' + row.rpc + ',' + row.conversions + '\\n';\n    });\n  }\n\n  downloadDetails(){\n    this.searching = true;\n    var group = { nw_dt_year : '$nw_dt_year', nw_dt_month : '$nw_dt_month', nw_dt_day : '$nw_dt_day',\n                  group_name : '$sub_id_day', offer : '$sub_id_offer', subid : '$sub_id', network : '$network_name', \n                  channel : '$sub_id_channel', sub_channel : '$sub_id_sub_channel', utm_medium : '$sub_id_utm_medium', \n                  utm_campaign : '$sub_id_utm_campaign', utm_content : '$sub_id_utm_content', utm_source : '$sub_id_utm_source',\n                  originating_domain : '$sub_id_originating_domain', \n                  domain : '$sub_id_domain', impressions : '$impressions', ad_impressions : '$ad_impressions',\n                  page_rpm : '$page_rpm', active_view : '$active_view', page_views : '$page_views', conversions : '$conversions' };\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.statsService.getDataDailyRevenueDetails(  fromDate, toDate, this.query, group, this.showBadDebt, {} ).then(response => { \n        var fulldatadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null) {\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                   var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                   fulldatadetails.push( {  \n                                          date : datestr,\n                                          network : data._id.network , \n                                          subid : data._id.subid, \n                                          originating_domain : data._id.originating_domain,\n                                          domain : data._id.domain,\n                                          channel : data._id.channel,\n                                          sub_channel : data._id.sub_channel,\n                                          utm_medium : data._id.utm_medium,\n                                          utm_campaign : data._id.utm_campaign,\n                                          utm_content : data._id.utm_content,\n                                          utm_source : data._id.utm_source,\n                                          offer : data._id.offer, \n                                          day : data._id.group_name,\n                                          impressions : data._id.impressions,\n                                          ad_impressions : data._id.ad_impressions,\n                                          page_rpm : data._id.page_rpm,\n                                          active_view : this.fixNumberFormat(data._id.active_view, 1),\n                                          page_views : data._id.page_views,\n                                          revenue : this.fixNumberFormat(data.revenue, 2),\n                                          gross_revenue : this.fixNumberFormat(data.gross_revenue, 2),\n                                          net_revenue : this.fixNumberFormat(data.net_revenue, 2),\n                                          clicks : data.clicks,\n                                          ad_clicks : data.ad_clicks,\n                                          ctr : '',\n                                          ad_ctr : '',\n                                          rpm : '',\n                                          vpr : '',\n                                          conversions : data.conversions,\n                                          rpc : this.fixNumberFormat(data.rpc, 4) } );\n            }else{\n              console.log('empty');\n            }\n        });\n        var csv = this.reportColumnsToString();\n        var headerArr = csv.split(\",\");\n        csv += \"\\n\";\n        csv = this.getReadyAdSenseReport(fulldatadetails, csv, headerArr);\n\n        var blob = new Blob([csv], { type: 'text/csv' });\n        var url= window.URL.createObjectURL(blob);\n        var anchor = document.createElement(\"a\");\n        anchor.download = 'detail-report.csv';\n        anchor.href = url;\n        anchor.click();\n        \n        this.searching = false;\n    });\n\n  }\n\n  getReadyAdSenseReport(fulldatadetails, pCsv, pHeaderArr){\n    fulldatadetails.forEach( (row: any) =>{\n      var csvRow = \"\";\n      for(var currentColumn = 0; currentColumn < pHeaderArr.length; currentColumn++) {\n        if (currentColumn+1 === pHeaderArr.length) {\n          csvRow += this.getColumnValue(row, pHeaderArr[currentColumn]) + '\\n';\n        }\n        else {\n          csvRow += this.getColumnValue(row, pHeaderArr[currentColumn]) + ',';\n        }\n      }\n      pCsv += csvRow;\n    });\n    return pCsv;\n  }\n\n  getReadyNormalReport(fulldatadetails, pCsv){\n    fulldatadetails.forEach( (row: any) =>{\n      pCsv += row.date + ',' + \n             (row.day == undefined ? '': row.day ) + ',' + \n             (row.subid == undefined ? '': row.subid ) + ',' + \n             (row.network == undefined ? '': row.network ) + ',' + \n             (row.domain == undefined ? '': row.domain ) + ',' + \n             (row.channel == undefined ? '': row.channel ) + ',' + \n             (row.sub_channel == undefined ? '': row.sub_channel ) + ',' +\n             (row.offer == undefined ? '': row.offer ) + ',' + \n             (row.revenue == undefined ? '': row.revenue ) + ',' +\n             (row.net_revenue == undefined ? '': row.net_revenue ) + ',' +\n             (row.clicks == undefined ? '': row.clicks ) + ',' + \n             (row.rpc == undefined ? '': row.rpc ) + '\\n'; \n    });\n    return pCsv;\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  checkFullDetailReport() {\n    if (this.subidfilter != '') {\n      this.fulldetailreport = true;\n    }\n    else if( this.networkkey != 'tonic' && this.networkkey != '' ){\n      this.fulldetailreport = true;\n    } else {\n      if( this.channelkey === '' || this.channelkey == 'SMS' ){\n        if(this.domainkey == 'NO-DOMAIN')\n          this.fulldetailreport = true;\n        else if (this.channelkey === '' && this.subChannelkey != '') {\n            this.fulldetailreport = true;\n        }\n        else\n          this.fulldetailreport = false;\n      }\n\n      else \n        this.fulldetailreport = true;\n    }\n    this.loadReportColumns();\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  onChangeOffer(value: any) {\n        value = value - 1;\n        this.offer = this.offers[value].name;\n        this.offerkey = this.offers[value].key;        \n        this.checkFullDetailReport();\n\n        if(this.offers[value].key === '')\n          delete this.query.sub_id_offer\n        else\n          this.query.sub_id_offer = this.offers[value].key;\n        this.loadData();\n  }\n\n  onChangeChannel(value: any) {\n        delete this.query.$or;\n        \n        this.channel = this.channels.filter(x => x.id === value)[0];\n        this.channelkey = this.channel.key;        \n        this.checkFullDetailReport();\n\n        if(this.channel.key === '')\n          delete this.query.sub_id_channel\n        else{\n          if (this.channel.name == 'PUSH/SMS/EMAIL')\n            this.query.sub_id_channel = { $in : this.channel.key };\n          if (this.channel.name == 'NO-CHANNEL') {\n            delete this.query.sub_id_channel;\n            var newQuery = { $or: [ { \"sub_id_channel\":{\"$exists\":false} }, { \"sub_id_channel\": \"\"} ] };\n            this.query = Object.assign({}, newQuery, this.query);\n          }\n          else \n            this.query.sub_id_channel = this.channel.key;        \n        }\n        this.loadData();\n  }\n\n  onChangeSubChannel(value: any) {\n    this.subChannel = this.subChannels.filter(x => x.id === value)[0];\n    this.subChannelkey = this.subChannel.key;\n    this.checkFullDetailReport();\n\n    if(this.subChannel.key === '')\n      delete this.query.sub_id_sub_channel;\n    else{\n      this.query.sub_id_sub_channel = this.subChannel.key;\n    }\n    this.loadData();\n}  \n\n  onChangeDomain(value: any) {\n        this.domain = this.domains.filter(x => x.id === value)[0];\n        this.domainkey = this.domain.key;        \n        this.checkFullDetailReport();\n\n        if(this.domain.key === '')\n          delete this.query.sub_id_domain\n        else{\n          if(this.domain.key == 'NO-DOMAIN')\n            this.query.sub_id_domain = { $exists : false };\n          else\n            this.query.sub_id_domain = this.domain.key;\n        }\n        this.loadData();\n  }\n\n  onChangeOriginatingDomain(value: any) {\n    this.originatingDomain = this.domains.filter(x => x.id === value)[0];\n    this.originatingDomainkey = this.domain.key;        \n    this.checkFullDetailReport();\n\n    if(this.originatingDomain.key === '')\n      delete this.query.sub_id_originating_domain\n    else{\n      if(this.originatingDomain.key == 'NO-DOMAIN')\n        this.query.sub_id_originating_domain = { $exists : false };\n      else\n        this.query.sub_id_originating_domain = this.originatingDomain.key;\n    }\n    this.loadData();\n}  \n\n  onChangeNetwork(value: any) {\n        this.network = this.networks.filter(x => x.id === value)[0];\n        this.networkkey = this.network.key;        \n        this.checkFullDetailReport();\n\n        if(this.network.key === ''){\n          delete this.query.network_name;\n        }\n        else {\n          this.query.network_name = this.network.key;\n        }\n        this.loadReportColumns();\n        this.loadData();\n  }\n\n  onChangeAudience(value: any) {\n    this.audience = this.audiences.filter(x => x.id === value)[0];\n    this.audiencekey = this.audience.key;\n\n    if(this.audience.key === '') {\n      delete this.query.sub_id_audience;\n    }\n    else {\n      if(this.audience.name === \"NO-SIGNAL\") {\n        this.query.sub_id_audience = { $exists : false };\n      }\n      else {\n        this.query.sub_id_audience = this.audience.name;\n      }\n    }\n    this.loadData();\n}  \n      \n  private pressEnter = true;\n  private lastday = '';\n  onKeyup(event){\n        if( this.day != this.lastday )\n          this.pressEnter = false;\n        this.lastday = this.day;\n  }\n\n  onChangeAge(){\n        this.pressEnter = true;\n        this._onChangeAge();\n        this.loadData();\n  }\n\n  _onChangeAge(){\n    if( this.day != '' )\n      this.query.sub_id_day = parseInt(this.day);\n    else\n      delete this.query.sub_id_day;\n  }\n\n  onChangeAggregate(){\n    //this.aggregate = !this.aggregate;\n        this.loadData();\n  }\n\n  onChangeBadDebt(){\n    this.loadData();\n  }\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.checkFullDetailReport();\n        this.loadData();\n  }\n\n  showDayDetails( data: any, group : any ) {\n    if(this.dayreport){\n      this.showDetails( data, { group_name : '$sub_id_day', channel : '$sub_id_channel', sub_channel : '$sub_id_sub_channel' }, 'dayreport' )\n    } else {\n      this.showDetails( data, { group_name : '$sub_id_day', network : '$network_name', offer : '$sub_id_offer' }, 'day' )\n    }\n  }\n\n\n  showDetails( data: any, group : any, type : any ) {\n    if( !data.showdetails ){ // open details\n      this.loadDataDetails( data, group, type );\n    }\n    data.showdetails = !data.showdetails;\n  }\n\n  private initRange(){\n    \n    this.loadChannels();\n    this.loadSubChannels();\n    this.loadCampaigns();\n    this.loadDomains();\n    this.loadOriginatingDomains();\n    this.loadNetworks();\n    this.loadAudiences();\n    this.loadReportColumns();\n    \n\n    this.loadOffers();\n\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    \n    this.dates.push( { id: 1, name : 'Yesterday', fromDate : this.fromDate, toDate: this.toDate } );\n    // -7 is last 7 days\n    var day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 6 );\n    this.dates.push( { id: 2, name : 'Last 7 days', fromDate : day, toDate: this.toDate } );\n    // -30 is last 30 days\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 29 );\n    this.dates.push( { id: 3, name : 'Last 30 days', fromDate : day, toDate: this.toDate } );\n    // -90 is last 3 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 89 );\n    this.dates.push( { id: 4, name : 'Last 3 months', fromDate : day, toDate: this.toDate } );\n    // -365 days last 12 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 364 );\n    this.dates.push( { id: 5, name : 'Last 12 months', fromDate : day, toDate: this.toDate } );\n\n  }\n\n  public computeImpressionsRpm(pRevenue: number, pImpressions: number){\n    if(pRevenue !== 0 && pImpressions !== 0){\n      var firstResult = (pRevenue / pImpressions);\n      return  (firstResult * 1000).toFixed(2);\n    }\n    else{\n      return 0;\n    }\n  }\n\n  public computePageRpm(pRevenue: number, pPageViews: number){\n    if(pRevenue !== 0 && pPageViews !== 0){\n      var firstResult = (pRevenue / pPageViews)\n      return (firstResult * 1000).toFixed(2);\n    }\n    else{\n      return 0;\n    }\n  }\n\n  public basicDivision (pNumerator: number, pDenominator: number) {\n    if(pNumerator !== 0 && pDenominator !== 0){\n      var firstResult = (pNumerator / pDenominator)\n      return (firstResult * 1000).toFixed(2);\n    }\n    else{\n      return 0;\n    }    \n  }\n  \n\n  public computeNetRevenue(networkName, revenue){\n    if(networkName === \"Zeta Push\"){\n      return revenue * 0.6;\n    }\n    if(networkName === \"Rev Track 3P\"){\n      return revenue * 0.5;\n    }\n    if(networkName === \"Madrivo 3P\"){\n      return revenue * 0.5;\n    }\n    else{\n      return revenue;\n    }\n  }\n\n  public calculateGrossCtr(dataDocument){\n    if( dataDocument.hasOwnProperty('clicks') && dataDocument.hasOwnProperty('impressions') ){\n      // (clicks / impressions)*100\n      return this.fixNumberFormat((dataDocument.clicks / dataDocument.impressions)*100, 2) + \"%\";\n    }\n    else{\n      return dataDocument.ctr;\n    }\n  }\n\n  public calculateAdCtr(dataDocument){\n    // payable clicks / payable impressions\n    if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n      return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n    }\n    else{\n      return dataDocument.ad_ctr;\n    }\n  }\n\n  public calculateRPC(dataDocument){\n    var displayNames = [\"Madrivo 3P\", \"Rev Track 3P\"];\n    var valueNames = [\"madrivo3p\", \"revtrack\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return \"\";\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // revenue / ad_clicks\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_clicks') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_clicks), 2);\n      }\n      else{\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n      }\n    }\n    else{\n      return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.clicks), 2);\n    }\n  }\n\n  public calculateRPM(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions) * 1000\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions)*1000, 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n  \n  public calculateVPR(dataDocument){\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (revenue / ad_impressions)\n      if( dataDocument.hasOwnProperty('revenue') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return \"$\" + this.fixNumberFormat((dataDocument.revenue / dataDocument.ad_impressions), 2);\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n\n  public calculateConversion(dataDocument){\n    // var displayNames = [\"7ROI\", \"Ad Mediary\", \"Advatiz\", \"CJ\", \"CX3\", \"Diablo\", \"H2H\", \"Madrivo\", \"Orange Blue\", \"Revenue Ads\", \"W4\"];\n    // var valueNames = [\"roi7\", \"admediary\", \"advatiz\", \"cj\", \"cx3\", \"diablo\", \"h2h\", \"madrivo\", \"orangeblue\", \"revenueads\", \"w4\"];\n    var displayNames = [\"Tonic\", \"Inuvo\"];\n    var valueNames = [\"tonic\", \"inuvo\"];\n    if(displayNames.includes(dataDocument.network) || valueNames.includes(dataDocument.network)){\n      return dataDocument.clicks;\n    }\n    if(dataDocument.network === \"Ad Sense\" || dataDocument.network === \"adsense\"){\n      // (ad_clicks / ad_impressions)\n      if( dataDocument.hasOwnProperty('ad_clicks') && dataDocument.hasOwnProperty('ad_impressions') ){\n        return this.fixNumberFormat((dataDocument.ad_clicks / dataDocument.ad_impressions)*100, 2) + \"%\";\n      }\n      else{\n        return \"N/A\";\n      }\n    }\n    if(dataDocument.hasOwnProperty('conversions')){\n      return dataDocument.conversions;\n    }\n    else{\n      return \"N/A\";\n    }\n  }\n\n  public getFormattedDate(date) {\n    if (date instanceof Date) {\n      var year = date.getFullYear();\n      var month = (1 + date.getMonth()).toString();\n      month = month.length > 1 ? month : month;\n      var day = date.getDate().toString();\n      day = day.length > 1 ? day : day;\n      return year + '-' + month + '-' + day;\n    }\n    else {\n      return date;\n    }\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/revenue-analysis/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport {Router} from '@angular/router';\nimport {StatsService} from '../../../shared/services/stats.service';\n\n@Component({\n  selector: 'dashboard-by-subid',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService]\n})\n\nexport class RevBySubidDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n  \n  private searching: boolean = false;\n  private query: any = { network_type : 'network'};\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private statsService: StatsService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';    \n    this.statsService.getTotalBySubid( this.fromDate, toDate, this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (subid: any) => {\n            if(subid._id != null){\n                this.data.push( { subid: subid._id.sub_id, revenue : subid.total.toFixed(2), clicks : subid.clicks } );\n                this.pagination.totalItems++;\n            }\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'subid,revenue,clicks\\n';\n    this.data.forEach( (row: any) =>{\n        csv += row.subid + ',' + row.revenue + ',' + row.clicks + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.loadData();\n  }\n\n  private initRange(){\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n\n    this.ranges.push( { id: 1, name : 'Yesterday', fromDate : this.fromDate, toDate: this.toDate } );\n\n    // -7 is last 7 days\n    var day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 6 );\n    this.ranges.push( { id: 2, name : 'Last 7 days', fromDate : day, toDate: this.toDate } );\n\n    // -30 is last 30 days\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 29 );\n    this.ranges.push( { id: 3, name : 'Last 30 days', fromDate : day, toDate: this.toDate } );\n\n    // -90 is last 3 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 89 );\n    this.ranges.push( { id: 4, name : 'Last 3 months', fromDate : day, toDate: this.toDate } );\n\n    // -365 days last 12 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 364 );\n    this.ranges.push( { id: 5, name : 'Last 12 months', fromDate : day, toDate: this.toDate } );\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/revenue-by-subid/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { StatsService } from '../../../shared/services/stats.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'revenue-daily',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [StatsService, SettingsService]\n})\n\nexport class RevDailyDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  datadetails: Array<any>;\n  \n  network: any = '';\n  networks: any[] = [];\n  networkId: any = 9;\n\n  domain: any = '';\n  domains: any[] = [];\n  domainId: any = 1;\n\n  channel: any = '';\n  channels: any[] = [];\n  channelId: any = 1;\n  \n  offer: any = '';\n  offers: any[] = [];\n  offerId: any = 1;\n  \n  day: any = '';\n  days: any[] = [];\n  dayId: any = 1;\n\n  dates: any[] = [];\n  dateId: any = 1;\n\n  aggregate: boolean = false;\n\n  private searching: boolean = false;\n  //private query: any = { network_name : 'tonic', sub_id_domain : 'Section 8', sub_id_tech : 'TEXT'};\n  private query: any = { network_name : 'tonic' };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private statsService: StatsService, \n              private settingsService: SettingsService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  private changeDates(value: any) {\n    //console.log('Changed data 1: ', new Date(this.toDate));\n    //console.log('Changed data 2: ', new Date(this.fromDate));\n    //this.toDate = new Date( value.getFullYear(), value.getMonth(), value.getDate() + 1);\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this._loadData();\n    //this.showDetails( { year :  }, { group_name : '$sub_id_day', offer : '$sub_id_offer' }, 'day' );\n  }\n\n  _loadData(){\n    this.searching = true;\n    console.log('Changed data T: ', this.toDate);\n    console.log('Changed data F: ', this.fromDate);\n    this.statsService.getDataDailyRevenue( this.fromDate, this.toDate, this.query, this.aggregate, false ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                this.data.push( { showdetails : false, date: datestr, year: data._id.nw_dt_year, month : data._id.nw_dt_month, nwday : data._id.nw_dt_day, \n                                  network : this.network, domain : this.domain, channel : this.channel, offer : this.offer, day : (this.day != '' ? this.day : 'All days'), \n                                  revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(4) } );\n                this.pagination.totalItems++;\n            }\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  loadDataDetails( day, group, type ){\n    this.searching = true;\n    this.statsService.getDataDailyRevenueDetails( new Date( day.year, day.month - 1, day.nwday ) , new Date( day.year, day.month -1, day.nwday + 1), this.query, group, false, {} ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                console.log('reve = ' + data.revenue + ' ' + data._id.group_name + ' type = ' + type );\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                //var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                this.datadetails.push( {  date : day.date, network : type === 'network' ? data._id.group_name : '' , \n                                          domain : type === 'domain' ? data._id.group_name : '', \n                                          channel : type === 'channel' ? data._id.group_name : '', \n                                          offer : type === 'offer' ? data._id.group_name : ( type === 'day' ? data._id.offer : '' ) , \n                                          day : type === 'day' ? data._id.group_name : '' , \n                                          revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(4) } );\n            }else{\n              console.log('empty');\n            }\n        });\n        this.searching = false;\n        day.details = this.datadetails;\n    });\n\n  }\n\n  loadOffers(){\n    this.offers.push( { id: 1, name : 'All offers', key : '' } );\n    this.offer = this.offers[0].name;\n\n    this.settingsService.getOffers( ).then(response => { \n        var index = 2;\n        for( var i = 2; i < 300; i++ ){\n          var offer = response.data[ ( \"000\" + i ).slice(-3) ];\n          if( offer != undefined ){\n            this.offers.push( { id: index, name : offer, key : offer  } );\n            index++;\n          }\n        }\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'date,day,network,domain,channel,offer,revenue,clicks,rpc\\n';\n    var datareport = (this.datadetails)? this.datadetails : this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.date + ',' + row.day + ',' + row.network + ',' + row.domain + ',' + row.channel + ','  + row.offer + ',' + row.revenue + ',' + row.clicks + ',' + row.rpc + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  onChangeOffer(value: any) {\n        value = value - 1;\n        this.offer = this.offers[value].name;\n        if(this.offers[value].key === '')\n          delete this.query.sub_id_offer\n        else\n          this.query.sub_id_offer = this.offers[value].key;\n        this.loadData();\n  }\n\n  onChangeMedia(value: any) {\n        value = value - 1;\n        this.channel = this.channels[value].name;\n        if(this.channels[value].key === '')\n          delete this.query.sub_id_channel\n        else\n          this.query.sub_id_channel = this.channels[value].key;\n        this.loadData();\n  }\n\n  onChangeDomain(value: any) {\n        value = value - 1;\n        this.domain = this.domains[value].name;\n        if(this.domains[value].key === '')\n          delete this.query.sub_id_domain\n        else\n          this.query.sub_id_domain = this.domains[value].key;\n        this.loadData();\n  }\n\n  onChangeNetwork(value: any) {\n        value = value - 1;\n        this.network = this.networks[value].name;\n        if(this.networks[value].key === '')\n          delete this.query.network_name\n        else\n          this.query.network_name = this.networks[value].key;\n        this.loadData();\n  }\n\n  onChangeAge(){\n        this._onChangeAge();\n        this.loadData();\n  }\n\n  _onChangeAge(){\n    if( this.day != '' )\n      this.query.sub_id_day = parseInt(this.day);\n    else\n      delete this.query.sub_id_day;\n  }\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.loadData();\n  }\n  // showDetails( data, { group_name : '$sub_id_day', offer : '$sub_id_offer' }, 'day' )\n\n  showDetails( data: any, group : any, type : any ) {\n    console.warn('click in details - ' + JSON.stringify(data) );\n    console.warn('         column  - ' + JSON.stringify(group) );\n    if( !data.showdetails ){ // open details\n      this.loadDataDetails( data, group, type );\n    }else\n      this.datadetails = [];\n    data.showdetails = !data.showdetails;\n  }\n\n  private initRange(){\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n    // -1 is yesterday\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1 );\n    \n    this.networks.push( { id: 1, name : 'All networks', key : ''} );\n    this.networks.push( { id: 2, name : 'Ad Mediary', key : 'admediary'} );\n    this.networks.push( { id: 3, name : 'Conduit', key : 'conduit'} );\n    this.networks.push( { id: 4, name : 'CJ', key : 'cj'} );\n    this.networks.push( { id: 5, name : 'Diablo', key : 'diablo'} );\n    this.networks.push( { id: 6, name : 'H2H', key : 'h2h'} );\n    this.networks.push( { id: 7, name : 'Media Alpha', key : 'mediaalpha'} );\n    this.networks.push( { id: 8, name : 'Reliant', key : 'reliant'} );\n    this.networks.push( { id: 9, name : 'Tonic', key : 'tonic'} );\n    this.networks.push( { id: 10, name : 'Valid Click', key : 'validclick'} );\n    this.networks.push( { id: 11, name : 'W4', key : 'w4'} );\n    this.networks.push( { id: 12, name : '7ROI', key : 'roi7' } );\n    this.network = this.networks[8].name;\n\n    this.channels.push( { id : 1, name : 'All channels', key : ''} );\n    this.channels.push( { id : 2, name : 'PATH', key : 'PATH' } );\n    this.channels.push( { id : 3, name : 'SMS', key : 'SMS' } );\n    this.channels.push( { id : 4, name : 'MISC', key : 'MISC' } );\n    this.channels.push( { id : 5, name : 'PUSH', key : 'PUSH' } );\n    this.channels.push( { id : 6, name : 'THANK', key : 'THANK' } );\n    this.channels.push( { id : 7, name : 'EMAIL', key : 'EMAIL' } );\n    this.channels.push( { id : 8, name : 'ONSITE', key : 'ONSITE' } );\n    this.channels.push( { id : 9, name : 'GUIDE', key : 'GUIDE' } );\n    this.channel = this.channels[0].name;\n    \n    this.domains.push( { id: 1, name : 'All domains', key : ''} );\n    this.domains.push( { id: 2, name : 'section-8-housing.org', key : 'section-8-housing.org'} );\n    this.domains.push( { id: 3, name : 'unemploymentclaims.org', key : 'unemploymentclaims.org'} );\n    this.domains.push( { id: 4, name : 'medicaid-help.org', key : 'medicaid-help.org'} );\n    this.domains.push( { id: 5, name : 'medicaid-guide.org', key : 'medicaid-guide.org'} );\n    this.domains.push( { id: 6, name : 'section-8-apartments.org', key : 'section-8-apartments.org'} );\n    this.domains.push( { id: 7, name : 'food-Stamps.com', key : 'food-Stamps.com'} );\n    this.domains.push( { id: 8, name : 'californiafoodstamps.org', key : 'californiafoodstamps.org'} );\n    this.domains.push( { id: 9, name : 'floridafoodstamps.org', key : 'floridafoodstamps.org'} );\n    this.domains.push( { id: 10, name : 'texasfoodstamps.org', key : 'texasfoodstamps.org'} );\n    this.domains.push( { id: 11, name : 'californiaunemployment.org', key : 'californiaunemployment.org'} );\n    this.domains.push( { id: 12, name : 'floridaunemploymentclaims.org', key : 'floridaunemploymentclaims.org'} );\n    this.domains.push( { id: 13, name : 'texas-unemployment.org', key : 'texas-unemployment.org'} );\n    this.domains.push( { id: 14, name : 'texas-benefits.org', key : 'texas-benefits.org'} );\n    this.domain = this.domains[0].name;\n\n    this.loadOffers();\n\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n    \n    // yesterday\n    var fday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1 );\n    var tday = this.toDate;\n    this.dates.push( { id: 1, name : 'Yesterday', fromDate : fday, toDate: tday } );\n    \n    // 2 days ago\n    fday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 2 );\n    tday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1 );\n    this.dates.push( { id: 2, name : '2 days ago', fromDate : fday, toDate: tday } );\n\n    // 3 days ago\n    fday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 3 );\n    tday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 2 );\n    this.dates.push( { id: 3, name : '3 days ago', fromDate : fday, toDate: tday } );\n\n    // 4 days ago\n    fday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 4 );\n    tday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 3 );\n    this.dates.push( { id: 4, name : '4 days ago', fromDate : fday, toDate: tday } );\n\n    // 5 days ago\n    fday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 5 );\n    tday = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 4 );\n    this.dates.push( { id: 5, name : '5 days ago', fromDate : fday, toDate: tday } );\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/revenue-daily/dashboard.component.ts\n **/","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { SpendService } from '../../../shared/services/spend.service';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'spend-analysis',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [SpendService, SettingsService]\n})\n\nexport class SpendAnalysisDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  datadetails: Array<any>;\n  \n  network: any = '';\n  networkkey: any = '';\n  networks: any[] = [];\n  networkId: any = 1;\n\n  domain: any = '';\n  domainkey: any = '';\n  domains: any[] = [];\n  domainId: any = 1;\n\n  aggregate: boolean = true;\n\n  dates: any[] = [];\n  dateId: any = 1;\n\n  fulldetailreport = false;\n\n  LOAD_DRILL_DOWN_DETAILS = \"loadDrillDownDetails\";\n  \n  private searching: boolean = false;\n  private query: any = { };\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n  pagedDetails: Array<any> = [];\n\n  constructor(private spendService: SpendService, \n              private settingsService: SettingsService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this.searching = true;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.spendService.getDataDailySpend( this.fromDate, toDate, this.query, this.aggregate ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                this.data.push( { \n                                  showdetails : false, details : [], date: datestr, year: data._id.nw_dt_year, month : data._id.nw_dt_month, nwday : data._id.nw_dt_day, \n                                  domain : data._id.domain, spend : data.spend.toFixed(2) } );\n                this.pagination.totalItems++;\n            }\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  loadDataDetails( data, group, type ){\n    this.searching = true;\n    var fromDate = this.aggregate ? this.fromDate : new Date( data.year, data.month - 1, data.nwday );\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    toDate = this.aggregate ? this.toDate : new Date( data.year, data.month -1, data.nwday + 1);\n    this.spendService.getDataDailySpendDetails(  fromDate, toDate, this.query, group ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                //var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                if(type === 'fullreport'){\n                   this.datadetails.push( {  network : data._id.vendor , \n                                          domain : data._id.domain, \n                                          spend : data.spend.toFixed(2) } );\n                }else{\n                   this.datadetails.push( {  vendor : type === 'vendor' ? data._id.group_name : '' , \n                                          domain : type === 'domain' ? data._id.group_name : '', \n                                          spend : data.spend.toFixed(2) } );\n                }\n            }else{\n              console.log('empty');\n            }\n        });\n        this.searching = false;\n        data.details = this.datadetails;\n    });\n\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n  }\n\n  loadDomains(){\n    this.domains.push( { id: 1, name : 'All domains', key : '' } );\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.domains.push(domain);\n        }\n      })      \n    });\n  }\n\n\n  loadNetworks(){\n    this.networks.push( { id: 1, name : 'All vendors', key : '' } );\n    this.network = this.networks[0].name;\n    this.settingsService.getSpendNetworks().then(response => { \n      this.networks = response.data;\n      this.network = this.networks[0].name;\n    });\n  }\n\n  downloadMain(){\n    var csv = 'date,domain,spend\\n';\n    var datareport = this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.date + ',' + row.domain + ',' + row.spend + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'main-report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  _downloadDetails(){\n    var csv = 'date,day,vendor,domain,channel,offer,revenue,clicks,rpc\\n';\n    var datareport = (this.datadetails)? this.datadetails : this.data;\n    datareport.forEach( (row: any) =>{\n        csv += row.date + ',' + row.day + ',' + row.vendor + ',' + row.domain + ',' + row.channel + ','  + row.offer + ',' + row.revenue + ',' + row.clicks + ',' + row.rpc + '\\n';\n    });\n  }\n\n  downloadDetails(){\n    this.searching = true;\n    var group = { nw_dt_year : '$nw_dt_year', nw_dt_month : '$nw_dt_month', nw_dt_day : '$nw_dt_day',\n                  vendor : '$vendor',  domain : '$domain' };\n    var fromDate = this.fromDate;\n    var toDate = typeof this.toDate == 'object'? this.toDate : this.toDate + ' 23:59:59.999';\n    this.spendService.getDataDailySpendDetails(  fromDate, toDate, this.query, group ).then(response => { \n        var fulldatadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n                //var datestr = moment(data._id.network_datetime).format('MM/DD/YYYY');\n                   var datestr = data._id.nw_dt_month + '/' + data._id.nw_dt_day + '/' + data._id.nw_dt_year;\n                   fulldatadetails.push( {  \n                                          date : datestr,\n                                          vendor : data._id.vendor , \n                                          subid : data._id.subid, \n                                          domain : data._id.domain, \n                                          channel : data._id.channel, \n                                          offer : data._id.offer, \n                                          day : data._id.group_name, \n                                          revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(4) } );\n            }else{\n              console.log('empty');\n            }\n        });\n        var csv = 'date,day,subid,vendor,domain,channel,offer,revenue,clicks,rpc\\n';\n        fulldatadetails.forEach( (row: any) =>{\n            csv += row.date + ',' + \n                   (row.day == undefined ? '': row.day ) + ',' + \n                   (row.subid == undefined ? '': row.subid ) + ',' + \n                   (row.vendor == undefined ? '': row.vendor ) + ',' + \n                   (row.domain == undefined ? '': row.domain ) + ',' + \n                   (row.channel == undefined ? '': row.channel ) + ',' + \n                   (row.offer == undefined ? '': row.offer ) + ',' + \n                   (row.revenue == undefined ? '': row.revenue ) + ',' + \n                   (row.clicks == undefined ? '': row.clicks ) + ',' + \n                   (row.rpc == undefined ? '': row.rpc ) + '\\n'; \n        });\n        var blob = new Blob([csv], { type: 'text/csv' });\n        var url= window.URL.createObjectURL(blob);\n        var anchor = document.createElement(\"a\");\n        anchor.download = 'detail-report.csv';\n        anchor.href = url;\n        anchor.click();\n        \n        this.searching = false;\n    });\n\n  }\n\n  loadDrillDownDetails( pData, query, group ){\n    this.searching = true;\n    var fromDate = new Date( pData.year, pData.month - 1, pData.nwday );\n    var toDate = new Date( pData.year, pData.month -1, pData.nwday + 1);\n    this.spendService.getDataDailySpendDetails(  fromDate, toDate, query, group ).then(response => { \n        this.datadetails = [];\n        \n        response.forEach( (data: any) => {\n            if(data._id != null){\n              this.datadetails.push( {  showdetails: false, \n                                        details: [], \n                                        date: pData.date, \n                                        year: pData.year, \n                                        month: pData.month, \n                                        nwday: pData.nwday, \n                                        domain : data._id.domain, \n                                        source: data._id.network_name,\n                                        campaign: data._id.campaign,\n                                        keyword: data._id.search_keyword,\n                                        spend : data.spend.toFixed(2) \n                                      } \n                                    );\n            }else{\n              console.log('empty');\n            }\n        });\n        this.searching = false;\n        pData.details = this.datadetails;\n    });\n\n  }\n\n  public loadLevel1ClickFunc(pData) {\n    if ( !this.aggregate ) {\n      if( !pData.showdetails ){\n        var groupBy = { domain : \"$domain\", network_name : \"$network_name\" };\n        var detailsQuery = { domain : pData.domain };\n        this.loadDrillDownDetails(pData, detailsQuery, groupBy);\n        pData.showdetails = !pData.showdetails;\n      }\n      else{\n        pData.showdetails = !pData.showdetails;\n      }      \n    }\n  }\n\n  public loadLevel2ClickFun(pDataL1) {\n    if( !pDataL1.showdetails ){\n      var groupBy = { domain : \"$domain\", network_name : \"$network_name\", campaign : \"$campaign\" };\n      var detailsQuery = { domain : pDataL1.domain, network_name: pDataL1.source };\n      this.loadDrillDownDetails( pDataL1, detailsQuery, groupBy );\n      pDataL1.showdetails = !pDataL1.showdetails;\n    }\n    else{\n      pDataL1.showdetails = !pDataL1.showdetails;\n    }\n  }\n\n  public loadLevel3ClickFun(pDataL2) {\n    if( !pDataL2.showdetails ) {\n      var groupBy = { domain : \"$domain\", network_name : \"$network_name\", campaign : \"$campaign\", search_keyword : \"$search_keyword\" };\n      var detailsQuery = { domain : pDataL2.domain, network_name: pDataL2.source, campaign: pDataL2.campaign };\n      this.loadDrillDownDetails(pDataL2, detailsQuery, groupBy);\n      pDataL2.showdetails = !pDataL2.showdetails;\n    }\n    else{\n      pDataL2.showdetails = !pDataL2.showdetails;\n    }\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  onChangeDomain(value: any) {\n        value = value - 1;\n        this.domain = this.domains[value].name;\n        this.domainkey = this.domains[value].key;        \n\n        if(this.domains[value].key === '')\n          delete this.query.domain\n        else\n          this.query.domain = this.domains[value].key;\n        this.loadData();\n  }\n\n  onChangeNetwork(value: any) {\n        value = value - 1;\n        this.network = this.networks[value].name;\n        this.networkkey = this.networks[value].key;        \n\n        if(this.networks[value].key === '')\n          delete this.query.vendor\n        else\n          this.query.vendor = this.networks[value].key;\n        this.loadData();\n  }\n\n  onChangeAggregate(){\n    //this.aggregate = !this.aggregate;\n        this.loadData();\n  }\n\n\n  onDatesChange(value: any) {\n        value = value - 1;\n        this.fromDate = this.dates[value].fromDate;\n        this.toDate = this.dates[value].toDate;\n        this.loadData();\n  }\n\n  showDetails( data: any, group : any, type : any ) {\n    console.warn('         column  - ' + JSON.stringify(group) );\n    if( !data.showdetails ){ // open details\n      this.loadDataDetails( data, group, type );\n    }\n    data.showdetails = !data.showdetails;\n  }\n\n  private initRange(){\n    \n    this.loadDomains();\n    this.loadNetworks();\n\n    // -1 is yesterday 23:59:59\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1, 23, 59, 59, 999 );\n    // -1 is yesterday 00:00:00\n    this.fromDate = new Date( this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate() - 1 );\n    \n    this.dates.push( { id: 1, name : 'Yesterday', fromDate : this.fromDate, toDate: this.toDate } );\n    // -7 is last 7 days\n    var day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 6 );\n    this.dates.push( { id: 2, name : 'Last 7 days', fromDate : day, toDate: this.toDate } );\n    // -30 is last 30 days\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 29 );\n    this.dates.push( { id: 3, name : 'Last 30 days', fromDate : day, toDate: this.toDate } );\n    // -90 is last 3 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 89 );\n    this.dates.push( { id: 4, name : 'Last 3 months', fromDate : day, toDate: this.toDate } );\n    // -365 days last 12 months\n    day = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 364 );\n    this.dates.push( { id: 5, name : 'Last 12 months', fromDate : day, toDate: this.toDate } );\n\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/spend-analysis/dashboard.component.ts\n **/","import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { SettingsService } from '../../../shared/services/settings.service';\nimport * as moment from 'moment';\nimport { MdlDialogService } from 'angular2-mdl';\nimport { MdlDialogComponent } from 'angular2-mdl';\nimport { MdlSnackbarService } from 'angular2-mdl';\nimport { NetworksService } from '../../../shared/services/networks.service';\n\n@Component({\n  selector: 'dashboard-subids',\n  template: require('./dashboard.component.html'),\n  styles: [require('./dashboard.component.css')],\n  providers: [SettingsService, NetworksService]\n})\n\nexport class SubidsDashboardComponent implements OnInit {\n  \n  @ViewChild(MdlDialogComponent) editUserDialog:MdlDialogComponent;\n  @ViewChild(MdlDialogComponent) ediConfirmationPwdDialog:MdlDialogComponent;\n\n  data: Array<any>;\n  network: any = '';\n  networkkey: any = '';\n  networks: any[] = [];\n  networkId: any = 1;\n  selectedSubIDsCounter: any = 0;\n  \n  private searching: boolean = false;\n  private displayFullView: boolean = false;\n  private showEditSubIdDialog: boolean = false;\n  private query: any = { type : 'subid', active : false };\n  public subid: any = {};\n  public subidfilter: '';\n  public daysback: '';\n\n  pagination = { currentPage: 1, itemsPerPage: 10, totalItems: 24};\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n  pagedData: Array<any> = [];\n  bulkMappingArr: Array<any> = [];\n\n  constructor(private settingsService: SettingsService,\n              private router: Router,\n              private mdlSnackbarService: MdlSnackbarService,\n              private networksService: NetworksService) {\n  }\n\n  ngOnInit(): void {\n    this.loadNetworks();\n    this.loadData();\n  }\n\n  ngAfterViewInit(): void {\n    this.displayConfirmationDialog();\n  }\n\n  onChangeSubid(){\n    this._onChangeSubid();\n    this.loadData();\n  }\n\n  _onChangeSubid(){\n    if( this.subidfilter != '' ){\n      this.query.name = this.subidfilter;\n      delete this.query.active;\n    }else{\n      delete this.query.name;\n      this.query.active = false;\n    }\n  }\n\n  private prepareOrQueryForMapping(){\n    if (this.bulkMappingArr.length > 0) {\n      var orArr = [];\n      this.bulkMappingArr.forEach( (subID: any) => {\n        orArr.push({\n          \"sub_id\" : subID.name,\n          \"network_name\" : subID.network\n        });\n      });\n      return orArr;\n    }\n    else {\n      return {};\n    }\n  }\n\n  public onChangeRemapBack(){\n    this.settingsService.isMappingRunning({}).then(response => {\n      let pendingSubIDsCounter = response[0];\n      if (pendingSubIDsCounter === 0) {\n        if (this.daysback) {\n          let orArr = this.prepareOrQueryForMapping();\n          this.settingsService.remapBack(this.daysback, orArr).then(remapResponse => {\n            if (remapResponse) {\n              this.mdlSnackbarService.showToast('Re map is running');\n              alert(\"Re map is running\");\n              //this.resetSelectedSubIDs();\n            }\n          });\n        }\n        else{      \n          this.mdlSnackbarService.showToast('Please enter a valid value');\n        }\n      }\n      else {\n        this.mdlSnackbarService.showToast(\"REMAP in pogress. Please try again later\");\n      }\n    });\n  }\n\n  onChangeNetwork(value: any) {\n    this.network = this.networks.filter(x => x.id === value)[0];\n    this.networkkey = this.network.key;        \n\n    if(this.network.key === ''){\n      delete this.query.network;\n    }\n    else {\n      this.query.network = this.network.key;\n    }\n    this.loadData();\n  }\n\n  displayConfirmationDialog(){\n    if (this.ediConfirmationPwdDialog) {\n      this.ediConfirmationPwdDialog.close();\n      this.ediConfirmationPwdDialog.show();\n    }\n  }\n\n  loadData(){\n    this.searching = true;\n    this.settingsService.getSubids( this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            // Add boolean flag for checkboxes\n            data[\"isChecked\"] = false;\n            this.data.push( data );\n            this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n  }\n\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n  }\n\n  loadNetworks(){\n    this.networks.push( { id: 1, name : 'All networks', key : '' } );\n    this.network = this.networks[0].name;\n    this.settingsService.getNetworks().then(response => { \n      const networksFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      networksFromResponse.forEach( (network: any) => {\n        if (network.name !== \"All networks\") {\n          this.networks.push(network);\n        }\n      })\n    });\n  } \n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  activateSubid( subid: any ) {\n  }\n  \n  public editSubid( subid: any ){\n    this.subid = subid;\n    this.showEditSubIdDialog = true;\n    if (this.editUserDialog) {\n      this.editUserDialog.show();\n    }\n  }\n\n  private removeObjFromBulkArr(array, element) {\n    const index = array.indexOf(element);\n    array.splice(index, 1);\n  }\n\n  public resetSelectedSubIDs() {\n    this.bulkMappingArr.forEach(element => element.isChecked = false);\n    this.bulkMappingArr = [];\n    this.selectedSubIDsCounter = 0;\n  }\n\n  public markSubId( subid: any ){\n    subid.isChecked = subid.isChecked;\n    // Remove\n    if(this.bulkMappingArr.filter(element => element._id === subid._id).length > 0){\n      this.removeObjFromBulkArr(this.bulkMappingArr, subid);\n      this.selectedSubIDsCounter -= 1;\n    }\n    // Add\n    else {\n      this.bulkMappingArr.push(subid);\n      this.selectedSubIDsCounter += 1;\n    }\n  }\n\n  public loadPendingSubIDs () {\n    this.settingsService.getPendingSubIDs({}).then(response => {\n      let pendingSubIDsCounter = response[0];\n      this.mdlSnackbarService.showToast(\"Pending SubIDs: \" + pendingSubIDsCounter);\n    });\n  }  \n\n  public saveSubid(){\n\n    if (this.selectedSubIDsCounter > 0) {\n      var backupSubID = this.subid;\n      this.subid = {};\n      this.bulkMappingArr.forEach( (subID: any) => {\n        subID.active = backupSubID.active;\n        subID.domain = backupSubID.domain;\n        subID.channel = backupSubID.channel;\n        subID.sub_channel = backupSubID.sub_channel;\n        subID.audience = backupSubID.audience;\n        subID.day = backupSubID.day;\n        this.settingsService.saveSubid( subID ).then(response => {});\n      });\n      this.mdlSnackbarService.showToast(this.selectedSubIDsCounter + \" SubIDs have been mapped\");\n      //this.resetSelectedSubIDs();\n    }\n    else {\n      this.settingsService.saveSubid( this.subid ).then(response => {});\n    }\n    this.editUserDialog.close();\n  }\n\n  public onDialogShow(){\n  }\n\n  public onDialogHide(){\n  }\n\n  public closeEditSubIdModal() {\n    this.showEditSubIdDialog = false;\n    this.editUserDialog.close();\n  }\n\n  public closeConfirmationModal() {\n    this.ediConfirmationPwdDialog.close();\n  }\n\n  public verifyPassword(passwordEvent: String) {\n    if (passwordEvent) {\n      this.settingsService.verifyRemapPassword( passwordEvent ).then(response => {\n        if(response.length > 0){\n          this.closeConfirmationModal();\n          this.displayFullView = true;\n        }\n        else {\n          this.mdlSnackbarService.showToast('Invalid Password');\n        }\n      });\n    }\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/sub-ids/dashboard.component.ts\n **/","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TodayService } from '../../../shared/services/today.service';\nimport * as moment from 'moment';\n\n@Component({\n  selector: 'dashboard-tonic-today',\n  template: require('./dashboard.component.html'),\n  providers: [TodayService]\n})\n\nexport class TonicTodayDashboardComponent implements OnInit {\n  \n  data: Array<any>;\n  ranges: any[] = [];\n  rangeId: any = 1;\n  \n  private searching: boolean = false;\n  private query: any = {};\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n\n  pagination = {\n    currentPage: 1,\n    itemsPerPage: 10,\n    totalItems: 24\n  };\n\n  availableLength: Array<number> = [5, 10, 20, 50, 100];\n\n  pagedData: Array<any> = [];\n\n  constructor(private todayService: TodayService,\n              private router: Router) {\n    //this.refreshMaterials();\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n    this.loadData();\n  }\n\n  loadData(){\n    this.searching = true;\n    this.todayService.getTodayBySubid( this.fromDate, this.toDate, this.query ).then(response => { \n        this.data = [];\n        this.pagination.totalItems = 0;\n        \n        response.forEach( (data: any) => {\n            var datestr = moment( new Date() ).format( 'MM/DD/YYYY' );\n            this.data.push( { subid: data._id.subid, revenue : data.revenue.toFixed(2), clicks : data.clicks, rpc : data.rpc.toFixed(2) } );\n            this.pagination.totalItems++;\n        });\n        this.searching = false;\n        this.refreshTable();\n    });\n\n  }\n\n  downloadData(){\n    var csv = 'subid,revenue,clicks,rpm\\n';\n    this.data.forEach( (row: any) =>{\n        csv += row.subid + ',' + row.revenue + ',' + row.clicks + ',' + row.rpc + '\\n';\n    });\n    var blob = new Blob([csv], { type: 'text/csv' });\n    var url= window.URL.createObjectURL(blob);\n    var anchor = document.createElement(\"a\");\n    anchor.download = 'report.csv';\n    anchor.href = url;\n    anchor.click();\n  }\n\n  refreshTable() {\n    let start = (this.pagination.currentPage - 1) * this.pagination.itemsPerPage,\n      end = start + this.pagination.itemsPerPage;\n    this.pagedData = (this.data != undefined) ? this.data.slice(start, end) : [];\n  }\n\n  detectChange(event) {\n    if (event !== undefined && event.name === 'pagination_changed' && event.pagination !== undefined) {\n      this.pagination = event.pagination;\n      this.refreshTable();\n    }\n  }\n\n  private changeDates(value: any) {\n    console.log('Changed data: ', value);\n    this.loadData();\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        this.query = this.ranges[value].query;\n        this.loadData();\n  }\n\n  private initRange(){\n    // move to 00:00:00 today\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n    // -1 is yesterday\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 1 );\n    \n    this.ranges.push( { id: 1, name : 'all',          query : { } } );\n    this.ranges.push( { id: 2, name : 'aldolanzas',        query : { user : 'aldolanzas'} } );\n    this.ranges.push( { id: 3, name : 'andyjones55',      query : { user : 'andyjones55'} } );\n    this.ranges.push( { id: 4, name : 'anniemonroe2017',        query : { user : 'anniemonroe2017'} } );\n    this.ranges.push( { id: 5, name : 'amelia',          query : { user : 'amelia'} } );\n    this.ranges.push( { id: 6, name : 'bleavelle',          query : { user : 'bleavelle'} } );\n    this.ranges.push( { id: 7, name : 'brandonbeirch',  query : { user : 'brandonbeirch'} } );\n    this.ranges.push( { id: 8, name : 'brianwalker2017',     query : { user : 'brianwalker2017'} } );\n    this.ranges.push( { id: 9, name : 'chris',     query : { user : 'chris'} } );\n    this.ranges.push( { id: 10, name : 'erothman10',     query : { user : 'erothman10'} } );\n    this.ranges.push( { id: 11, name : 'harryjohnson31',     query : { user : 'harryjohnson31'} } );\n    this.ranges.push( { id: 12, name : 'jeffdombrowski',     query : { user : 'jeffdombrowski'} } );\n    this.ranges.push( { id: 13, name : 'jeremyortega2017',     query : { user : 'jeremyortega2017'} } );\n    this.ranges.push( { id: 14, name : 'joshrich425',     query : { user : 'joshrich425'} } );\n    this.ranges.push( { id: 15, name : 'lizavallejos',     query : { user : 'lizavallejos'} } );\n    this.ranges.push( { id: 16, name : 'medicaid33141',     query : { user : 'medicaid33141'} } );\n    this.ranges.push( { id: 17, name : 'mkatzennj',     query : { user : 'mkatzennj'} } );\n    this.ranges.push( { id: 18, name : 'samsworld97220',     query : { user : 'samsworld97220'} } );\n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/tonic-today/dashboard.component.ts\n **/","import { Injectable } from '@angular/core';\nimport { Router, NavigationStart } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { Subject } from 'rxjs/Subject';\n \n@Injectable()\nexport class AlertService {\n    private subject = new Subject<any>();\n    private keepAfterNavigationChange = false;\n \n    constructor(private router: Router) {\n        // clear alert message on route change\n        router.events.subscribe(event => {\n            if (event instanceof NavigationStart) {\n                if (this.keepAfterNavigationChange) {\n                    // only keep for a single location change\n                    this.keepAfterNavigationChange = false;\n                } else {\n                    // clear alert\n                    this.subject.next();\n                }\n            }\n        });\n    }\n \n    success(message: string, keepAfterNavigationChange = false) {\n        this.keepAfterNavigationChange = keepAfterNavigationChange;\n        this.subject.next({ type: 'success', text: message });\n    }\n \n    error(message: string, keepAfterNavigationChange = false) {\n        this.keepAfterNavigationChange = keepAfterNavigationChange;\n        this.subject.next({ type: 'error', text: message });\n    }\n \n    getMessage(): Observable<any> {\n        return this.subject.asObservable();\n    }\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/alert.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class BillingStatementsService {\n    private baseURL = 'api/billingStatementStats';\n    \n    constructor(private http: Http) { }\n\n    post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n \ngetData( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/data/daily-statements?aggregate='+aggregate;\n    return this.post(fromDate, toDate, query, url);\n}\n\ngetDataDetails( fromDate, toDate, query ): Promise<any> {\n    var url  = '/data/daily-statements-details';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n}\n\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/billing_statements.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n//import {DailyStats} from '../data/daily-stats';\n\n@Injectable()\nexport class SpendService {\n\n  private baseURL = 'api/spend';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getDataDailySpend( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/data/daily-spend?aggregate='+aggregate;\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getDataDailySpendDetails( fromDate, toDate, query, group ): Promise<any> {\n    var url  = '/data/daily-spend-details';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query, group : group } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/spend.service.ts\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar animate_1 = require('../../core/util/animate');\nvar core_1 = require('@angular/core');\nvar viewport_1 = require('../../core/util/viewport');\nvar util_module_1 = require('../../core/util/util.module');\nvar MdBackdrop = (function () {\n    function MdBackdrop(element, viewport) {\n        this.element = element;\n        this.viewport = viewport;\n        this.clickClose = false;\n        this.hideScroll = true;\n        this.onHiding = new core_1.EventEmitter(false);\n        this.onHidden = new core_1.EventEmitter(false);\n        this.onShowing = new core_1.EventEmitter();\n        this.onShown = new core_1.EventEmitter();\n        this.transitionClass = 'md-active';\n        this.transitionAddClass = true;\n        this._visible = false;\n        this._transitioning = false;\n        this._previousOverflow = null;\n        this._body = document.body;\n    }\n    Object.defineProperty(MdBackdrop.prototype, \"visible\", {\n        get: function () {\n            return this._visible;\n        },\n        set: function (value) {\n            this.toggle(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdBackdrop.prototype.onClick = function () {\n        if (this.clickClose && !this._transitioning && this.visible) {\n            this.hide();\n        }\n    };\n    MdBackdrop.prototype.hide = function () {\n        return this.toggle(false);\n    };\n    MdBackdrop.prototype.show = function () {\n        return this.toggle(true);\n    };\n    MdBackdrop.prototype.toggle = function (visible) {\n        var _this = this;\n        if (visible === void 0) { visible = !this.visible; }\n        if (visible === this._visible) {\n            return Promise.resolve();\n        }\n        var beginEvent = visible ? this.onShowing : this.onHiding;\n        var endEvent = visible ? this.onShown : this.onHidden;\n        this._visible = visible;\n        this._transitioning = true;\n        beginEvent.emit(this);\n        var action = visible ?\n            (this.transitionAddClass ? animate_1.Animate.enter : animate_1.Animate.leave) :\n            (this.transitionAddClass ? animate_1.Animate.leave : animate_1.Animate.enter);\n        if (visible && this.hideScroll && this.element && !this._previousOverflow) {\n            var style = this._body.style['overflow'];\n            if (style !== 'hidden') {\n                this._previousOverflow = style;\n                this._body.style['overflow'] = 'hidden';\n            }\n        }\n        else if (!visible && this.hideScroll && this.element && this._previousOverflow !== null) {\n            this._body.style['overflow'] = this._previousOverflow;\n            this._previousOverflow = null;\n        }\n        return action(this.element.nativeElement, this.transitionClass).then(function () {\n            _this._transitioning = false;\n            endEvent.emit(_this);\n        });\n    };\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdBackdrop.prototype, \"clickClose\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdBackdrop.prototype, \"hideScroll\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdBackdrop.prototype, \"onHiding\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdBackdrop.prototype, \"onHidden\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdBackdrop.prototype, \"onShowing\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdBackdrop.prototype, \"onShown\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdBackdrop.prototype, \"transitionClass\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdBackdrop.prototype, \"transitionAddClass\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdBackdrop.prototype, \"visible\", null);\n    MdBackdrop = __decorate([\n        core_1.Component({\n            selector: 'md-backdrop',\n            template: '',\n            encapsulation: core_1.ViewEncapsulation.None,\n            host: {\n                'class': 'md-backdrop',\n                '(click)': 'onClick()',\n            },\n        }), \n        __metadata('design:paramtypes', [core_1.ElementRef, viewport_1.ViewportHelper])\n    ], MdBackdrop);\n    return MdBackdrop;\n}());\nexports.MdBackdrop = MdBackdrop;\nvar MdBackdropModule = (function () {\n    function MdBackdropModule() {\n    }\n    MdBackdropModule = __decorate([\n        core_1.NgModule({\n            declarations: [MdBackdrop],\n            exports: [MdBackdrop],\n            imports: [util_module_1.MdServicesModule]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdBackdropModule);\n    return MdBackdropModule;\n}());\nexports.MdBackdropModule = MdBackdropModule;\n//# sourceMappingURL=backdrop.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/backdrop/backdrop.js\n ** module id = 387\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require(\"@angular/core\");\nvar MdContent = (function () {\n    function MdContent() {\n    }\n    MdContent = __decorate([\n        core_1.Directive({ selector: 'md-content' }), \n        __metadata('design:paramtypes', [])\n    ], MdContent);\n    return MdContent;\n}());\nvar MdContentModule = (function () {\n    function MdContentModule() {\n    }\n    MdContentModule = __decorate([\n        core_1.NgModule({\n            declarations: [MdContent],\n            exports: [MdContent]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdContentModule);\n    return MdContentModule;\n}());\nexports.MdContentModule = MdContentModule;\n//# sourceMappingURL=content.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/content/content.js\n ** module id = 388\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nvar core_1 = require('@angular/core');\nvar material_1 = require(\"@angular/material\");\nrequire('rxjs/add/operator/share');\nvar data_table_selectable_tr_1 = require('./data_table_selectable_tr');\n__export(require('./data_table_selectable_tr'));\nvar MdDataTable = (function () {\n    function MdDataTable() {\n        this.onSelectableAll = new core_1.EventEmitter(false);\n        this.onSelectableChange = new core_1.EventEmitter(false);\n        this._listeners = [];\n        this.selected = [];\n        this.onSelectableChange.share();\n    }\n    MdDataTable.prototype.change = function (event) {\n        var outputEvent = {\n            name: 'selectable_change',\n            allSelected: false,\n            values: []\n        };\n        if (event.target instanceof data_table_selectable_tr_1.MdDataTableHeaderSelectableRow === true) {\n            if (event.isActive === true) {\n                outputEvent.allSelected = true;\n                outputEvent.values = this._getRowsValues();\n            }\n        }\n        else {\n            outputEvent.values = this.selected.slice(0);\n            if (event.isActive === true) {\n                outputEvent.values.push(event.selectableValue);\n            }\n            else {\n                var index = outputEvent.values.indexOf(event.selectableValue);\n                if (index !== -1) {\n                    outputEvent.values.splice(index, 1);\n                }\n            }\n        }\n        this.selected = outputEvent.values;\n        this.onSelectableChange.emit(outputEvent);\n    };\n    MdDataTable.prototype._getRowsValues = function () {\n        return this._rows.toArray()\n            .map(function (tr) { return tr.selectableValue; });\n    };\n    MdDataTable.prototype._unsubscribeChildren = function () {\n        this.selected = [];\n        if (this._listeners.length) {\n            this._listeners.forEach(function (listener) {\n                listener.unsubscribe();\n            });\n            this._listeners = [];\n        }\n    };\n    MdDataTable.prototype._updateChildrenListener = function (list) {\n        var _this = this;\n        this._unsubscribeChildren();\n        list.toArray()\n            .map(function (tr) {\n            tr.onChange.subscribe(_this.change.bind(_this));\n        });\n    };\n    MdDataTable.prototype.ngAfterContentInit = function () {\n        if (this.selectable === true) {\n            if (!!this._masterRow) {\n                this._masterRow.onChange.subscribe(this.change.bind(this));\n            }\n            this._rows.changes.subscribe(this._updateChildrenListener.bind(this));\n            this._updateChildrenListener(this._rows);\n        }\n    };\n    MdDataTable.prototype.ngOnDestroy = function () {\n        this._unsubscribeChildren();\n    };\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdDataTable.prototype, \"selectable\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdDataTable.prototype, \"onSelectableAll\", void 0);\n    __decorate([\n        core_1.Output(), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdDataTable.prototype, \"onSelectableChange\", void 0);\n    __decorate([\n        core_1.ContentChild(data_table_selectable_tr_1.MdDataTableHeaderSelectableRow), \n        __metadata('design:type', data_table_selectable_tr_1.MdDataTableHeaderSelectableRow)\n    ], MdDataTable.prototype, \"_masterRow\", void 0);\n    __decorate([\n        core_1.ContentChildren(data_table_selectable_tr_1.MdDataTableSelectableRow, true), \n        __metadata('design:type', core_1.QueryList)\n    ], MdDataTable.prototype, \"_rows\", void 0);\n    MdDataTable = __decorate([\n        core_1.Component({\n            selector: 'md-data-table',\n            template: \"<ng-content></ng-content>\",\n            host: {\n                '[class.md-data-table]': 'true',\n                '[class.md-data-table-selectable]': 'selectable',\n            }\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDataTable);\n    return MdDataTable;\n}());\nexports.MdDataTable = MdDataTable;\nvar DATA_TABLE_DIRECTIVES = [\n    MdDataTable,\n    data_table_selectable_tr_1.MdDataTableHeaderSelectableRow,\n    data_table_selectable_tr_1.MdDataTableSelectableRow\n];\nvar MdDataTableModule = (function () {\n    function MdDataTableModule() {\n    }\n    MdDataTableModule = __decorate([\n        core_1.NgModule({\n            declarations: DATA_TABLE_DIRECTIVES,\n            exports: DATA_TABLE_DIRECTIVES,\n            imports: [\n                material_1.MdCheckboxModule\n            ]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDataTableModule);\n    return MdDataTableModule;\n}());\nexports.MdDataTableModule = MdDataTableModule;\n//# sourceMappingURL=data_table.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/data-table/data_table.js\n ** module id = 389\n ** module chunks = 2\n **/","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\n__export(require('./data_table'));\n__export(require('./data_table_selectable_tr'));\n//# sourceMappingURL=index.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/data-table/index.js\n ** module id = 390\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar MdDialogTitle = (function () {\n    function MdDialogTitle() {\n    }\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdDialogTitle.prototype, \"title\", void 0);\n    MdDialogTitle = __decorate([\n        core_1.Component({\n            selector: 'md-dialog-title',\n            template: \"<h2 *ngIf=\\\"title\\\">{{title}}</h2><ng-content></ng-content>\",\n            changeDetection: core_1.ChangeDetectionStrategy.OnPush\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDialogTitle);\n    return MdDialogTitle;\n}());\nexports.MdDialogTitle = MdDialogTitle;\n//# sourceMappingURL=dialog-title.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/dialog-title.js\n ** module id = 391\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require(\"@angular/core\");\nvar MdDivider = (function () {\n    function MdDivider() {\n    }\n    MdDivider = __decorate([\n        core_1.Component({\n            selector: 'md-divider',\n            template: '',\n            encapsulation: core_1.ViewEncapsulation.None\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDivider);\n    return MdDivider;\n}());\nvar MdDividerModule = (function () {\n    function MdDividerModule() {\n    }\n    MdDividerModule = __decorate([\n        core_1.NgModule({\n            declarations: [MdDivider],\n            exports: [MdDivider]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDividerModule);\n    return MdDividerModule;\n}());\nexports.MdDividerModule = MdDividerModule;\n//# sourceMappingURL=divider.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/divider/divider.js\n ** module id = 392\n ** module chunks = 2\n **/","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\n__export(require('./pagination'));\n__export(require('./pagination_service'));\n//# sourceMappingURL=index.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/pagination/index.js\n ** module id = 393\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar Subject_1 = require('rxjs/Subject');\nvar PaginationService = (function () {\n    function PaginationService() {\n        this.onChange = new Subject_1.Subject();\n    }\n    PaginationService.prototype.change = function (name, pagination) {\n        if (name === void 0) { name = 'default'; }\n        var newEvent = {\n            name: 'pagination_changed',\n            target: name,\n            pagination: pagination\n        };\n        this.onChange.next(newEvent);\n    };\n    PaginationService = __decorate([\n        core_1.Injectable(), \n        __metadata('design:paramtypes', [])\n    ], PaginationService);\n    return PaginationService;\n}());\nexports.PaginationService = PaginationService;\n//# sourceMappingURL=pagination_service.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/pagination/pagination_service.js\n ** module id = 394\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar media_1 = require('../../core/util/media');\nvar viewport_1 = require('../../core/util/viewport');\nvar MdPeekaboo = (function () {\n    function MdPeekaboo(media, element, viewport, zone) {\n        var _this = this;\n        this.media = media;\n        this.element = element;\n        this.viewport = viewport;\n        this.zone = zone;\n        this.break = 100;\n        this._active = false;\n        this._breakXs = -1;\n        this._breakSm = -1;\n        this._breakMd = -1;\n        this._breakLg = -1;\n        this._breakXl = -1;\n        this._breakpoint = null;\n        this._scroller = null;\n        this._mediaListeners = [];\n        this._windowScroll = this.evaluate.bind(this);\n        MdPeekaboo.SIZES.forEach(function (size) {\n            _this._watchMediaQuery(size);\n            if (_this.media.hasMedia(size)) {\n                _this._breakpoint = size;\n            }\n        });\n        this.evaluate();\n    }\n    MdPeekaboo.MakeNumber = function (value) {\n        return typeof value === 'string' ? parseInt(value, 10) : value;\n    };\n    Object.defineProperty(MdPeekaboo.prototype, \"active\", {\n        get: function () {\n            return this._active;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakXs\", {\n        get: function () {\n            return this._breakXs;\n        },\n        set: function (value) {\n            this._breakXs = MdPeekaboo.MakeNumber(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakSm\", {\n        get: function () {\n            return this._breakSm;\n        },\n        set: function (value) {\n            this._breakSm = MdPeekaboo.MakeNumber(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakMd\", {\n        get: function () {\n            return this._breakMd;\n        },\n        set: function (value) {\n            this._breakMd = MdPeekaboo.MakeNumber(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakLg\", {\n        get: function () {\n            return this._breakLg;\n        },\n        set: function (value) {\n            this._breakLg = MdPeekaboo.MakeNumber(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakXl\", {\n        get: function () {\n            return this._breakXl;\n        },\n        set: function (value) {\n            this._breakXl = MdPeekaboo.MakeNumber(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"breakpoint\", {\n        get: function () {\n            return this._breakpoint;\n        },\n        set: function (size) {\n            this._breakpoint = size;\n            this.evaluate();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MdPeekaboo.prototype, \"scroller\", {\n        get: function () {\n            return this._scroller;\n        },\n        set: function (scroll) {\n            if (this._scroller) {\n                this._scroller.removeEventListener('scroll', this._windowScroll);\n            }\n            this._scroller = scroll;\n            if (this._scroller) {\n                this._scroller.addEventListener('scroll', this._windowScroll, true);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdPeekaboo.prototype.ngOnDestroy = function () {\n        this._mediaListeners.forEach(function (l) {\n            l.destroy();\n        });\n        this._mediaListeners = [];\n    };\n    MdPeekaboo.prototype._watchMediaQuery = function (size) {\n        var _this = this;\n        var l = this.media.listen(media_1.Media.getQuery(size));\n        l.onMatched.subscribe(function (mql) {\n            _this.breakpoint = size;\n        });\n        this._mediaListeners.push(l);\n    };\n    MdPeekaboo.prototype.evaluate = function () {\n        var _this = this;\n        var top = this._scroller ? this._scroller.scrollTop : this.viewport.scrollTop();\n        var bp = this.break;\n        switch (this._breakpoint) {\n            case 'xl':\n                if (this._breakXl !== -1) {\n                    bp = this._breakXl;\n                    break;\n                }\n            case 'lg':\n                if (this._breakLg !== -1) {\n                    bp = this._breakLg;\n                    break;\n                }\n            case 'md':\n                if (this._breakMd !== -1) {\n                    bp = this._breakMd;\n                    break;\n                }\n            case 'sm':\n                if (this._breakSm !== -1) {\n                    bp = this._breakSm;\n                    break;\n                }\n            case 'xs':\n                if (this._breakXs !== -1) {\n                    bp = this._breakXs;\n                    break;\n                }\n        }\n        if (top >= bp && !this._active) {\n            this.zone.run(function () {\n                _this._active = true;\n            });\n        }\n        else if (top < bp && this._active) {\n            this.zone.run(function () {\n                _this._active = false;\n            });\n        }\n        return bp;\n    };\n    MdPeekaboo.SIZES = ['xs', 'sm', 'md', 'lg', 'xl'];\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number)\n    ], MdPeekaboo.prototype, \"break\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdPeekaboo.prototype, \"breakAction\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number), \n        __metadata('design:paramtypes', [Number])\n    ], MdPeekaboo.prototype, \"breakXs\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number), \n        __metadata('design:paramtypes', [Number])\n    ], MdPeekaboo.prototype, \"breakSm\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number), \n        __metadata('design:paramtypes', [Number])\n    ], MdPeekaboo.prototype, \"breakMd\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number), \n        __metadata('design:paramtypes', [Number])\n    ], MdPeekaboo.prototype, \"breakLg\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Number), \n        __metadata('design:paramtypes', [Number])\n    ], MdPeekaboo.prototype, \"breakXl\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object), \n        __metadata('design:paramtypes', [Object])\n    ], MdPeekaboo.prototype, \"scroller\", null);\n    MdPeekaboo = __decorate([\n        core_1.Directive({\n            selector: '[md-peekaboo]',\n            host: {\n                '[class.md-peekaboo-active]': 'active',\n                '[attr.breakAction]': 'breakAction',\n                '(window:scroll)': '_windowScroll($event)'\n            }\n        }), \n        __metadata('design:paramtypes', [media_1.Media, core_1.ElementRef, viewport_1.ViewportHelper, core_1.NgZone])\n    ], MdPeekaboo);\n    return MdPeekaboo;\n}());\nexports.MdPeekaboo = MdPeekaboo;\nvar MdPeekabooModule = (function () {\n    function MdPeekabooModule() {\n    }\n    MdPeekabooModule = __decorate([\n        core_1.NgModule({\n            declarations: [MdPeekaboo],\n            exports: [MdPeekaboo]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdPeekabooModule);\n    return MdPeekabooModule;\n}());\nexports.MdPeekabooModule = MdPeekabooModule;\n//# sourceMappingURL=peekaboo.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/peekaboo/peekaboo.js\n ** module id = 395\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require(\"@angular/core\");\nvar MdSubheader = (function () {\n    function MdSubheader() {\n    }\n    MdSubheader = __decorate([\n        core_1.Component({\n            selector: 'md-subheader',\n            host: {\n                'class': 'md-subheader'\n            },\n            template: \"\\n    <div class=\\\"md-subheader-inner\\\">\\n      <span class=\\\"md-subheader-content\\\"><ng-content></ng-content></span>\\n    </div>\"\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdSubheader);\n    return MdSubheader;\n}());\nvar MdSubheaderModule = (function () {\n    function MdSubheaderModule() {\n    }\n    MdSubheaderModule = __decorate([\n        core_1.NgModule({\n            declarations: [MdSubheader],\n            exports: [MdSubheader]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdSubheaderModule);\n    return MdSubheaderModule;\n}());\nexports.MdSubheaderModule = MdSubheaderModule;\n//# sourceMappingURL=subheader.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/subheader/subheader.js\n ** module id = 396\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar viewport_1 = require('./viewport');\nvar core_1 = require('@angular/core');\nvar media_1 = require('./media');\nvar animate_1 = require('./animate');\nvar MdServicesModule = (function () {\n    function MdServicesModule() {\n    }\n    MdServicesModule = __decorate([\n        core_1.NgModule({\n            providers: [\n                { provide: viewport_1.ViewportHelper, useClass: viewport_1.BrowserViewportHelper },\n                media_1.Media,\n                animate_1.Animate\n            ]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdServicesModule);\n    return MdServicesModule;\n}());\nexports.MdServicesModule = MdServicesModule;\n//# sourceMappingURL=util.module.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/core/util/util.module.js\n ** module id = 397\n ** module chunks = 2\n **/","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :\n    (factory((global.angular2Mdl = global.angular2Mdl || {}, global.angular2Mdl.popover = global.angular2Mdl.popover || {}),global.ng.core));\n}(this, (function (exports,_angular_core) { 'use strict';\n\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdlPopoverComponent = (function () {\n    function MdlPopoverComponent(changeDetectionRef, elementRef) {\n        this.changeDetectionRef = changeDetectionRef;\n        this.elementRef = elementRef;\n        this.hideOnClick = false;\n        this.isVisible = false;\n        this.directionUp = false;\n    }\n    MdlPopoverComponent.prototype.ngAfterViewInit = function () {\n        // Add a hide listener to native element\n        this.elementRef.nativeElement.addEventListener('hide', this.hide.bind(this));\n    };\n    MdlPopoverComponent.prototype.onDocumentClick = function (event) {\n        if (this.isVisible &&\n            (this.hideOnClick || !this.elementRef.nativeElement.contains(event.target))) {\n            this.hide();\n        }\n    };\n    MdlPopoverComponent.prototype.ngOnDestroy = function () {\n        this.elementRef.nativeElement.removeEventListener('hide');\n    };\n    MdlPopoverComponent.prototype.toggle = function (event) {\n        if (this.isVisible) {\n            this.hide();\n        }\n        else {\n            this.hideAllPopovers();\n            this.show(event);\n        }\n    };\n    MdlPopoverComponent.prototype.hide = function () {\n        this.isVisible = false;\n        this.changeDetectionRef.markForCheck();\n    };\n    MdlPopoverComponent.prototype.hideAllPopovers = function () {\n        var nodeList = document.querySelectorAll('.mdl-popover.is-visible');\n        for (var i = 0; i < nodeList.length; ++i) {\n            nodeList[i].dispatchEvent(new Event('hide'));\n        }\n    };\n    MdlPopoverComponent.prototype.show = function (event) {\n        event.stopPropagation();\n        this.isVisible = true;\n        this.updateDirection(event);\n    };\n    MdlPopoverComponent.prototype.updateDirection = function (event) {\n        var _this = this;\n        var nativeEl = this.elementRef.nativeElement;\n        var targetRect = event.target.getBoundingClientRect();\n        var viewHeight = window.innerHeight;\n        setTimeout(function () {\n            var height = nativeEl.offsetHeight;\n            if (height) {\n                var spaceAvailable = {\n                    top: targetRect.top,\n                    bottom: viewHeight - targetRect.bottom\n                };\n                _this.directionUp = spaceAvailable.bottom < height;\n                _this.changeDetectionRef.markForCheck();\n            }\n        });\n    };\n    __decorate([\n        _angular_core.Input('hide-on-click'), \n        __metadata('design:type', Boolean)\n    ], MdlPopoverComponent.prototype, \"hideOnClick\", void 0);\n    __decorate([\n        _angular_core.HostBinding('class.is-visible'), \n        __metadata('design:type', Object)\n    ], MdlPopoverComponent.prototype, \"isVisible\", void 0);\n    __decorate([\n        _angular_core.HostBinding('class.direction-up'), \n        __metadata('design:type', Object)\n    ], MdlPopoverComponent.prototype, \"directionUp\", void 0);\n    __decorate([\n        _angular_core.HostListener('document:click', ['$event']), \n        __metadata('design:type', Function), \n        __metadata('design:paramtypes', [Event]), \n        __metadata('design:returntype', void 0)\n    ], MdlPopoverComponent.prototype, \"onDocumentClick\", null);\n    MdlPopoverComponent = __decorate([\n        _angular_core.Component({selector: 'mdl-popover',\n            host: {\n                '[class.mdl-popover]': 'true'\n            },\n            template: \"<ng-content></ng-content> \",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata('design:paramtypes', [_angular_core.ChangeDetectorRef, _angular_core.ElementRef])\n    ], MdlPopoverComponent);\n    return MdlPopoverComponent;\n}());\nvar MdlPopoverModule = (function () {\n    function MdlPopoverModule() {\n    }\n    MdlPopoverModule.forRoot = function () {\n        return {\n            ngModule: MdlPopoverModule,\n            providers: []\n        };\n    };\n    MdlPopoverModule = __decorate([\n        _angular_core.NgModule({\n            imports: [],\n            exports: [MdlPopoverComponent],\n            declarations: [MdlPopoverComponent],\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdlPopoverModule);\n    return MdlPopoverModule;\n}());\n\nexports.MdlPopoverComponent = MdlPopoverComponent;\nexports.MdlPopoverModule = MdlPopoverModule;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/@angular2-mdl-ext/popover/index.umd.js\n ** module id = 530\n ** module chunks = 2\n **/","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('@angular/common')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core', '@angular/forms', '@angular/common'], factory) :\n    (factory((global.angular2Mdl = global.angular2Mdl || {}, global.angular2Mdl.select = global.angular2Mdl.select || {}),global.ng.core,global.ng.forms,global.ng.common));\n}(this, (function (exports,_angular_core,_angular_forms,_angular_common) { 'use strict';\n\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdlOptionComponent = (function () {\n    function MdlOptionComponent(changeDetectionRef) {\n        this.changeDetectionRef = changeDetectionRef;\n        this.multiple = false;\n        this.selected = false;\n        this.onSelect = Function.prototype;\n    }\n    MdlOptionComponent.prototype.setMultiple = function (multiple) {\n        this.multiple = multiple;\n        this.changeDetectionRef.detectChanges();\n    };\n    MdlOptionComponent.prototype.updateSelected = function (value) {\n        if (this.multiple) {\n            this.selected = value.includes(this.value);\n        }\n        else {\n            this.selected = this.value == value;\n        }\n        this.changeDetectionRef.detectChanges();\n    };\n    MdlOptionComponent.prototype.ngAfterViewInit = function () {\n        this.text = this.contentWrapper.nativeElement.textContent.trim();\n    };\n    __decorate([\n        _angular_core.Input('value'), \n        __metadata('design:type', Object)\n    ], MdlOptionComponent.prototype, \"value\", void 0);\n    __decorate([\n        _angular_core.ViewChild('contentWrapper'), \n        __metadata('design:type', _angular_core.ElementRef)\n    ], MdlOptionComponent.prototype, \"contentWrapper\", void 0);\n    MdlOptionComponent = __decorate([\n        _angular_core.Component({selector: 'mdl-option',\n            host: {\n                '[class.mdl-option__container]': 'true'\n            },\n            template: \"<div class=\\\"mdl-list__item\\\" (click)=\\\"onSelect($event, value)\\\" [class.is-active]=\\\"selected\\\"> <div *ngIf=\\\"multiple\\\" class=\\\"mdl-list__item-secondary-action\\\"> <div class=\\\"mdl-checkbox is-upgraded\\\" [class.is-checked]=\\\"selected\\\" (click)=\\\"onSelect($event, value)\\\"> <input type=\\\"checkbox\\\" class=\\\"mdl-checkbox__input\\\"> <span class=\\\"mdl-checkbox__label\\\"></span> <span class=\\\"mdl-checkbox__focus-helper\\\"></span> <span class=\\\"mdl-checkbox__box-outline\\\"> <span class=\\\"mdl-checkbox__tick-outline\\\"></span> </span> </div> </div> <div #contentWrapper class=\\\"mdl-list__item-primary-content\\\"> <ng-content></ng-content> </div> </div> \"\n        }), \n        __metadata('design:paramtypes', [_angular_core.ChangeDetectorRef])\n    ], MdlOptionComponent);\n    return MdlOptionComponent;\n}());\n\nvar __decorate$2 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$2 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdlPopoverComponent = (function () {\n    function MdlPopoverComponent(changeDetectionRef, elementRef) {\n        this.changeDetectionRef = changeDetectionRef;\n        this.elementRef = elementRef;\n        this.hideOnClick = false;\n        this.isVisible = false;\n        this.directionUp = false;\n    }\n    MdlPopoverComponent.prototype.ngAfterViewInit = function () {\n        // Add a hide listener to native element\n        this.elementRef.nativeElement.addEventListener('hide', this.hide.bind(this));\n    };\n    MdlPopoverComponent.prototype.onDocumentClick = function (event) {\n        if (this.isVisible &&\n            (this.hideOnClick || !this.elementRef.nativeElement.contains(event.target))) {\n            this.hide();\n        }\n    };\n    MdlPopoverComponent.prototype.ngOnDestroy = function () {\n        this.elementRef.nativeElement.removeEventListener('hide');\n    };\n    MdlPopoverComponent.prototype.toggle = function (event) {\n        if (this.isVisible) {\n            this.hide();\n        }\n        else {\n            this.hideAllPopovers();\n            this.show(event);\n        }\n    };\n    MdlPopoverComponent.prototype.hide = function () {\n        this.isVisible = false;\n        this.changeDetectionRef.markForCheck();\n    };\n    MdlPopoverComponent.prototype.hideAllPopovers = function () {\n        var nodeList = document.querySelectorAll('.mdl-popover.is-visible');\n        for (var i = 0; i < nodeList.length; ++i) {\n            nodeList[i].dispatchEvent(new Event('hide'));\n        }\n    };\n    MdlPopoverComponent.prototype.show = function (event) {\n        event.stopPropagation();\n        this.isVisible = true;\n        this.updateDirection(event);\n    };\n    MdlPopoverComponent.prototype.updateDirection = function (event) {\n        var _this = this;\n        var nativeEl = this.elementRef.nativeElement;\n        var targetRect = event.target.getBoundingClientRect();\n        var viewHeight = window.innerHeight;\n        setTimeout(function () {\n            var height = nativeEl.offsetHeight;\n            if (height) {\n                var spaceAvailable = {\n                    top: targetRect.top,\n                    bottom: viewHeight - targetRect.bottom\n                };\n                _this.directionUp = spaceAvailable.bottom < height;\n                _this.changeDetectionRef.markForCheck();\n            }\n        });\n    };\n    __decorate$2([\n        _angular_core.Input('hide-on-click'), \n        __metadata$2('design:type', Boolean)\n    ], MdlPopoverComponent.prototype, \"hideOnClick\", void 0);\n    __decorate$2([\n        _angular_core.HostBinding('class.is-visible'), \n        __metadata$2('design:type', Object)\n    ], MdlPopoverComponent.prototype, \"isVisible\", void 0);\n    __decorate$2([\n        _angular_core.HostBinding('class.direction-up'), \n        __metadata$2('design:type', Object)\n    ], MdlPopoverComponent.prototype, \"directionUp\", void 0);\n    __decorate$2([\n        _angular_core.HostListener('document:click', ['$event']), \n        __metadata$2('design:type', Function), \n        __metadata$2('design:paramtypes', [Event]), \n        __metadata$2('design:returntype', void 0)\n    ], MdlPopoverComponent.prototype, \"onDocumentClick\", null);\n    MdlPopoverComponent = __decorate$2([\n        _angular_core.Component({selector: 'mdl-popover',\n            host: {\n                '[class.mdl-popover]': 'true'\n            },\n            template: \"<ng-content></ng-content> \",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$2('design:paramtypes', [_angular_core.ChangeDetectorRef, _angular_core.ElementRef])\n    ], MdlPopoverComponent);\n    return MdlPopoverComponent;\n}());\nvar MdlPopoverModule = (function () {\n    function MdlPopoverModule() {\n    }\n    MdlPopoverModule.forRoot = function () {\n        return {\n            ngModule: MdlPopoverModule,\n            providers: []\n        };\n    };\n    MdlPopoverModule = __decorate$2([\n        _angular_core.NgModule({\n            imports: [],\n            exports: [MdlPopoverComponent],\n            declarations: [MdlPopoverComponent],\n        }), \n        __metadata$2('design:paramtypes', [])\n    ], MdlPopoverModule);\n    return MdlPopoverModule;\n}());\n\nvar __decorate$1 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$1 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar uniq = function (array) { return Array.from(new Set(array)); };\nfunction randomId() {\n    var S4 = function () { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); };\n    return (S4() + S4());\n}\nvar MDL_SELECT_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return MdlSelectComponent; }),\n    multi: true\n};\nvar MdlSelectComponent = (function () {\n    function MdlSelectComponent(changeDetectionRef) {\n        this.changeDetectionRef = changeDetectionRef;\n        this.disabled = false;\n        this.placeholder = '';\n        this.multiple = false;\n        this.change = new _angular_core.EventEmitter(true);\n        this.text = '';\n        this.textByValue = {};\n        this.onChange = Function.prototype;\n        this.onTouched = Function.prototype;\n        this.textfieldId = \"mdl-textfield-\" + randomId();\n    }\n    MdlSelectComponent.prototype.ngAfterViewInit = function () {\n        var _this = this;\n        this.bindOptions();\n        this.renderValue(this.ngModel);\n        this.optionComponents.changes.subscribe(function () { return _this.bindOptions(); });\n    };\n    MdlSelectComponent.prototype.isEmpty = function () {\n        return this.multiple ? !this.ngModel.length : !this.ngModel;\n    };\n    // rebind options and reset value in connected select\n    MdlSelectComponent.prototype.reset = function (resetValue) {\n        if (resetValue === void 0) { resetValue = true; }\n        if (resetValue && !this.isEmpty()) {\n            this.ngModel = this.multiple ? [] : '';\n            this.onChange(this.ngModel);\n            this.change.emit(this.ngModel);\n            this.renderValue(this.ngModel);\n        }\n    };\n    MdlSelectComponent.prototype.bindOptions = function () {\n        var _this = this;\n        this.optionComponents.forEach(function (selectOptionComponent) {\n            selectOptionComponent.setMultiple(_this.multiple);\n            selectOptionComponent.onSelect = _this.onSelect.bind(_this);\n            _this.textByValue[String(selectOptionComponent.value || '')] = selectOptionComponent.text;\n        });\n    };\n    MdlSelectComponent.prototype.renderValue = function (value) {\n        var _this = this;\n        if (this.multiple) {\n            this.text = value.map(function (value) { return _this.textByValue[String(value)]; }).join(', ');\n        }\n        else {\n            this.text =\n                (!!value || typeof value === 'number')\n                    ? this.textByValue[String(value)]\n                    : '';\n        }\n        this.changeDetectionRef.detectChanges();\n        if (this.optionComponents) {\n            this.optionComponents.forEach(function (selectOptionComponent) {\n                selectOptionComponent.updateSelected(value);\n            });\n        }\n    };\n    MdlSelectComponent.prototype.toggle = function ($event) {\n        if (!this.disabled) {\n            this.popoverComponent.toggle($event);\n        }\n    };\n    MdlSelectComponent.prototype.onSelect = function ($event, value) {\n        if (this.multiple) {\n            // prevent popup close on click inside popover when selecting multiple\n            $event.stopPropagation();\n        }\n        this.writeValue(value);\n        this.change.emit(this.ngModel);\n    };\n    MdlSelectComponent.prototype.writeValue = function (value) {\n        if (this.multiple) {\n            this.ngModel = this.ngModel || [];\n            if (!value || this.ngModel === value) {\n            }\n            else if (Array.isArray(value)) {\n                this.ngModel = uniq(this.ngModel.concat(value));\n            }\n            else if (this.ngModel.includes(value)) {\n                this.ngModel = this.ngModel.filter(function (v) { return v !== value; }).slice();\n            }\n            else if (!!value) {\n                this.ngModel = this.ngModel.concat([value]);\n            }\n        }\n        else {\n            this.ngModel = value;\n        }\n        this.onChange(this.ngModel);\n        this.renderValue(this.ngModel);\n    };\n    MdlSelectComponent.prototype.registerOnChange = function (fn) {\n        this.onChange = fn;\n    };\n    MdlSelectComponent.prototype.registerOnTouched = function (fn) {\n        this.onTouched = fn;\n    };\n    __decorate$1([\n        _angular_core.Input(), \n        __metadata$1('design:type', Object)\n    ], MdlSelectComponent.prototype, \"ngModel\", void 0);\n    __decorate$1([\n        _angular_core.Input(), \n        __metadata$1('design:type', Boolean)\n    ], MdlSelectComponent.prototype, \"disabled\", void 0);\n    __decorate$1([\n        _angular_core.Input(), \n        __metadata$1('design:type', String)\n    ], MdlSelectComponent.prototype, \"placeholder\", void 0);\n    __decorate$1([\n        _angular_core.Input(), \n        __metadata$1('design:type', Boolean)\n    ], MdlSelectComponent.prototype, \"multiple\", void 0);\n    __decorate$1([\n        _angular_core.Output(), \n        __metadata$1('design:type', _angular_core.EventEmitter)\n    ], MdlSelectComponent.prototype, \"change\", void 0);\n    __decorate$1([\n        _angular_core.ViewChild(MdlPopoverComponent), \n        __metadata$1('design:type', MdlPopoverComponent)\n    ], MdlSelectComponent.prototype, \"popoverComponent\", void 0);\n    __decorate$1([\n        _angular_core.ContentChildren(MdlOptionComponent), \n        __metadata$1('design:type', _angular_core.QueryList)\n    ], MdlSelectComponent.prototype, \"optionComponents\", void 0);\n    MdlSelectComponent = __decorate$1([\n        _angular_core.Component({selector: 'mdl-select',\n            host: {\n                '[class.mdl-select]': 'true'\n            },\n            template: \"<div class=\\\"mdl-textfield is-upgraded has-placeholder\\\" [class.is-focused]=\\\"this.popoverComponent.isVisible\\\" [class.is-disabled]=\\\"this.disabled\\\"> <div class=\\\"mdl-textfield__input\\\" (click)=\\\"toggle($event)\\\" [attr.id]=\\\"textfieldId\\\"> {{ text || placeholder }} </div> <span class=\\\"mdl-select__toggle material-icons\\\" (click)=\\\"toggle($event)\\\"> keyboard_arrow_down </span> <label class=\\\"mdl-textfield__label\\\" [attr.for]=\\\"textfieldId\\\"></label> <span class=\\\"mdl-textfield__error\\\"></span> <mdl-popover hide-on-click=\\\"!multiple\\\" [style.width.%]=\\\"100\\\"> <div class=\\\"mdl-list mdl-shadow--6dp\\\"> <ng-content></ng-content> </div> </mdl-popover> </div> \",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n            providers: [MDL_SELECT_VALUE_ACCESSOR]\n        }), \n        __metadata$1('design:paramtypes', [_angular_core.ChangeDetectorRef])\n    ], MdlSelectComponent);\n    return MdlSelectComponent;\n}());\nvar MdlSelectModule = (function () {\n    function MdlSelectModule() {\n    }\n    MdlSelectModule.forRoot = function () {\n        return {\n            ngModule: MdlSelectModule,\n            providers: []\n        };\n    };\n    MdlSelectModule = __decorate$1([\n        _angular_core.NgModule({\n            imports: [\n                _angular_common.CommonModule,\n                MdlPopoverModule\n            ],\n            exports: [\n                MdlSelectComponent,\n                MdlOptionComponent\n            ],\n            declarations: [\n                MdlSelectComponent,\n                MdlOptionComponent\n            ],\n            providers: [\n                MDL_SELECT_VALUE_ACCESSOR\n            ]\n        }), \n        __metadata$1('design:paramtypes', [])\n    ], MdlSelectModule);\n    return MdlSelectModule;\n}());\n\nexports.MdlOptionComponent = MdlOptionComponent;\nexports.MdlSelectComponent = MdlSelectComponent;\nexports.MdlSelectModule = MdlSelectModule;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/@angular2-mdl-ext/select/index.umd.js\n ** module id = 531\n ** module chunks = 2\n **/","//Imports\nimport {NgModule} from '@angular/core'\nimport {RouterModule} from \"@angular/router\";\nimport {FormsModule, ReactiveFormsModule} from \"@angular/forms\";\nimport {BrowserModule} from \"@angular/platform-browser\";\nimport {HttpModule} from \"@angular/http\";\n//Import angular2-mdl\nimport {MdlModule} from 'angular2-mdl';\nimport {MdlSelectModule} from '@angular2-mdl-ext/select';\nimport {MdlPopoverModule} from '@angular2-mdl-ext/popover';\nimport {Ng2MaterialModule} from \"ng2-material\";\nimport {MaterialModule} from \"@angular/material\";\nimport {ChartsModule} from 'ng2-charts/ng2-charts';\nimport {Md2Module}  from 'md2';\nimport { Ng2CompleterModule } from 'ng2-completer';\n\n//Declarations\nimport {AppRoutes} from \"./shared/routing/app.routes\";\nimport {LayoutComponent} from \"./shared/layout/layout.component\";\nimport {BaseChartDirective} from 'ng2-charts/ng2-charts';\n\n// Pages\nimport {MainDashboardComponent} from \"./pages/dashboards/main/dashboard.component\";\nimport {ByDayDashboardComponent} from \"./pages/dashboards/by-day/dashboard.component\";\nimport {ByMonthDashboardComponent} from \"./pages/dashboards/by-month/dashboard.component\";\nimport {SpendByDayDashboardComponent} from \"./pages/dashboards/ads-by-day/dashboard.component\";\nimport {BalanceByDayDashboardComponent} from \"./pages/dashboards/balance-by-day/dashboard.component\";\nimport {RevBySubidDashboardComponent} from \"./pages/dashboards/revenue-by-subid/dashboard.component\";\nimport {DataByNetworkDashboardComponent} from \"./pages/dashboards/data-by-network/dashboard.component\";\nimport {RevAnalysisDashboardComponent} from \"./pages/dashboards/revenue-analysis/dashboard.component\";\nimport {SubidsDashboardComponent} from \"./pages/dashboards/sub-ids/dashboard.component\";\nimport {BillingStatementsDashboardComponent} from \"./pages/dashboards/billing-statements/dashboard.component\";\nimport {CreditCardsDashboardComponent} from \"./pages/dashboards/credit-cards/dashboard.component\";\nimport {RevSplitValuesDashboardComponent} from \"./pages/dashboards/rev-split-values/dashboard.component\";\nimport {GatewayDataDashboardComponent} from \"./pages/dashboards/gateway-data/dashboard.component\";\nimport {TonicTodayDashboardComponent} from \"./pages/dashboards/tonic-today/dashboard.component\";\nimport {IsoDataDashboardComponent} from \"./pages/dashboards/iso-data/dashboard.component\";\nimport {RevDailyDashboardComponent} from \"./pages/dashboards/revenue-daily/dashboard.component\";\nimport {NetworksDashboardComponent} from \"./pages/dashboards/networks/dashboard.component\";\nimport {SpendAnalysisDashboardComponent} from \"./pages/dashboards/spend-analysis/dashboard.component\";\nimport {GatewayStatusDashboardComponent} from \"./pages/dashboards/gateway-status/dashboard.component\";\nimport {CBTrackerDashboardComponent} from \"./pages/dashboards/cb-tracker/dashboard.component\";\nimport {TrafficConversionsDashboardComponent} from \"./pages/dashboards/edw-traffic-conversions/dashboard.component\";\nimport {AIMSalesComponent} from \"./pages/dashboards/aim-sales/dashboard.component\";\nimport {BillingPerformanceDashboardComponent} from \"./pages/dashboards/edw-billing-performance/dashboard.component\";\nimport {EDWVisitorIdReportComponent} from \"./pages/dashboards/edw-visitor-id-report/dashboard.component\";\nimport {EDWVisitorIdPivotedReportComponent} from \"./pages/dashboards/edw-visitor-id-pivoted/dashboard.component\";\nimport {PAndLDashboardComponent} from \"./pages/dashboards/pandl/dashboard.component\";\n\n// Chars & Stats & Components\nimport {ByNetworkComponent} from './components/chartjs/by-network/by-network';\nimport {ByDayComponent} from './components/chartjs/by-day/by-day';\nimport {ByMonthComponent} from './components/chartjs/by-month/by-month';\nimport {TypeByDayComponent} from './components/chartjs/type-by-day/by-day';\n\n// Login components\nimport {AuthenticationService} from './shared/services/authentication.service';\nimport {AlertService} from './shared/services/alert.service';\nimport {LoginComponent} from './auth/login.component';\nimport {AuthCallbackComponent} from './auth-callback/auth-callback.component';\nimport {AuthGuard} from './auth/auth.guard';\nimport {customHttpProvider} from './shared/http/custom-http';\n\n// Editors\nimport {SubidEditorComponent} from './components/editors/subids/subid.component';\nimport {RemapConfirmationPwdComponent} from './components/editors/remap-confirmation-pwd/dashboard.component';\nimport {RevSplitValuesEditorComponent} from './components/editors/rev-split-values/dashboard.component';\n\n@NgModule({\n  declarations: [\n    LayoutComponent, \n    MainDashboardComponent, ByDayDashboardComponent, ByMonthDashboardComponent, SpendByDayDashboardComponent,\n    BalanceByDayDashboardComponent, RevBySubidDashboardComponent, DataByNetworkDashboardComponent,\n    RevAnalysisDashboardComponent, SubidsDashboardComponent, BillingStatementsDashboardComponent, CreditCardsDashboardComponent, RevSplitValuesDashboardComponent, \n    GatewayDataDashboardComponent, TonicTodayDashboardComponent, IsoDataDashboardComponent, RevDailyDashboardComponent,\n    NetworksDashboardComponent, SpendAnalysisDashboardComponent, GatewayStatusDashboardComponent, CBTrackerDashboardComponent,\n    TrafficConversionsDashboardComponent, AIMSalesComponent, BillingPerformanceDashboardComponent, EDWVisitorIdReportComponent, \n    EDWVisitorIdPivotedReportComponent, PAndLDashboardComponent, ByNetworkComponent, ByDayComponent, ByMonthComponent, TypeByDayComponent,\n    SubidEditorComponent, RemapConfirmationPwdComponent, RevSplitValuesEditorComponent, LoginComponent, AuthCallbackComponent\n  ],\n  imports: [\n    BrowserModule, FormsModule, ReactiveFormsModule, \n    HttpModule, MdlModule, MdlSelectModule, MdlPopoverModule, Ng2MaterialModule, MaterialModule, ChartsModule, Ng2CompleterModule,\n    Md2Module.forRoot(),\n    RouterModule.forRoot(AppRoutes)\n  ],\n  providers: [AuthGuard, AuthenticationService, AlertService, customHttpProvider],\n  bootstrap: [LayoutComponent]\n})\nexport class AppModule {\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/app.module.ts\n **/","import {Component, Input, Output, OnInit, EventEmitter} from '@angular/core';\n\n@Component({\n  selector: 'remap-confirmation-pwd',\n  template: require('./dashboard.component.html'),\n  providers: []\n})\nexport class RemapConfirmationPwdComponent implements OnInit{\n  \n  constructor() { \n\n  }\n  \n  passwordInput: string;\n  @Output() passwordEvent = new EventEmitter<string>();\n\n  ngOnInit(): void {\n  }\n\n  onChangeInput() {\n    this.passwordEvent.emit(this.passwordInput);\n  }\n \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/editors/remap-confirmation-pwd/dashboard.component.ts\n **/","import {Component, Input, OnInit} from '@angular/core';\n\n@Component({\n  selector: 'rev-split-values-editor',\n  template: require('./dashboard.component.html'),\n  providers: []\n})\nexport class RevSplitValuesEditorComponent implements OnInit{\n  \n  _revSplitValue = {};\n  channels: any[] = [];\n  domains: any[] = [];\n\n  @Input() \n  set revSplitValue(revSplitValue){\n      this._revSplitValue = revSplitValue;\n  };\n\n  constructor() { }\n\n  ngOnInit(): void {\n    this.loadComponents()\n  }\n\n  loadComponents(){\n  }\n\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/editors/rev-split-values/dashboard.component.ts\n **/","import {Component, Input, OnInit} from '@angular/core';\nimport { SettingsService } from '../../../shared/services/settings.service';\n\n@Component({\n  selector: 'subid-editor',\n  template: require('./subid.component.html'),\n  providers: [SettingsService]\n})\nexport class SubidEditorComponent implements OnInit{\n  \n  _subid = {};\n  channels: any[] = [];\n  domains: any[] = [];\n  originatingDomains: any[] = [];\n  subChannels: any[] = [];\n  audiences: any[] = [];\n\n  @Input() \n  set subid(subid){\n      this._subid = subid;\n  };\n\n  constructor(private settingsService: SettingsService) { }\n\n  ngOnInit(): void {\n    this.loadComponents()\n  }\n  private sortArrayOfObjects(arrayToSort, key) {\n    function compareObjects(a, b) {\n        if (a[key] < b[key])\n            return -1;\n        if (a[key] > b[key])\n            return 1;\n        return 0;\n    }\n    return arrayToSort.sort(compareObjects);\n  }\n\n  loadChannels(){\n    this.channels.push( { id: 1, name : 'All channels', key : '' } );\n    this.settingsService.getChannels().then(response => {\n      const channelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      channelsFromResponse.forEach( (channel: any) => {\n        if (channel.name !== \"All channels\") {\n          this.channels.push(channel);\n        }\n      })\n    });\n  }\n\n  loadDomains(){\n    this.domains.push( { id: 1, name : 'All domains', key : '' } );\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.domains.push(domain);\n        }\n      })      \n    });\n  }\n\n  loadOriginatingDomains(){\n    this.originatingDomains.push( { id: 1, name : 'All domains', key : '' } );\n    this.settingsService.getDomains().then(response => { \n      const domainsFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      domainsFromResponse.forEach( (domain: any) => {\n        idCounter += 1;\n        domain.id = idCounter;\n        var domainsBlackList = [\"FinanceAr\", \"FinanceBr\", \"FinanceMx\", \"HousingAr\", \"HousingBr\", \"HousingMx\", \"JobsAr\", \"JobsBr\", \"JobsMx\"];\n        if (domain.name !== \"All domains\" && !domainsBlackList.includes(domain.name)) {\n          this.originatingDomains.push(domain);\n        }\n      })      \n    });\n  }  \n\n  loadSubChannels(){\n    this.subChannels.push( { id: 1, name : 'All sub channels', key : '' } );\n    this.settingsService.getSubChannels().then(response => {\n      const subChannelsFromResponse = this.sortArrayOfObjects(response.data, 'name');\n      subChannelsFromResponse.forEach( (subChannel: any) => {\n        if (subChannel.name !== \"All sub channels\") {\n          this.subChannels.push(subChannel);\n        }\n      })\n    });\n  }\n\n  loadAudiences () {\n    this.audiences.push( { id: 1, name : 'All signals', key : '' } );\n    this.settingsService.getAudiences().then(response => { \n      const audiencesFromResponse = this.sortArrayOfObjects(response, 'name');\n      var idCounter = 1;\n      audiencesFromResponse.forEach( (audience: any) => {\n        idCounter += 1;\n        audience.id = idCounter;\n        if (audience.name !== \"All signals\") {\n          this.audiences.push(audience);\n        }\n      })\n    });\n  }\n\n  loadComponents(){\n    this.loadChannels();\n    this.loadDomains();\n    this.loadOriginatingDomains();\n    this.loadSubChannels();\n    this.loadAudiences();\n  }\n \n  onChangeChannel(value: any) {\n        //value = value - 1;\n        //this.channel = this.channels[value].name;\n        //this.channelkey = this.channels[value].key;        \n  }\n  \n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/components/editors/subids/subid.component.ts\n **/","import {Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\nimport {Router} from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\n\nimport {StatsService} from '../../../shared/services/stats.service';\nimport {ByMonthComponent} from './../../../components/chartjs/by-month/by-month';\n\n@Component({\n  selector: 'dashboard-by-month',\n  template: require('./dashboard.component.html'),\n  providers: [StatsService]\n})\n\nexport class ByMonthDashboardComponent implements OnInit {\n  @ViewChild(ByMonthComponent) thechart:ByMonthComponent;\n\n  ranges: any[] = [];\n  rangeId: any = 1;\n  form: FormGroup;\n\n  private fromDate: any = new Date();\n  private toDate: any = new Date();\n  private query: any = {};\n\n  constructor(private statsService: StatsService,\n              private router: Router) { }\n\n  private initRange(){\n    // move all 7 days (delay in data)\n    this.toDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() );\n\n    // -30 days\n    this.fromDate = new Date( this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate() - 30 );\n\n    this.ranges.push( { id: 1, name : 'All networks', fromDate : this.fromDate, toDate: this.toDate, query : { network_type : 'network'} } );\n\n    var network = { query : { network_name : 'tonic' } , description : 'Tonic'} ;\n    this.ranges.push( { id: 2, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'validclick' } , description : 'Valid Click'} ;\n    this.ranges.push( { id: 3, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'h2h' } , description : 'H2H'} ;\n    this.ranges.push( { id: 4, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'diablo' } , description : 'Diablo'} ;\n    this.ranges.push( { id: 5, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'conduit' } , description : 'Conduit'} ;\n    this.ranges.push( { id: 6, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'w4' } , description : 'W4'} ;\n    this.ranges.push( { id: 7, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n    network = { query : { network_name : 'mediaalpha' } , description : 'Media Alpha'} ;\n    this.ranges.push( { id: 8, name : network.description, fromDate : this.fromDate, toDate: this.toDate, query : network.query } );\n\n  }\n\n  onChange(value: any) {\n        value = value - 1;\n        console.log('year=', this.ranges[value].year);\n        this.fromDate = this.ranges[value].fromDate;\n        this.toDate = this.ranges[value].toDate;\n        this.thechart.load( this.ranges[value].fromDate, this.ranges[value].toDate, this.ranges[value].query );\n  }\n\n  ngOnInit(): void {\n    this.initRange();\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/pages/dashboards/by-month/dashboard.component.ts\n **/","import { Injectable } from \"@angular/core\";\nimport { ConnectionBackend, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Http, Headers } from \"@angular/http\";\n//import { appConfig } from '../app.config';\n \nimport { Observable } from \"rxjs/Observable\";\nimport 'rxjs/add/operator/catch';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/observable/throw';\n \n@Injectable()\nexport class CustomHttp extends Http {\n    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {\n        super(backend, defaultOptions);\n    }\n \n    get(url: string, options?: RequestOptionsArgs): Observable<Response> {\n        //return super.get(appConfig.apiUrl + url, this.addJwt(options)).catch(this.handleError);\n        return super.get( url, this.addJwt(options)).catch(this.handleError);\n    }\n \n    post(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {\n        //return super.post(appConfig.apiUrl + url, body, this.addJwt(options)).catch(this.handleError);\n        return super.post( url, body, this.addJwt(options)).catch(this.handleError);\n    }\n \n    put(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {\n        //return super.put(appConfig.apiUrl + url, body, this.addJwt(options)).catch(this.handleError);\n        return super.put( url, body, this.addJwt(options)).catch(this.handleError);\n    }\n \n    delete(url: string, options?: RequestOptionsArgs): Observable<Response> {\n        //return super.delete(appConfig.apiUrl + url, this.addJwt(options)).catch(this.handleError);\n        return super.delete( url, this.addJwt(options)).catch(this.handleError);\n    }\n \n    // private helper methods\n \n    private addJwt(options?: RequestOptionsArgs): RequestOptionsArgs {\n        // ensure request options and headers are not null\n        options = options || new RequestOptions();\n        options.headers = options.headers || new Headers({'Content-Type': 'application/json'});\n \n        // add authorization header with jwt token\n        let currentUser = JSON.parse(localStorage.getItem('currentUser'));\n        if (currentUser && currentUser.token) {\n            options.headers.append('Authorization', 'Bearer ' + currentUser.token);\n        }\n \n        return options;\n    }\n \n    private handleError(error: any) {\n        if (error.status === 401) {\n            // 401 unauthorized response so log user out of client\n            window.location.href = '/login';\n        }\n \n        return Observable.throw(error._body);\n    }\n}\n \nexport function customHttpFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http {\n    return new CustomHttp(xhrBackend, requestOptions);\n}\n \nexport let customHttpProvider = {\n    provide: Http,\n    useFactory: customHttpFactory,\n    deps: [XHRBackend, RequestOptions]\n};\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/http/custom-http.ts\n **/","import { Component, Output } from '@angular/core';\nimport { ActivatedRoute, Router, Routes } from '@angular/router';\nimport { MdlLayoutComponent } from 'angular2-mdl';\nimport { AuthGuard } from './../../auth/auth.guard';\n\n@Component({\n  selector: 'root-layout',\n  template: require('./layout.component.html'),\n  styles: [require('./layout.component.css')]\n})\n\nexport class LayoutComponent {\n\n  public title = 'Revenue Platform';\n\n  constructor(private authGuard: AuthGuard) {\n    //this.refreshMaterials();\n  }\n\n  @Output() \n  get isauth(){\n      return this.authGuard.isUserAuthenticated();\n  };\n\n\n  public componentSelected(mainLayout: MdlLayoutComponent) {\n    mainLayout.closeDrawer();\n  }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/layout/layout.component.ts\n **/","import {Routes} from '@angular/router';\nimport { AuthGuard } from './../../auth/auth.guard';\nimport { LoginComponent } from './../../auth/login.component';\nimport { AuthCallbackComponent } from './../../auth-callback/auth-callback.component';\nimport {MainDashboardComponent} from './../../pages/dashboards/main/dashboard.component';\nimport {ByDayDashboardComponent} from './../../pages/dashboards/by-day/dashboard.component';\nimport {ByMonthDashboardComponent} from './../../pages/dashboards/by-month/dashboard.component';\nimport {SpendByDayDashboardComponent} from './../../pages/dashboards/ads-by-day/dashboard.component';\nimport {BalanceByDayDashboardComponent} from './../../pages/dashboards/balance-by-day/dashboard.component';\nimport {RevBySubidDashboardComponent} from './../../pages/dashboards/revenue-by-subid/dashboard.component';\nimport {DataByNetworkDashboardComponent} from './../../pages/dashboards/data-by-network/dashboard.component';\nimport {RevAnalysisDashboardComponent} from './../../pages/dashboards/revenue-analysis/dashboard.component';\nimport {SubidsDashboardComponent} from './../../pages/dashboards/sub-ids/dashboard.component';\nimport {BillingStatementsDashboardComponent} from './../../pages/dashboards/billing-statements/dashboard.component';\nimport {CreditCardsDashboardComponent} from './../../pages/dashboards/credit-cards/dashboard.component';\nimport {RevSplitValuesDashboardComponent} from './../../pages/dashboards/rev-split-values/dashboard.component';\nimport {GatewayDataDashboardComponent} from './../../pages/dashboards/gateway-data/dashboard.component';\nimport {TonicTodayDashboardComponent} from './../../pages/dashboards/tonic-today/dashboard.component';\nimport {IsoDataDashboardComponent} from './../../pages/dashboards/iso-data/dashboard.component';\nimport {RevDailyDashboardComponent} from './../../pages/dashboards/revenue-daily/dashboard.component';\nimport {NetworksDashboardComponent} from './../../pages/dashboards/networks/dashboard.component';\nimport {SpendAnalysisDashboardComponent} from './../../pages/dashboards/spend-analysis/dashboard.component';\nimport {GatewayStatusDashboardComponent} from './../../pages/dashboards/gateway-status/dashboard.component';\nimport {CBTrackerDashboardComponent} from './../../pages/dashboards/cb-tracker/dashboard.component';\nimport {TrafficConversionsDashboardComponent} from './../../pages/dashboards/edw-traffic-conversions/dashboard.component';\nimport {AIMSalesComponent} from \"./../../pages/dashboards/aim-sales/dashboard.component\";\nimport {BillingPerformanceDashboardComponent} from './../../pages/dashboards/edw-billing-performance/dashboard.component';\nimport {EDWVisitorIdReportComponent} from './../../pages/dashboards/edw-visitor-id-report/dashboard.component';\nimport {EDWVisitorIdPivotedReportComponent} from './../../pages/dashboards/edw-visitor-id-pivoted/dashboard.component';\nimport {PAndLDashboardComponent} from './../../pages/dashboards/pandl/dashboard.component';\n\nexport const AppRoutes: Routes = [\n  {path: '', redirectTo: 'dashboard', pathMatch: 'full', canActivate: [AuthGuard] },\n  {path: 'login', component : LoginComponent },\n  {path: 'logout', component : LoginComponent },\n  {path: 'auth-callback', component : AuthCallbackComponent },\n  {path: 'dashboard', component: MainDashboardComponent, data: {title: 'Dashboard'}, canActivate: [AuthGuard] },\n  {path: 'bydayrevenue', component: ByDayDashboardComponent, data: {title: 'Revenue (by day)'}, canActivate: [AuthGuard] },\n  {path: 'bydayspend', component: SpendByDayDashboardComponent, data: {title: 'Spend (by day)'}, canActivate: [AuthGuard] },\n  {path: 'bydaybalance', component: BalanceByDayDashboardComponent, data: { title: 'Balance (by day)'}, canActivate: [AuthGuard] },\n  {path: 'bysubid', component: RevBySubidDashboardComponent, data: { title: 'Revenue (by subid)'}, canActivate: [AuthGuard] },\n  {path: 'bynetwork', component: DataByNetworkDashboardComponent, data: { title: 'Data (by net)'}, canActivate: [AuthGuard] },\n  {path: 'revenue-daily', component: RevDailyDashboardComponent, data: { title: 'Revenue (daily)'}, canActivate: [AuthGuard] },\n  {path: 'revenue-analysis', component: RevAnalysisDashboardComponent, data: { title: 'Revenue Analysis'}, canActivate: [AuthGuard] },\n  {path: 'spend-analysis', component: SpendAnalysisDashboardComponent, data: { title: 'Spend Analysis'}, canActivate: [AuthGuard] },\n  {path: 'pandl', component: PAndLDashboardComponent, data: { title: 'P & L'}, canActivate: [AuthGuard] },\n  {path: 'sub-ids', component: SubidsDashboardComponent, data: { title: 'Sub ids'}, canActivate: [AuthGuard] },\n  {path: 'billing-statements', component: BillingStatementsDashboardComponent, data: { title: 'Billing Statements'}, canActivate: [AuthGuard] },\n  {path: 'credit-cards', component: CreditCardsDashboardComponent, data: { title: 'Credit Cards'}, canActivate: [AuthGuard] },\n  {path: 'rev-split-values', component: RevSplitValuesDashboardComponent, data: { title: 'Rev Share Values'}, canActivate: [AuthGuard] },\n  {path: 'networks', component: NetworksDashboardComponent, data: { title: 'Networks'}, canActivate: [AuthGuard] },\n  {path: 'gateway-data', component: GatewayDataDashboardComponent, data: { title: 'Gateway'}, canActivate: [AuthGuard] },\n  {path: 'gateway-status', component: GatewayStatusDashboardComponent, data: { title: 'G Status'}, canActivate: [AuthGuard] },\n  {path: 'cb-tracker', component: CBTrackerDashboardComponent, data: { title: 'CB. Tracker'}, canActivate: [AuthGuard] },\n  {path: 'traffic-conversions', component: TrafficConversionsDashboardComponent, data: { title: 'EDW Traffic Conversions'}, canActivate: [AuthGuard] },\n  {path: 'aim-sales', component: AIMSalesComponent, data: { title: 'AIM Sales'}, canActivate: [AuthGuard] },\n  {path: 'billing-performance', component: BillingPerformanceDashboardComponent, data: { title: 'EDW Billing Performance'}, canActivate: [AuthGuard] },\n  {path: 'visitor-id-report', component: EDWVisitorIdReportComponent, data: { title: 'EDW Visitor ID'}, canActivate: [AuthGuard] },\n  {path: 'visitor-id-pivoted-report', component: EDWVisitorIdPivotedReportComponent, data: { title: 'EDW Visitor ID Pivoted'}, canActivate: [AuthGuard] },\n  {path: 'iso-data', component: IsoDataDashboardComponent, data: { title: 'Iso'}, canActivate: [AuthGuard] },\n  {path: 'tonic-today', component: TonicTodayDashboardComponent, data: { title: 'Tonic today'}, canActivate: [AuthGuard] },\n  { path: '**', redirectTo: '' }\n];\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/routing/app.routes.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n//import {DailyStats} from '../data/daily-stats';\n\n@Injectable()\nexport class ChargebacksService {\n\n  private baseURL = 'api/stats';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getDataByUser( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/chargebacks/byuser?aggregate='+aggregate;\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  getChargebacks( fromDate, toDate, query, aggregate ): Promise<any> {\n    var url  = '/chargebacks/transactions?aggregate='+aggregate;\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  getChargebacksReport( fromDate, toDate, query, creditcard, aggregate ): Promise<any> {\n    var url  = '/chargebacks/report?aggregate='+aggregate;\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query, creditcard: creditcard } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/chargebacks.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class CreditCardsService {\n    private baseURL = 'api/creditCardsStats';\n    \n    constructor(private http: Http) { }\n\n    post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n}\n \n    getData( fromDate, toDate, query ): Promise<any> {\n        var url  = '/data/credit-cards';\n        return this.post(fromDate, toDate, query, url);\n    }\n\n    private handleError(error: any): Promise<any> {\n        console.error('An error occurred getting data', error);\n        return Promise.reject(error.message || error);\n    }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/credits_cards.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n//import {DailyStats} from '../data/daily-stats';\n\n@Injectable()\nexport class IsoService {\n\n  private baseURL = 'api/stats';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getDataByUser( fromDate, toDate, query ): Promise<any> {\n    var url  = '/iso/byuser';\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/iso.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class RevSplitValuesService {\n\n  private baseURL = 'api/rev_split_values';  // URL to web api\n\n  constructor(private http: Http) { }\n\n  revSplitValuesMain( query ): Promise<any> {\n      if(query.history === false){\n        return this.revSplitValuesByNetwork( { status : 1, network_type : \"network\", network_name : query.network_name } );\n      }\n      else{\n        return this.revSplitValuesHistory( query );\n      }\n  }  \n\n  revSplitValuesByNetwork( query ): Promise<any> {\n    var url  = '/split_values_by_network';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }\n\n  revSplitValuesHistory( query ): Promise<any> {\n    var url  = '/split_values_history';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }  \n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n  saveRevSplitValue( revSplitValue ): Promise<any> {\n    var url  = '/save_split_values';\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( { revSplitValue: revSplitValue } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n  }  \n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/rev_split_values.service.ts\n **/","import { Injectable } from '@angular/core';\nimport { Headers, Http } from '@angular/http';\n\nimport 'rxjs/add/operator/toPromise';\n\n@Injectable()\nexport class TodayService {\n\n  private baseURL = 'api/stats';  // URL to web api\n\n  constructor(private http: Http) { }\n\n post( fromDate, toDate, query, url){\n    return this.http\n      .post(this.baseURL + url, JSON.stringify( {fromDate : fromDate, toDate: toDate, query: query } ))\n      .toPromise()\n      .then(response => response.json() as any)\n      .catch(this.handleError);\n }\n\n  getTodayBySubid( fromDate, toDate, query ): Promise<any> {\n    var url  = '/today/bysubid';\n    return this.post(fromDate, toDate, query, url);\n  }\n\n  private handleError(error: any): Promise<any> {\n    console.error('An error occurred getting data', error); // for demo purposes only\n    return Promise.reject(error.message || error);\n  }\n\n}\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/app/shared/services/today.service.ts\n **/","import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';\nimport {AppModule} from './app/app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n  .catch(err => console.error(err));\n\n\n\n/** WEBPACK FOOTER **\n ** node_modules/angular2-template-loader!./src/main.ts\n **/","(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/Subject'), require('@angular/common'), require('@angular/forms')) :\n   typeof define === 'function' && define.amd ? define(['exports', '@angular/core', 'rxjs/Subject', '@angular/common', '@angular/forms'], factory) :\n   (factory((global.ng = global.ng || {}, global.ng.md2 = global.ng.md2 || {}),global.ng.core,global.Rx,global.ng.common,global.ng.forms));\n}(this, (function (exports,_angular_core,rxjs_Subject,_angular_common,_angular_forms) { 'use strict';\n\nvar __decorate$1 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$1 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Shared directive to count lines inside a text area, such as a list item.\n * Line elements can be extracted with a @ContentChildren(MdLine) query, then\n * counted by checking the query list's length.\n */\nvar MdLine = (function () {\n    function MdLine() {\n    }\n    MdLine = __decorate$1([\n        _angular_core.Directive({ selector: '[md-line]' }), \n        __metadata$1('design:paramtypes', [])\n    ], MdLine);\n    return MdLine;\n}());\n/* Helper that takes a query list of lines and sets the correct class on the host */\nvar MdLineSetter = (function () {\n    function MdLineSetter(_lines, _renderer, _element) {\n        var _this = this;\n        this._lines = _lines;\n        this._renderer = _renderer;\n        this._element = _element;\n        this._setLineClass(this._lines.length);\n        this._lines.changes.subscribe(function () {\n            _this._setLineClass(_this._lines.length);\n        });\n    }\n    MdLineSetter.prototype._setLineClass = function (count) {\n        this._resetClasses();\n        if (count === 2 || count === 3) {\n            this._setClass(\"md-\" + count + \"-line\", true);\n        }\n        else if (count > 3) {\n            this._setClass(\"md-multi-line\", true);\n        }\n    };\n    MdLineSetter.prototype._resetClasses = function () {\n        this._setClass('md-2-line', false);\n        this._setClass('md-3-line', false);\n        this._setClass('md-multi-line', false);\n    };\n    MdLineSetter.prototype._setClass = function (className, bool) {\n        this._renderer.setElementClass(this._element.nativeElement, className, bool);\n    };\n    return MdLineSetter;\n}());\nvar MdLineModule = (function () {\n    function MdLineModule() {\n    }\n    MdLineModule = __decorate$1([\n        _angular_core.NgModule({\n            exports: [MdLine],\n            declarations: [MdLine],\n        }), \n        __metadata$1('design:paramtypes', [])\n    ], MdLineModule);\n    return MdLineModule;\n}());\n\nvar __decorate$2 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$2 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive to listen to changes of direction of part of the DOM.\n *\n * Applications should use this directive instead of the native attribute so that Material\n * components can listen on changes of direction.\n */\nvar Dir = (function () {\n    function Dir() {\n        this._dir = 'ltr';\n        this.dirChange = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(Dir.prototype, \"dir\", {\n        get: function () {\n            return this._dir;\n        },\n        set: function (v) {\n            var old = this._dir;\n            this._dir = v;\n            if (old != this._dir) {\n                this.dirChange.emit();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Dir.prototype, \"value\", {\n        get: function () { return this.dir; },\n        set: function (v) { this.dir = v; },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$2([\n        _angular_core.Input('dir'), \n        __metadata$2('design:type', String)\n    ], Dir.prototype, \"_dir\", void 0);\n    __decorate$2([\n        _angular_core.Output(), \n        __metadata$2('design:type', Object)\n    ], Dir.prototype, \"dirChange\", void 0);\n    __decorate$2([\n        _angular_core.HostBinding('attr.dir'), \n        __metadata$2('design:type', String)\n    ], Dir.prototype, \"dir\", null);\n    Dir = __decorate$2([\n        _angular_core.Directive({\n            selector: '[dir]',\n            // TODO(hansl): maybe `$implicit` isn't the best option here, but for now that's the best we got.\n            exportAs: '$implicit'\n        }), \n        __metadata$2('design:paramtypes', [])\n    ], Dir);\n    return Dir;\n}());\nvar RtlModule = (function () {\n    function RtlModule() {\n    }\n    RtlModule.forRoot = function () {\n        return {\n            ngModule: RtlModule,\n            providers: []\n        };\n    };\n    RtlModule = __decorate$2([\n        _angular_core.NgModule({\n            exports: [Dir],\n            declarations: [Dir]\n        }), \n        __metadata$2('design:paramtypes', [])\n    ], RtlModule);\n    return RtlModule;\n}());\n\n/** TODO: internal */\nvar ForegroundRippleState;\n(function (ForegroundRippleState) {\n    ForegroundRippleState[ForegroundRippleState[\"NEW\"] = 0] = \"NEW\";\n    ForegroundRippleState[ForegroundRippleState[\"EXPANDING\"] = 1] = \"EXPANDING\";\n    ForegroundRippleState[ForegroundRippleState[\"FADING_OUT\"] = 2] = \"FADING_OUT\";\n})(ForegroundRippleState || (ForegroundRippleState = {}));\n/**\n * Wrapper for a foreground ripple DOM element and its animation state.\n * TODO: internal\n */\nvar ForegroundRipple = (function () {\n    function ForegroundRipple(rippleElement) {\n        this.rippleElement = rippleElement;\n        this.state = ForegroundRippleState.NEW;\n    }\n    return ForegroundRipple;\n}());\nvar RIPPLE_SPEED_PX_PER_SECOND = 1000;\nvar MIN_RIPPLE_FILL_TIME_SECONDS = 0.1;\nvar MAX_RIPPLE_FILL_TIME_SECONDS = 0.3;\n/**\n * Returns the distance from the point (x, y) to the furthest corner of a rectangle.\n */\nvar distanceToFurthestCorner = function (x, y, rect) {\n    var distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));\n    var distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));\n    return Math.sqrt(distX * distX + distY * distY);\n};\n/**\n * Helper service that performs DOM manipulations. Not intended to be used outside this module.\n * The constructor takes a reference to the ripple directive's host element and a map of DOM\n * event handlers to be installed on the element that triggers ripple animations.\n * This will eventually become a custom renderer once Angular support exists.\n * TODO: internal\n */\nvar RippleRenderer = (function () {\n    function RippleRenderer(_elementRef, _eventHandlers) {\n        this._eventHandlers = _eventHandlers;\n        this._rippleElement = _elementRef.nativeElement;\n        // The background div is created in createBackgroundIfNeeded when the ripple becomes enabled.\n        // This avoids creating unneeded divs when the ripple is always disabled.\n        this._backgroundDiv = null;\n    }\n    /** Creates the div for the ripple background, if it doesn't already exist. */\n    RippleRenderer.prototype.createBackgroundIfNeeded = function () {\n        if (!this._backgroundDiv) {\n            this._backgroundDiv = document.createElement('div');\n            this._backgroundDiv.classList.add('md-ripple-background');\n            this._rippleElement.appendChild(this._backgroundDiv);\n        }\n    };\n    /**\n     * Installs event handlers on the given trigger element, and removes event handlers from the\n     * previous trigger if needed.\n     */\n    RippleRenderer.prototype.setTriggerElement = function (newTrigger) {\n        var _this = this;\n        if (this._triggerElement !== newTrigger) {\n            if (this._triggerElement) {\n                this._eventHandlers.forEach(function (eventHandler, eventName) {\n                    _this._triggerElement.removeEventListener(eventName, eventHandler);\n                });\n            }\n            this._triggerElement = newTrigger;\n            if (this._triggerElement) {\n                this._eventHandlers.forEach(function (eventHandler, eventName) {\n                    _this._triggerElement.addEventListener(eventName, eventHandler);\n                });\n            }\n        }\n    };\n    /** Installs event handlers on the host element of the md-ripple directive. */\n    RippleRenderer.prototype.setTriggerElementToHost = function () {\n        this.setTriggerElement(this._rippleElement);\n    };\n    /** Removes event handlers from the current trigger element if needed. */\n    RippleRenderer.prototype.clearTriggerElement = function () {\n        this.setTriggerElement(null);\n    };\n    /**\n     * Creates a foreground ripple and sets its animation to expand and fade in from the position\n     * given by rippleOriginLeft and rippleOriginTop (or from the center of the <md-ripple>\n     * bounding rect if centered is true).\n     */\n    RippleRenderer.prototype.createForegroundRipple = function (rippleOriginLeft, rippleOriginTop, color, centered, radius, speedFactor, transitionEndCallback) {\n        var parentRect = this._rippleElement.getBoundingClientRect();\n        // Create a foreground ripple div with the size and position of the fully expanded ripple.\n        // When the div is created, it's given a transform style that causes the ripple to be displayed\n        // small and centered on the event location (or the center of the bounding rect if the centered\n        // argument is true). Removing that transform causes the ripple to animate to its natural size.\n        var startX = centered ? (parentRect.left + parentRect.width / 2) : rippleOriginLeft;\n        var startY = centered ? (parentRect.top + parentRect.height / 2) : rippleOriginTop;\n        var offsetX = startX - parentRect.left;\n        var offsetY = startY - parentRect.top;\n        var maxRadius = radius > 0 ? radius : distanceToFurthestCorner(startX, startY, parentRect);\n        var rippleDiv = document.createElement('div');\n        this._rippleElement.appendChild(rippleDiv);\n        rippleDiv.classList.add('md-ripple-foreground');\n        rippleDiv.style.left = (offsetX - maxRadius) + \"px\";\n        rippleDiv.style.top = (offsetY - maxRadius) + \"px\";\n        rippleDiv.style.width = 2 * maxRadius + \"px\";\n        rippleDiv.style.height = rippleDiv.style.width;\n        // If color input is not set, this will default to the background color defined in CSS.\n        rippleDiv.style.backgroundColor = color;\n        // Start the ripple tiny.\n        rippleDiv.style.transform = \"scale(0.001)\";\n        var fadeInSeconds = (1 / (speedFactor || 1)) * Math.max(MIN_RIPPLE_FILL_TIME_SECONDS, Math.min(MAX_RIPPLE_FILL_TIME_SECONDS, maxRadius / RIPPLE_SPEED_PX_PER_SECOND));\n        rippleDiv.style.transitionDuration = fadeInSeconds + \"s\";\n        // https://timtaubert.de/blog/2012/09/css-transitions-for-dynamically-created-dom-elements/\n        // Store the opacity to prevent this line as being seen as a no-op by optimizers.\n        this._opacity = window.getComputedStyle(rippleDiv).opacity;\n        rippleDiv.classList.add('md-ripple-fade-in');\n        // Clearing the transform property causes the ripple to animate to its full size.\n        rippleDiv.style.transform = '';\n        var ripple = new ForegroundRipple(rippleDiv);\n        ripple.state = ForegroundRippleState.EXPANDING;\n        rippleDiv.addEventListener('transitionend', function (event) { return transitionEndCallback(ripple, event); });\n    };\n    /** Fades out a foreground ripple after it has fully expanded and faded in. */\n    RippleRenderer.prototype.fadeOutForegroundRipple = function (ripple) {\n        ripple.classList.remove('md-ripple-fade-in');\n        ripple.classList.add('md-ripple-fade-out');\n    };\n    /** Removes a foreground ripple from the DOM after it has faded out. */\n    RippleRenderer.prototype.removeRippleFromDom = function (ripple) {\n        ripple.parentElement.removeChild(ripple);\n    };\n    /** Fades in the ripple background. */\n    RippleRenderer.prototype.fadeInRippleBackground = function (color) {\n        this._backgroundDiv.classList.add('md-ripple-active');\n        // If color is not set, this will default to the background color defined in CSS.\n        this._backgroundDiv.style.backgroundColor = color;\n    };\n    /** Fades out the ripple background. */\n    RippleRenderer.prototype.fadeOutRippleBackground = function () {\n        if (this._backgroundDiv) {\n            this._backgroundDiv.classList.remove('md-ripple-active');\n        }\n    };\n    return RippleRenderer;\n}());\n\nvar __decorate$3 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$3 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdRipple = (function () {\n    function MdRipple(_elementRef) {\n        var _this = this;\n        /**\n         * If set, the radius in pixels of foreground ripples when fully expanded. If unset, the radius\n         * will be the distance from the center of the ripple to the furthest corner of the host element's\n         * bounding rectangle.\n         */\n        this.maxRadius = 0;\n        /**\n         * If set, the normal duration of ripple animations is divided by this value. For example,\n         * setting it to 0.5 will cause the animations to take twice as long.\n         */\n        this.speedFactor = 1;\n        // These event handlers are attached to the element that triggers the ripple animations.\n        var eventHandlers = new Map();\n        eventHandlers.set('mousedown', function (event) { return _this._mouseDown(event); });\n        eventHandlers.set('click', function (event) { return _this._click(event); });\n        eventHandlers.set('mouseleave', function (event) { return _this._mouseLeave(event); });\n        this._rippleRenderer = new RippleRenderer(_elementRef, eventHandlers);\n    }\n    /** TODO: internal */\n    MdRipple.prototype.ngOnInit = function () {\n        // If no trigger element was explicity set, use the host element\n        if (!this.trigger) {\n            this._rippleRenderer.setTriggerElementToHost();\n        }\n        if (!this.disabled) {\n            this._rippleRenderer.createBackgroundIfNeeded();\n        }\n    };\n    /** TODO: internal */\n    MdRipple.prototype.ngOnDestroy = function () {\n        // Remove event listeners on the trigger element.\n        this._rippleRenderer.clearTriggerElement();\n    };\n    /** TODO: internal */\n    MdRipple.prototype.ngOnChanges = function (changes) {\n        // If the trigger element changed (or is being initially set), add event listeners to it.\n        var changedInputs = Object.keys(changes);\n        if (changedInputs.indexOf('trigger') !== -1) {\n            this._rippleRenderer.setTriggerElement(this.trigger);\n        }\n        if (!this.disabled) {\n            this._rippleRenderer.createBackgroundIfNeeded();\n        }\n    };\n    /**\n     * Responds to the start of a ripple animation trigger by fading the background in.\n     */\n    MdRipple.prototype.start = function () {\n        this._rippleRenderer.createBackgroundIfNeeded();\n        this._rippleRenderer.fadeInRippleBackground(this.backgroundColor);\n    };\n    /**\n     * Responds to the end of a ripple animation trigger by fading the background out, and creating a\n     * foreground ripple that expands from the event location (or from the center of the element if\n     * the \"centered\" property is set or forceCenter is true).\n     */\n    MdRipple.prototype.end = function (left, top, forceCenter) {\n        var _this = this;\n        if (forceCenter === void 0) { forceCenter = true; }\n        this._rippleRenderer.createForegroundRipple(left, top, this.color, this.centered || forceCenter, this.maxRadius, this.speedFactor, function (ripple, e) { return _this._rippleTransitionEnded(ripple, e); });\n        this._rippleRenderer.fadeOutRippleBackground();\n    };\n    MdRipple.prototype._rippleTransitionEnded = function (ripple, event) {\n        if (event.propertyName === 'opacity') {\n            // If the ripple finished expanding, start fading it out. If it finished fading out,\n            // remove it from the DOM.\n            switch (ripple.state) {\n                case ForegroundRippleState.EXPANDING:\n                    this._rippleRenderer.fadeOutForegroundRipple(ripple.rippleElement);\n                    ripple.state = ForegroundRippleState.FADING_OUT;\n                    break;\n                case ForegroundRippleState.FADING_OUT:\n                    this._rippleRenderer.removeRippleFromDom(ripple.rippleElement);\n                    break;\n            }\n        }\n    };\n    /**\n     * Called when the trigger element receives a mousedown event. Starts the ripple animation by\n     * fading in the background.\n     */\n    MdRipple.prototype._mouseDown = function (event) {\n        if (!this.disabled && event.button === 0) {\n            this.start();\n        }\n    };\n    /**\n     * Called when the trigger element receives a click event. Creates a foreground ripple and\n     * runs its animation.\n     */\n    MdRipple.prototype._click = function (event) {\n        if (!this.disabled && event.button === 0) {\n            // If screen and page positions are all 0, this was probably triggered by a keypress.\n            // In that case, use the center of the bounding rect as the ripple origin.\n            // FIXME: This fails on IE11, which still sets pageX/Y and screenX/Y on keyboard clicks.\n            var isKeyEvent = (event.screenX === 0 && event.screenY === 0 && event.pageX === 0 && event.pageY === 0);\n            this.end(event.pageX, event.pageY, isKeyEvent);\n        }\n    };\n    /**\n     * Called when the trigger element receives a mouseleave event. Fades out the background.\n     */\n    MdRipple.prototype._mouseLeave = function (event) {\n        // We can always fade out the background here; It's a no-op if it was already inactive.\n        this._rippleRenderer.fadeOutRippleBackground();\n    };\n    __decorate$3([\n        _angular_core.Input('md-ripple-trigger'), \n        __metadata$3('design:type', Object)\n    ], MdRipple.prototype, \"trigger\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-centered'), \n        __metadata$3('design:type', Boolean)\n    ], MdRipple.prototype, \"centered\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-disabled'), \n        __metadata$3('design:type', Boolean)\n    ], MdRipple.prototype, \"disabled\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-max-radius'), \n        __metadata$3('design:type', Number)\n    ], MdRipple.prototype, \"maxRadius\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-speed-factor'), \n        __metadata$3('design:type', Number)\n    ], MdRipple.prototype, \"speedFactor\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-color'), \n        __metadata$3('design:type', String)\n    ], MdRipple.prototype, \"color\", void 0);\n    __decorate$3([\n        _angular_core.Input('md-ripple-background-color'), \n        __metadata$3('design:type', String)\n    ], MdRipple.prototype, \"backgroundColor\", void 0);\n    __decorate$3([\n        _angular_core.HostBinding('class.md-ripple-focused'),\n        _angular_core.Input('md-ripple-focused'), \n        __metadata$3('design:type', Boolean)\n    ], MdRipple.prototype, \"focused\", void 0);\n    __decorate$3([\n        _angular_core.HostBinding('class.md-ripple-unbounded'),\n        _angular_core.Input('md-ripple-unbounded'), \n        __metadata$3('design:type', Boolean)\n    ], MdRipple.prototype, \"unbounded\", void 0);\n    MdRipple = __decorate$3([\n        _angular_core.Directive({\n            selector: '[md-ripple]',\n        }), \n        __metadata$3('design:paramtypes', [_angular_core.ElementRef])\n    ], MdRipple);\n    return MdRipple;\n}());\nvar MdRippleModule = (function () {\n    function MdRippleModule() {\n    }\n    MdRippleModule.forRoot = function () {\n        return {\n            ngModule: MdRippleModule,\n            providers: []\n        };\n    };\n    MdRippleModule = __decorate$3([\n        _angular_core.NgModule({\n            exports: [MdRipple],\n            declarations: [MdRipple],\n        }), \n        __metadata$3('design:paramtypes', [])\n    ], MdRippleModule);\n    return MdRippleModule;\n}());\n\n// TODO(kara): Revisit why error messages are not being properly set.\nvar __extends$3 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * Wrapper around Error that sets the error message.\n */\nvar MdError = (function (_super) {\n    __extends$3(MdError, _super);\n    function MdError(value) {\n        _super.call(this);\n        this.message = value;\n    }\n    return MdError;\n}(Error));\n\nvar __extends$2 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/** Exception thrown when attempting to attach a null portal to a host. */\nvar MdNullPortalError = (function (_super) {\n    __extends$2(MdNullPortalError, _super);\n    function MdNullPortalError() {\n        _super.call(this, 'Must provide a portal to attach');\n    }\n    return MdNullPortalError;\n}(MdError));\n/** Exception thrown when attempting to attach a portal to a host that is already attached. */\nvar MdPortalAlreadyAttachedError = (function (_super) {\n    __extends$2(MdPortalAlreadyAttachedError, _super);\n    function MdPortalAlreadyAttachedError() {\n        _super.call(this, 'Host already has a portal attached');\n    }\n    return MdPortalAlreadyAttachedError;\n}(MdError));\n/** Exception thrown when attempting to attach a portal to an already-disposed host. */\nvar MdPortalHostAlreadyDisposedError = (function (_super) {\n    __extends$2(MdPortalHostAlreadyDisposedError, _super);\n    function MdPortalHostAlreadyDisposedError() {\n        _super.call(this, 'This PortalHost has already been disposed');\n    }\n    return MdPortalHostAlreadyDisposedError;\n}(MdError));\n/** Exception thrown when attempting to attach an unknown portal type. */\nvar MdUnknownPortalTypeError = (function (_super) {\n    __extends$2(MdUnknownPortalTypeError, _super);\n    function MdUnknownPortalTypeError() {\n        _super.call(this, 'Attempting to attach an unknown Portal type. ' +\n            'BasePortalHost accepts either a ComponentPortal or a TemplatePortal.');\n    }\n    return MdUnknownPortalTypeError;\n}(MdError));\n/** Exception thrown when attempting to attach a portal to a null host. */\nvar MdNullPortalHostError = (function (_super) {\n    __extends$2(MdNullPortalHostError, _super);\n    function MdNullPortalHostError() {\n        _super.call(this, 'Attempting to attach a portal to a null PortalHost');\n    }\n    return MdNullPortalHostError;\n}(MdError));\n/** Exception thrown when attempting to detach a portal that is not attached. */\nvar MdNoPortalAttachedError = (function (_super) {\n    __extends$2(MdNoPortalAttachedError, _super);\n    function MdNoPortalAttachedError() {\n        _super.call(this, 'Attempting to detach a portal that is not attached to a host');\n    }\n    return MdNoPortalAttachedError;\n}(MdError));\n\nvar __extends$1 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalHost`.\n */\nvar Portal = (function () {\n    function Portal() {\n    }\n    /** Attach this portal to a host. */\n    Portal.prototype.attach = function (host) {\n        if (host == null) {\n            throw new MdNullPortalHostError();\n        }\n        if (host.hasAttached()) {\n            throw new MdPortalAlreadyAttachedError();\n        }\n        this._attachedHost = host;\n        return host.attach(this);\n    };\n    /** Detach this portal from its host */\n    Portal.prototype.detach = function () {\n        var host = this._attachedHost;\n        if (host == null) {\n            throw new MdNoPortalAttachedError();\n        }\n        this._attachedHost = null;\n        return host.detach();\n    };\n    Object.defineProperty(Portal.prototype, \"isAttached\", {\n        /** Whether this portal is attached to a host. */\n        get: function () {\n            return this._attachedHost != null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets the PortalHost reference without performing `attach()`. This is used directly by\n     * the PortalHost when it is performing an `attach()` or `detach()`.\n     */\n    Portal.prototype.setAttachedHost = function (host) {\n        this._attachedHost = host;\n    };\n    return Portal;\n}());\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nvar ComponentPortal = (function (_super) {\n    __extends$1(ComponentPortal, _super);\n    function ComponentPortal(component, viewContainerRef, injector) {\n        if (viewContainerRef === void 0) { viewContainerRef = null; }\n        if (injector === void 0) { injector = null; }\n        _super.call(this);\n        this.component = component;\n        this.viewContainerRef = viewContainerRef;\n        this.injector = injector;\n    }\n    return ComponentPortal;\n}(Portal));\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nvar TemplatePortal = (function (_super) {\n    __extends$1(TemplatePortal, _super);\n    function TemplatePortal(template, viewContainerRef) {\n        _super.call(this);\n        /**\n         * Additional locals for the instantiated embedded view.\n         * These locals can be seen as \"exports\" for the template, such as how ngFor has\n         * index / event / odd.\n         * See https://angular.io/docs/ts/latest/api/core/EmbeddedViewRef-class.html\n         */\n        this.locals = new Map();\n        this.templateRef = template;\n        this.viewContainerRef = viewContainerRef;\n    }\n    Object.defineProperty(TemplatePortal.prototype, \"origin\", {\n        get: function () {\n            return this.templateRef.elementRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TemplatePortal.prototype.attach = function (host, locals) {\n        this.locals = locals == null ? new Map() : locals;\n        return _super.prototype.attach.call(this, host);\n    };\n    TemplatePortal.prototype.detach = function () {\n        this.locals = new Map();\n        return _super.prototype.detach.call(this);\n    };\n    return TemplatePortal;\n}(Portal));\n/**\n * Partial implementation of PortalHost that only deals with attaching either a\n * ComponentPortal or a TemplatePortal.\n */\nvar BasePortalHost = (function () {\n    function BasePortalHost() {\n        /** Whether this host has already been permanently disposed. */\n        this._isDisposed = false;\n    }\n    /** Whether this host has an attached portal. */\n    BasePortalHost.prototype.hasAttached = function () {\n        return this._attachedPortal != null;\n    };\n    BasePortalHost.prototype.attach = function (portal) {\n        if (portal == null) {\n            throw new MdNullPortalError();\n        }\n        if (this.hasAttached()) {\n            throw new MdPortalAlreadyAttachedError();\n        }\n        if (this._isDisposed) {\n            throw new MdPortalHostAlreadyDisposedError();\n        }\n        if (portal instanceof ComponentPortal) {\n            this._attachedPortal = portal;\n            return this.attachComponentPortal(portal);\n        }\n        else if (portal instanceof TemplatePortal) {\n            this._attachedPortal = portal;\n            return this.attachTemplatePortal(portal);\n        }\n        throw new MdUnknownPortalTypeError();\n    };\n    BasePortalHost.prototype.detach = function () {\n        if (this._attachedPortal) {\n            this._attachedPortal.setAttachedHost(null);\n        }\n        this._attachedPortal = null;\n        if (this._disposeFn != null) {\n            this._disposeFn();\n            this._disposeFn = null;\n        }\n    };\n    BasePortalHost.prototype.dispose = function () {\n        if (this.hasAttached()) {\n            this.detach();\n        }\n        this._isDisposed = true;\n    };\n    BasePortalHost.prototype.setDisposeFn = function (fn) {\n        this._disposeFn = fn;\n    };\n    return BasePortalHost;\n}());\n\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$4 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$4 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n *\n * Usage:\n * <template portal #greeting>\n *   <p> Hello {{name}} </p>\n * </template>\n */\nvar TemplatePortalDirective = (function (_super) {\n    __extends(TemplatePortalDirective, _super);\n    function TemplatePortalDirective(templateRef, viewContainerRef) {\n        _super.call(this, templateRef, viewContainerRef);\n    }\n    TemplatePortalDirective = __decorate$4([\n        _angular_core.Directive({\n            selector: '[portal]',\n            exportAs: 'portal',\n        }), \n        __metadata$4('design:paramtypes', [_angular_core.TemplateRef, _angular_core.ViewContainerRef])\n    ], TemplatePortalDirective);\n    return TemplatePortalDirective;\n}(TemplatePortal));\n/**\n * Directive version of a PortalHost. Because the directive *is* a PortalHost, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * <template [portalHost]=\"greeting\"></template>\n */\nvar PortalHostDirective = (function (_super) {\n    __extends(PortalHostDirective, _super);\n    function PortalHostDirective(_componentFactoryResolver, _viewContainerRef) {\n        _super.call(this);\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._viewContainerRef = _viewContainerRef;\n    }\n    Object.defineProperty(PortalHostDirective.prototype, \"portal\", {\n        get: function () {\n            return this._portal;\n        },\n        set: function (p) {\n            if (p) {\n                this._replaceAttachedPortal(p);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    PortalHostDirective.prototype.ngOnDestroy = function () {\n        this.dispose();\n    };\n    /** Attach the given ComponentPortal to this PortalHost using the ComponentFactoryResolver. */\n    PortalHostDirective.prototype.attachComponentPortal = function (portal) {\n        portal.setAttachedHost(this);\n        // If the portal specifies an origin, use that as the logical location of the component\n        // in the application tree. Otherwise use the location of this PortalHost.\n        var viewContainerRef = portal.viewContainerRef != null ?\n            portal.viewContainerRef :\n            this._viewContainerRef;\n        var componentFactory = this._componentFactoryResolver.resolveComponentFactory(portal.component);\n        var ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.parentInjector);\n        this.setDisposeFn(function () { return ref.destroy(); });\n        return ref;\n    };\n    /** Attach the given TemplatePortal to this PortlHost as an embedded View. */\n    PortalHostDirective.prototype.attachTemplatePortal = function (portal) {\n        var _this = this;\n        portal.setAttachedHost(this);\n        this._viewContainerRef.createEmbeddedView(portal.templateRef);\n        this.setDisposeFn(function () { return _this._viewContainerRef.clear(); });\n        // TODO(jelbourn): return locals from view\n        return new Map();\n    };\n    /** Detaches the currently attached Portal (if there is one) and attaches the given Portal. */\n    PortalHostDirective.prototype._replaceAttachedPortal = function (p) {\n        if (this.hasAttached()) {\n            this.detach();\n        }\n        if (p) {\n            this.attach(p);\n            this._portal = p;\n        }\n    };\n    PortalHostDirective = __decorate$4([\n        _angular_core.Directive({\n            selector: '[portalHost]',\n            inputs: ['portal: portalHost']\n        }), \n        __metadata$4('design:paramtypes', [_angular_core.ComponentFactoryResolver, _angular_core.ViewContainerRef])\n    ], PortalHostDirective);\n    return PortalHostDirective;\n}(BasePortalHost));\nvar PortalModule = (function () {\n    function PortalModule() {\n    }\n    PortalModule.forRoot = function () {\n        return {\n            ngModule: PortalModule,\n            providers: []\n        };\n    };\n    PortalModule = __decorate$4([\n        _angular_core.NgModule({\n            exports: [TemplatePortalDirective, PortalHostDirective],\n            declarations: [TemplatePortalDirective, PortalHostDirective],\n        }), \n        __metadata$4('design:paramtypes', [])\n    ], PortalModule);\n    return PortalModule;\n}());\n\n/**\n * OverlayState is a bag of values for either the initial configuration or current state of an\n * overlay.\n */\nvar OverlayState = (function () {\n    function OverlayState() {\n        /** Whether the overlay has a backdrop. */\n        this.hasBackdrop = false;\n        /** Custom class to add to the backdrop **/\n        this.backdropClass = 'md-overlay-dark-backdrop';\n        /** The direction of the text in the overlay panel. */\n        this.direction = 'ltr';\n    }\n    return OverlayState;\n}());\n\nvar __extends$4 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * A PortalHost for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n *\n * This is the only part of the portal core that directly touches the DOM.\n */\nvar DomPortalHost = (function (_super) {\n    __extends$4(DomPortalHost, _super);\n    function DomPortalHost(_hostDomElement, _componentFactoryResolver, _appRef, _defaultInjector) {\n        _super.call(this);\n        this._hostDomElement = _hostDomElement;\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._appRef = _appRef;\n        this._defaultInjector = _defaultInjector;\n    }\n    /** Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver. */\n    DomPortalHost.prototype.attachComponentPortal = function (portal) {\n        var _this = this;\n        var componentFactory = this._componentFactoryResolver.resolveComponentFactory(portal.component);\n        var componentRef;\n        // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n        // for the component (in terms of Angular's component tree, not rendering).\n        // When the ViewContainerRef is missing, we use the factory to create the component directly\n        // and then manually attach the ChangeDetector for that component to the application (which\n        // happens automatically when using a ViewContainer).\n        if (portal.viewContainerRef) {\n            componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector);\n            this.setDisposeFn(function () { return componentRef.destroy(); });\n        }\n        else {\n            componentRef = componentFactory.create(portal.injector || this._defaultInjector);\n            // ApplicationRef's attachView and detachView methods are in Angular ^2.2.1 but not before.\n            // The `else` clause here can be removed once 2.2.1 is released.\n            if (this._appRef['attachView']) {\n                this._appRef.attachView(componentRef.hostView);\n                this.setDisposeFn(function () {\n                    _this._appRef.detachView(componentRef.hostView);\n                    componentRef.destroy();\n                });\n            }\n            else {\n                // When creating a component outside of a ViewContainer, we need to manually register\n                // its ChangeDetector with the application. This API is unfortunately not published\n                // in Angular <= 2.2.0. The change detector must also be deregistered when the component\n                // is destroyed to prevent memory leaks.\n                var changeDetectorRef_1 = componentRef.changeDetectorRef;\n                this._appRef.registerChangeDetector(changeDetectorRef_1);\n                this.setDisposeFn(function () {\n                    _this._appRef.unregisterChangeDetector(changeDetectorRef_1);\n                    // Normally the ViewContainer will remove the component's nodes from the DOM.\n                    // Without a ViewContainer, we need to manually remove the nodes.\n                    var componentRootNode = _this._getComponentRootNode(componentRef);\n                    if (componentRootNode.parentNode) {\n                        componentRootNode.parentNode.removeChild(componentRootNode);\n                    }\n                    componentRef.destroy();\n                });\n            }\n        }\n        // At this point the component has been instantiated, so we move it to the location in the DOM\n        // where we want it to be rendered.\n        this._hostDomElement.appendChild(this._getComponentRootNode(componentRef));\n        return componentRef;\n    };\n    DomPortalHost.prototype.attachTemplatePortal = function (portal) {\n        var _this = this;\n        var viewContainer = portal.viewContainerRef;\n        var viewRef = viewContainer.createEmbeddedView(portal.templateRef);\n        viewRef.rootNodes.forEach(function (rootNode) { return _this._hostDomElement.appendChild(rootNode); });\n        this.setDisposeFn((function () {\n            var index = viewContainer.indexOf(viewRef);\n            if (index != -1) {\n                viewContainer.remove(index);\n            }\n        }));\n        // TODO(jelbourn): Return locals from view.\n        return new Map();\n    };\n    DomPortalHost.prototype.dispose = function () {\n        _super.prototype.dispose.call(this);\n        if (this._hostDomElement.parentNode != null) {\n            this._hostDomElement.parentNode.removeChild(this._hostDomElement);\n        }\n    };\n    /** Gets the root HTMLElement for an instantiated component. */\n    DomPortalHost.prototype._getComponentRootNode = function (componentRef) {\n        return componentRef.hostView.rootNodes[0];\n    };\n    return DomPortalHost;\n}(BasePortalHost));\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nvar OverlayRef = (function () {\n    function OverlayRef(_portalHost, _pane, _state, _ngZone) {\n        this._portalHost = _portalHost;\n        this._pane = _pane;\n        this._state = _state;\n        this._ngZone = _ngZone;\n        this._backdropElement = null;\n        this._backdropClick = new rxjs_Subject.Subject();\n    }\n    OverlayRef.prototype.attach = function (portal) {\n        if (this._state.hasBackdrop) {\n            this._attachBackdrop();\n        }\n        var attachResult = this._portalHost.attach(portal);\n        this.updateSize();\n        this.updateDirection();\n        this.updatePosition();\n        return attachResult;\n    };\n    OverlayRef.prototype.detach = function () {\n        this._detachBackdrop();\n        return this._portalHost.detach();\n    };\n    OverlayRef.prototype.dispose = function () {\n        this._detachBackdrop();\n        this._portalHost.dispose();\n    };\n    OverlayRef.prototype.hasAttached = function () {\n        return this._portalHost.hasAttached();\n    };\n    OverlayRef.prototype.backdropClick = function () {\n        return this._backdropClick.asObservable();\n    };\n    /** Gets the current state config of the overlay. */\n    OverlayRef.prototype.getState = function () {\n        return this._state;\n    };\n    /** Updates the position of the overlay based on the position strategy. */\n    OverlayRef.prototype.updatePosition = function () {\n        if (this._state.positionStrategy) {\n            this._state.positionStrategy.apply(this._pane);\n        }\n    };\n    /** Updates the text direction of the overlay panel. **/\n    OverlayRef.prototype.updateDirection = function () {\n        this._pane.setAttribute('dir', this._state.direction);\n    };\n    /** Updates the size of the overlay based on the overlay config. */\n    OverlayRef.prototype.updateSize = function () {\n        if (this._state.width || this._state.width === 0) {\n            this._pane.style.width = formatCssUnit(this._state.width);\n        }\n        if (this._state.height || this._state.height === 0) {\n            this._pane.style.height = formatCssUnit(this._state.height);\n        }\n    };\n    /** Attaches a backdrop for this overlay. */\n    OverlayRef.prototype._attachBackdrop = function () {\n        var _this = this;\n        this._backdropElement = document.createElement('div');\n        this._backdropElement.classList.add('md-overlay-backdrop');\n        this._backdropElement.classList.add(this._state.backdropClass);\n        this._pane.parentElement.appendChild(this._backdropElement);\n        // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n        // action desired when such a click occurs (usually closing the overlay).\n        this._backdropElement.addEventListener('click', function () {\n            _this._backdropClick.next(null);\n        });\n        // Add class to fade-in the backdrop after one frame.\n        requestAnimationFrame(function () {\n            if (_this._backdropElement) {\n                _this._backdropElement.classList.add('md-overlay-backdrop-showing');\n            }\n        });\n    };\n    /** Detaches the backdrop (if any) associated with the overlay. */\n    OverlayRef.prototype._detachBackdrop = function () {\n        var _this = this;\n        var backdropToDetach = this._backdropElement;\n        if (backdropToDetach) {\n            var finishDetach_1 = function () {\n                // It may not be attached to anything in certain cases (e.g. unit tests).\n                if (backdropToDetach && backdropToDetach.parentNode) {\n                    backdropToDetach.parentNode.removeChild(backdropToDetach);\n                }\n                // It is possible that a new portal has been attached to this overlay since we started\n                // removing the backdrop. If that is the case, only clear the backdrop reference if it\n                // is still the same instance that we started to remove.\n                if (_this._backdropElement == backdropToDetach) {\n                    _this._backdropElement = null;\n                }\n            };\n            backdropToDetach.classList.remove('md-overlay-backdrop-showing');\n            backdropToDetach.classList.remove(this._state.backdropClass);\n            backdropToDetach.addEventListener('transitionend', finishDetach_1);\n            // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n            // In this case we make it unclickable and we try to remove it after a delay.\n            backdropToDetach.style.pointerEvents = 'none';\n            // Run this outside the Angular zone because there's nothing that Angular cares about.\n            // If it were to run inside the Angular zone, every test that used Overlay would have to be\n            // either async or fakeAsync.\n            this._ngZone.runOutsideAngular(function () {\n                setTimeout(finishDetach_1, 500);\n            });\n        }\n    };\n    return OverlayRef;\n}());\nfunction formatCssUnit(value) {\n    return typeof value === 'string' ? value : value + \"px\";\n}\n\nvar __decorate$8 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$8 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * TODO: internal\n */\nvar ViewportRuler = (function () {\n    function ViewportRuler() {\n    }\n    // TODO(jelbourn): cache the document's bounding rect and only update it when the window\n    // is resized (debounced).\n    /** Gets a ClientRect for the viewport's bounds. */\n    ViewportRuler.prototype.getViewportRect = function () {\n        // Use the document element's bounding rect rather than the window scroll properties\n        // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n        // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n        // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n        // can disagree when the page is pinch-zoomed (on devices that support touch).\n        // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n        // We use the documentElement instead of the body because, by default (without a css reset)\n        // browsers typically give the document body an 8px margin, which is not included in\n        // getBoundingClientRect().\n        var documentRect = document.documentElement.getBoundingClientRect();\n        var scrollPosition = this.getViewportScrollPosition(documentRect);\n        var height = window.innerHeight;\n        var width = window.innerWidth;\n        return {\n            top: scrollPosition.top,\n            left: scrollPosition.left,\n            bottom: scrollPosition.top + height,\n            right: scrollPosition.left + width,\n            height: height,\n            width: width,\n        };\n    };\n    /**\n     * Gets the (top, left) scroll position of the viewport.\n     * @param documentRect\n     */\n    ViewportRuler.prototype.getViewportScrollPosition = function (documentRect) {\n        if (documentRect === void 0) { documentRect = document.documentElement.getBoundingClientRect(); }\n        // The top-left-corner of the viewport is determined by the scroll position of the document\n        // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n        // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n        // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n        // `document.documentElement` works consistently, where the `top` and `left` values will\n        // equal negative the scroll position.\n        var top = documentRect.top < 0 && document.body.scrollTop == 0 ?\n            -documentRect.top :\n            document.body.scrollTop;\n        var left = documentRect.left < 0 && document.body.scrollLeft == 0 ?\n            -documentRect.left :\n            document.body.scrollLeft;\n        return { top: top, left: left };\n    };\n    ViewportRuler = __decorate$8([\n        _angular_core.Injectable(), \n        __metadata$8('design:paramtypes', [])\n    ], ViewportRuler);\n    return ViewportRuler;\n}());\n\n/**\n * Applies a CSS transform to an element, including browser-prefixed properties.\n * @param element\n * @param transformValue\n */\nfunction applyCssTransform(element, transformValue) {\n    // It's important to trim the result, because the browser will ignore the set operation\n    // if the string contains only whitespace.\n    var value = transformValue.trim();\n    element.style.transform = value;\n    element.style.webkitTransform = value;\n}\n\n/** The points of the origin element and the overlay element to connect. */\nvar ConnectionPositionPair = (function () {\n    function ConnectionPositionPair(origin, overlay) {\n        this.originX = origin.originX;\n        this.originY = origin.originY;\n        this.overlayX = overlay.overlayX;\n        this.overlayY = overlay.overlayY;\n    }\n    return ConnectionPositionPair;\n}());\n/** The change event emitted by the strategy when a fallback position is used. */\nvar ConnectedOverlayPositionChange = (function () {\n    function ConnectedOverlayPositionChange(connectionPair) {\n        this.connectionPair = connectionPair;\n    }\n    return ConnectedOverlayPositionChange;\n}());\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nvar ConnectedPositionStrategy = (function () {\n    function ConnectedPositionStrategy(_connectedTo, _originPos, _overlayPos, _viewportRuler) {\n        this._connectedTo = _connectedTo;\n        this._originPos = _originPos;\n        this._overlayPos = _overlayPos;\n        this._viewportRuler = _viewportRuler;\n        this._dir = 'ltr';\n        /** The offset in pixels for the overlay connection point on the x-axis */\n        this._offsetX = 0;\n        /** The offset in pixels for the overlay connection point on the y-axis */\n        this._offsetY = 0;\n        /** Ordered list of preferred positions, from most to least desirable. */\n        this._preferredPositions = [];\n        this._onPositionChange = new rxjs_Subject.Subject();\n        this._origin = this._connectedTo.nativeElement;\n        this.withFallbackPosition(_originPos, _overlayPos);\n    }\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"_isRtl\", {\n        /** Whether the we're dealing with an RTL context */\n        get: function () {\n            return this._dir === 'rtl';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"onPositionChange\", {\n        /** Emits an event when the connection point changes. */\n        get: function () {\n            return this._onPositionChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedPositionStrategy.prototype, \"positions\", {\n        get: function () {\n            return this._preferredPositions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Updates the position of the overlay element, using whichever preferred position relative\n     * to the origin fits on-screen.\n     * TODO: internal\n     */\n    ConnectedPositionStrategy.prototype.apply = function (element) {\n        // We need the bounding rects for the origin and the overlay to determine how to position\n        // the overlay relative to the origin.\n        var originRect = this._origin.getBoundingClientRect();\n        var overlayRect = element.getBoundingClientRect();\n        // We use the viewport rect to determine whether a position would go off-screen.\n        var viewportRect = this._viewportRuler.getViewportRect();\n        var firstOverlayPoint = null;\n        // We want to place the overlay in the first of the preferred positions such that the\n        // overlay fits on-screen.\n        for (var _i = 0, _a = this._preferredPositions; _i < _a.length; _i++) {\n            var pos = _a[_i];\n            // Get the (x, y) point of connection on the origin, and then use that to get the\n            // (top, left) coordinate for the overlay at `pos`.\n            var originPoint = this._getOriginConnectionPoint(originRect, pos);\n            var overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n            firstOverlayPoint = firstOverlayPoint || overlayPoint;\n            // If the overlay in the calculated position fits on-screen, put it there and we're done.\n            if (this._willOverlayFitWithinViewport(overlayPoint, overlayRect, viewportRect)) {\n                this._setElementPosition(element, overlayPoint);\n                this._onPositionChange.next(new ConnectedOverlayPositionChange(pos));\n                return Promise.resolve(null);\n            }\n        }\n        // TODO(jelbourn): fallback behavior for when none of the preferred positions fit on-screen.\n        // For now, just stick it in the first position and let it go off-screen.\n        this._setElementPosition(element, firstOverlayPoint);\n        return Promise.resolve(null);\n    };\n    ConnectedPositionStrategy.prototype.withFallbackPosition = function (originPos, overlayPos) {\n        this._preferredPositions.push(new ConnectionPositionPair(originPos, overlayPos));\n        return this;\n    };\n    /** Sets the layout direction so the overlay's position can be adjusted to match. */\n    ConnectedPositionStrategy.prototype.withDirection = function (dir) {\n        this._dir = dir;\n        return this;\n    };\n    /** Sets an offset for the overlay's connection point on the x-axis */\n    ConnectedPositionStrategy.prototype.withOffsetX = function (offset) {\n        this._offsetX = offset;\n        return this;\n    };\n    /** Sets an offset for the overlay's connection point on the y-axis */\n    ConnectedPositionStrategy.prototype.withOffsetY = function (offset) {\n        this._offsetY = offset;\n        return this;\n    };\n    /**\n     * Gets the horizontal (x) \"start\" dimension based on whether the overlay is in an RTL context.\n     * @param rect\n     */\n    ConnectedPositionStrategy.prototype._getStartX = function (rect) {\n        return this._isRtl ? rect.right : rect.left;\n    };\n    /**\n     * Gets the horizontal (x) \"end\" dimension based on whether the overlay is in an RTL context.\n     * @param rect\n     */\n    ConnectedPositionStrategy.prototype._getEndX = function (rect) {\n        return this._isRtl ? rect.left : rect.right;\n    };\n    /**\n     * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n     * @param originRect\n     * @param pos\n     */\n    ConnectedPositionStrategy.prototype._getOriginConnectionPoint = function (originRect, pos) {\n        var originStartX = this._getStartX(originRect);\n        var originEndX = this._getEndX(originRect);\n        var x;\n        if (pos.originX == 'center') {\n            x = originStartX + (originRect.width / 2);\n        }\n        else {\n            x = pos.originX == 'start' ? originStartX : originEndX;\n        }\n        var y;\n        if (pos.originY == 'center') {\n            y = originRect.top + (originRect.height / 2);\n        }\n        else {\n            y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n        }\n        return { x: x, y: y };\n    };\n    /**\n     * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n     * origin point to which the overlay should be connected.\n     * @param originPoint\n     * @param overlayRect\n     * @param pos\n     */\n    ConnectedPositionStrategy.prototype._getOverlayPoint = function (originPoint, overlayRect, pos) {\n        // Calculate the (overlayStartX, overlayStartY), the start of the potential overlay position\n        // relative to the origin point.\n        var overlayStartX;\n        if (pos.overlayX == 'center') {\n            overlayStartX = -overlayRect.width / 2;\n        }\n        else if (pos.overlayX === 'start') {\n            overlayStartX = this._isRtl ? -overlayRect.width : 0;\n        }\n        else {\n            overlayStartX = this._isRtl ? 0 : -overlayRect.width;\n        }\n        var overlayStartY;\n        if (pos.overlayY == 'center') {\n            overlayStartY = -overlayRect.height / 2;\n        }\n        else {\n            overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n        }\n        return {\n            x: originPoint.x + overlayStartX + this._offsetX,\n            y: originPoint.y + overlayStartY + this._offsetY\n        };\n    };\n    /**\n     * Gets whether the overlay positioned at the given point will fit on-screen.\n     * @param overlayPoint The top-left coordinate of the overlay.\n     * @param overlayRect Bounding rect of the overlay, used to get its size.\n     * @param viewportRect The bounding viewport.\n     */\n    ConnectedPositionStrategy.prototype._willOverlayFitWithinViewport = function (overlayPoint, overlayRect, viewportRect) {\n        // TODO(jelbourn): probably also want some space between overlay edge and viewport edge.\n        return overlayPoint.x >= viewportRect.left &&\n            overlayPoint.x + overlayRect.width <= viewportRect.right &&\n            overlayPoint.y >= viewportRect.top &&\n            overlayPoint.y + overlayRect.height <= viewportRect.bottom;\n    };\n    /**\n     * Physically positions the overlay element to the given coordinate.\n     * @param element\n     * @param overlayPoint\n     */\n    ConnectedPositionStrategy.prototype._setElementPosition = function (element, overlayPoint) {\n        // Round the values to prevent blurry overlays due to subpixel rendering.\n        var x = Math.round(overlayPoint.x);\n        var y = Math.round(overlayPoint.y);\n        // TODO(jelbourn): we don't want to always overwrite the transform property here,\n        // because it will need to be used for animations.\n        applyCssTransform(element, \"translateX(\" + x + \"px) translateY(\" + y + \"px)\");\n    };\n    return ConnectedPositionStrategy;\n}());\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport.\n */\nvar GlobalPositionStrategy = (function () {\n    function GlobalPositionStrategy() {\n        this._cssPosition = 'absolute';\n        this._top = '';\n        this._bottom = '';\n        this._left = '';\n        this._right = '';\n        /** Array of individual applications of translateX(). Currently only for centering. */\n        this._translateX = [];\n        /** Array of individual applications of translateY(). Currently only for centering. */\n        this._translateY = [];\n    }\n    /** Sets the element to use CSS position: fixed */\n    GlobalPositionStrategy.prototype.fixed = function () {\n        this._cssPosition = 'fixed';\n        return this;\n    };\n    /** Sets the element to use CSS position: absolute. This is the default. */\n    GlobalPositionStrategy.prototype.absolute = function () {\n        this._cssPosition = 'absolute';\n        return this;\n    };\n    /** Sets the top position of the overlay. Clears any previously set vertical position. */\n    GlobalPositionStrategy.prototype.top = function (value) {\n        this._bottom = '';\n        this._translateY = [];\n        this._top = value;\n        return this;\n    };\n    /** Sets the left position of the overlay. Clears any previously set horizontal position. */\n    GlobalPositionStrategy.prototype.left = function (value) {\n        this._right = '';\n        this._translateX = [];\n        this._left = value;\n        return this;\n    };\n    /** Sets the bottom position of the overlay. Clears any previously set vertical position. */\n    GlobalPositionStrategy.prototype.bottom = function (value) {\n        this._top = '';\n        this._translateY = [];\n        this._bottom = value;\n        return this;\n    };\n    /** Sets the right position of the overlay. Clears any previously set horizontal position. */\n    GlobalPositionStrategy.prototype.right = function (value) {\n        this._left = '';\n        this._translateX = [];\n        this._right = value;\n        return this;\n    };\n    /**\n     * Centers the overlay horizontally with an optional offset.\n     * Clears any previously set horizontal position.\n     */\n    GlobalPositionStrategy.prototype.centerHorizontally = function (offset) {\n        if (offset === void 0) { offset = '0px'; }\n        this._left = '50%';\n        this._right = '';\n        this._translateX = ['-50%', offset];\n        return this;\n    };\n    /**\n     * Centers the overlay vertically with an optional offset.\n     * Clears any previously set vertical position.\n     */\n    GlobalPositionStrategy.prototype.centerVertically = function (offset) {\n        if (offset === void 0) { offset = '0px'; }\n        this._top = '50%';\n        this._bottom = '';\n        this._translateY = ['-50%', offset];\n        return this;\n    };\n    /**\n     * Apply the position to the element.\n     * TODO: internal\n     */\n    GlobalPositionStrategy.prototype.apply = function (element) {\n        element.style.position = this._cssPosition;\n        element.style.top = this._top;\n        element.style.left = this._left;\n        element.style.bottom = this._bottom;\n        element.style.right = this._right;\n        // TODO(jelbourn): we don't want to always overwrite the transform property here,\n        // because it will need to be used for animations.\n        var tranlateX = this._reduceTranslateValues('translateX', this._translateX);\n        var translateY = this._reduceTranslateValues('translateY', this._translateY);\n        applyCssTransform(element, tranlateX + \" \" + translateY);\n        return Promise.resolve(null);\n    };\n    /** Reduce a list of translate values to a string that can be used in the transform property */\n    GlobalPositionStrategy.prototype._reduceTranslateValues = function (translateFn, values) {\n        return values.map(function (t) { return (translateFn + \"(\" + t + \")\"); }).join(' ');\n    };\n    return GlobalPositionStrategy;\n}());\n\nvar __decorate$7 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$7 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Builder for overlay position strategy. */\nvar OverlayPositionBuilder = (function () {\n    function OverlayPositionBuilder(_viewportRuler) {\n        this._viewportRuler = _viewportRuler;\n    }\n    /** Creates a global position strategy. */\n    OverlayPositionBuilder.prototype.global = function () {\n        return new GlobalPositionStrategy();\n    };\n    /** Creates a relative position strategy. */\n    OverlayPositionBuilder.prototype.connectedTo = function (elementRef, originPos, overlayPos) {\n        return new ConnectedPositionStrategy(elementRef, originPos, overlayPos, this._viewportRuler);\n    };\n    OverlayPositionBuilder = __decorate$7([\n        _angular_core.Injectable(), \n        __metadata$7('design:paramtypes', [ViewportRuler])\n    ], OverlayPositionBuilder);\n    return OverlayPositionBuilder;\n}());\n\n/**\n * The OverlayContainer is the container in which all overlays will load.\n * It should be provided in the root component to ensure it is properly shared.\n */\nvar OverlayContainer = (function () {\n    function OverlayContainer() {\n    }\n    /**\n     * This method returns the overlay container element.  It will lazily\n     * create the element the first time  it is called to facilitate using\n     * the container in non-browser environments.\n     * @returns {HTMLElement} the container element\n     */\n    OverlayContainer.prototype.getContainerElement = function () {\n        if (!this._containerElement) {\n            this._createContainer();\n        }\n        return this._containerElement;\n    };\n    /**\n     * Create the overlay container element, which is simply a div\n     * with the 'md-overlay-container' class on the document body.\n     */\n    OverlayContainer.prototype._createContainer = function () {\n        var container = document.createElement('div');\n        container.classList.add('md-overlay-container');\n        document.body.appendChild(container);\n        this._containerElement = container;\n    };\n    return OverlayContainer;\n}());\n\nvar __decorate$6 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$6 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Next overlay unique ID. */\nvar nextUniqueId = 0;\n/** The default state for newly created overlays. */\nvar defaultState = new OverlayState();\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalHost, so any kind of Portal can be loaded into one.\n */\nvar Overlay = (function () {\n    function Overlay(_overlayContainer, _componentFactoryResolver, _positionBuilder, _appRef, _injector, _ngZone) {\n        this._overlayContainer = _overlayContainer;\n        this._componentFactoryResolver = _componentFactoryResolver;\n        this._positionBuilder = _positionBuilder;\n        this._appRef = _appRef;\n        this._injector = _injector;\n        this._ngZone = _ngZone;\n    }\n    /**\n     * Creates an overlay.\n     * @param state State to apply to the overlay.\n     * @returns A reference to the created overlay.\n     */\n    Overlay.prototype.create = function (state) {\n        if (state === void 0) { state = defaultState; }\n        return this._createOverlayRef(this._createPaneElement(), state);\n    };\n    /**\n     * Returns a position builder that can be used, via fluent API,\n     * to construct and configure a position strategy.\n     */\n    Overlay.prototype.position = function () {\n        return this._positionBuilder;\n    };\n    /**\n     * Creates the DOM element for an overlay and appends it to the overlay container.\n     * @returns Promise resolving to the created element.\n     */\n    Overlay.prototype._createPaneElement = function () {\n        var pane = document.createElement('div');\n        pane.id = \"md-overlay-\" + nextUniqueId++;\n        pane.classList.add('md-overlay-pane');\n        this._overlayContainer.getContainerElement().appendChild(pane);\n        return pane;\n    };\n    /**\n     * Create a DomPortalHost into which the overlay content can be loaded.\n     * @param pane The DOM element to turn into a portal host.\n     * @returns A portal host for the given DOM element.\n     */\n    Overlay.prototype._createPortalHost = function (pane) {\n        return new DomPortalHost(pane, this._componentFactoryResolver, this._appRef, this._injector);\n    };\n    /**\n     * Creates an OverlayRef for an overlay in the given DOM element.\n     * @param pane DOM element for the overlay\n     * @param state\n     * @returns {OverlayRef}\n     */\n    Overlay.prototype._createOverlayRef = function (pane, state) {\n        return new OverlayRef(this._createPortalHost(pane), pane, state, this._ngZone);\n    };\n    Overlay = __decorate$6([\n        _angular_core.Injectable(), \n        __metadata$6('design:paramtypes', [OverlayContainer, _angular_core.ComponentFactoryResolver, OverlayPositionBuilder, _angular_core.ApplicationRef, _angular_core.Injector, _angular_core.NgZone])\n    ], Overlay);\n    return Overlay;\n}());\n/** Providers for Overlay and its related injectables. */\nvar OVERLAY_PROVIDERS = [\n    ViewportRuler,\n    OverlayPositionBuilder,\n    Overlay,\n    OverlayContainer,\n];\n\nvar __decorate$5 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$5 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nvar defaultPositionList = [\n    new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),\n    new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }),\n];\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nvar OverlayOrigin = (function () {\n    function OverlayOrigin(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n    Object.defineProperty(OverlayOrigin.prototype, \"elementRef\", {\n        get: function () {\n            return this._elementRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    OverlayOrigin = __decorate$5([\n        _angular_core.Directive({\n            selector: '[overlay-origin]',\n            exportAs: 'overlayOrigin',\n        }), \n        __metadata$5('design:paramtypes', [_angular_core.ElementRef])\n    ], OverlayOrigin);\n    return OverlayOrigin;\n}());\n/**\n * Directive to facilitate declarative creation of an Overlay using a ConnectedPositionStrategy.\n */\nvar ConnectedOverlayDirective = (function () {\n    // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n    function ConnectedOverlayDirective(_overlay, templateRef, viewContainerRef, _dir) {\n        this._overlay = _overlay;\n        this._dir = _dir;\n        this._open = false;\n        this._hasBackdrop = false;\n        /** The offset in pixels for the overlay connection point on the x-axis */\n        this.offsetX = 0;\n        /** The offset in pixels for the overlay connection point on the y-axis */\n        this.offsetY = 0;\n        /** Event emitted when the backdrop is clicked. */\n        this.backdropClick = new _angular_core.EventEmitter();\n        this.positionChange = new _angular_core.EventEmitter();\n        this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n    }\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"hasBackdrop\", {\n        /** Whether or not the overlay should attach a backdrop. */\n        get: function () {\n            return this._hasBackdrop;\n        },\n        // TODO: move the boolean coercion logic to a shared function in core\n        set: function (value) {\n            this._hasBackdrop = value != null && \"\" + value !== 'false';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"open\", {\n        get: function () {\n            return this._open;\n        },\n        set: function (value) {\n            value ? this._attachOverlay() : this._detachOverlay();\n            this._open = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"overlayRef\", {\n        get: function () {\n            return this._overlayRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConnectedOverlayDirective.prototype, \"dir\", {\n        get: function () {\n            return this._dir ? this._dir.value : 'ltr';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /** TODO: internal */\n    ConnectedOverlayDirective.prototype.ngOnDestroy = function () {\n        this._destroyOverlay();\n    };\n    /** Creates an overlay */\n    ConnectedOverlayDirective.prototype._createOverlay = function () {\n        if (!this.positions || !this.positions.length) {\n            this.positions = defaultPositionList;\n        }\n        this._overlayRef = this._overlay.create(this._buildConfig());\n    };\n    /** Builds the overlay config based on the directive's inputs */\n    ConnectedOverlayDirective.prototype._buildConfig = function () {\n        var overlayConfig = new OverlayState();\n        if (this.width || this.width === 0) {\n            overlayConfig.width = this.width;\n        }\n        if (this.height || this.height === 0) {\n            overlayConfig.height = this.height;\n        }\n        overlayConfig.hasBackdrop = this.hasBackdrop;\n        if (this.backdropClass) {\n            overlayConfig.backdropClass = this.backdropClass;\n        }\n        overlayConfig.positionStrategy = this._createPositionStrategy();\n        overlayConfig.direction = this.dir;\n        return overlayConfig;\n    };\n    /** Returns the position strategy of the overlay to be set on the overlay config */\n    ConnectedOverlayDirective.prototype._createPositionStrategy = function () {\n        var pos = this.positions[0];\n        var originPoint = { originX: pos.originX, originY: pos.originY };\n        var overlayPoint = { overlayX: pos.overlayX, overlayY: pos.overlayY };\n        var strategy = this._overlay.position()\n            .connectedTo(this.origin.elementRef, originPoint, overlayPoint)\n            .withDirection(this.dir)\n            .withOffsetX(this.offsetX)\n            .withOffsetY(this.offsetY);\n        this._handlePositionChanges(strategy);\n        return strategy;\n    };\n    ConnectedOverlayDirective.prototype._handlePositionChanges = function (strategy) {\n        var _this = this;\n        for (var i = 1; i < this.positions.length; i++) {\n            strategy.withFallbackPosition({ originX: this.positions[i].originX, originY: this.positions[i].originY }, { overlayX: this.positions[i].overlayX, overlayY: this.positions[i].overlayY });\n        }\n        this._positionSubscription =\n            strategy.onPositionChange.subscribe(function (pos) { return _this.positionChange.emit(pos); });\n    };\n    /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n    ConnectedOverlayDirective.prototype._attachOverlay = function () {\n        var _this = this;\n        if (!this._overlayRef) {\n            this._createOverlay();\n        }\n        if (!this._overlayRef.hasAttached()) {\n            this._overlayRef.attach(this._templatePortal);\n        }\n        if (this.hasBackdrop) {\n            this._backdropSubscription = this._overlayRef.backdropClick().subscribe(function () {\n                _this.backdropClick.emit();\n            });\n        }\n    };\n    /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n    ConnectedOverlayDirective.prototype._detachOverlay = function () {\n        if (this._overlayRef) {\n            this._overlayRef.detach();\n        }\n        if (this._backdropSubscription) {\n            this._backdropSubscription.unsubscribe();\n            this._backdropSubscription = null;\n        }\n    };\n    /** Destroys the overlay created by this directive. */\n    ConnectedOverlayDirective.prototype._destroyOverlay = function () {\n        if (this._overlayRef) {\n            this._overlayRef.dispose();\n        }\n        if (this._backdropSubscription) {\n            this._backdropSubscription.unsubscribe();\n        }\n        if (this._positionSubscription) {\n            this._positionSubscription.unsubscribe();\n        }\n    };\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', OverlayOrigin)\n    ], ConnectedOverlayDirective.prototype, \"origin\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Array)\n    ], ConnectedOverlayDirective.prototype, \"positions\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Number)\n    ], ConnectedOverlayDirective.prototype, \"offsetX\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Number)\n    ], ConnectedOverlayDirective.prototype, \"offsetY\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"width\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"height\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', String)\n    ], ConnectedOverlayDirective.prototype, \"backdropClass\", void 0);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"hasBackdrop\", null);\n    __decorate$5([\n        _angular_core.Input(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"open\", null);\n    __decorate$5([\n        _angular_core.Output(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"backdropClick\", void 0);\n    __decorate$5([\n        _angular_core.Output(), \n        __metadata$5('design:type', Object)\n    ], ConnectedOverlayDirective.prototype, \"positionChange\", void 0);\n    ConnectedOverlayDirective = __decorate$5([\n        _angular_core.Directive({\n            selector: '[connected-overlay]',\n            exportAs: 'connectedOverlay'\n        }),\n        __param(3, _angular_core.Optional()), \n        __metadata$5('design:paramtypes', [Overlay, _angular_core.TemplateRef, _angular_core.ViewContainerRef, Dir])\n    ], ConnectedOverlayDirective);\n    return ConnectedOverlayDirective;\n}());\nvar OverlayModule = (function () {\n    function OverlayModule() {\n    }\n    OverlayModule.forRoot = function () {\n        return {\n            ngModule: OverlayModule,\n            providers: OVERLAY_PROVIDERS,\n        };\n    };\n    OverlayModule = __decorate$5([\n        _angular_core.NgModule({\n            imports: [PortalModule],\n            exports: [ConnectedOverlayDirective, OverlayOrigin],\n            declarations: [ConnectedOverlayDirective, OverlayOrigin],\n        }), \n        __metadata$5('design:paramtypes', [])\n    ], OverlayModule);\n    return OverlayModule;\n}());\n\nvar __decorate$11 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$11 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Utility for checking the interactivity of an element, such as whether is is focusable or\n * tabbable.\n *\n * NOTE: Currently does not capture any special element behaviors, browser quirks, or edge cases.\n * This is a basic/naive starting point onto which further behavior will be added.\n *\n * This class uses instance methods instead of static functions so that alternate implementations\n * can be injected.\n *\n * TODO(jelbourn): explore using ally.js directly for its significantly more robust\n * checks (need to evaluate payload size, performance, and compatibility with tree-shaking).\n */\nvar InteractivityChecker = (function () {\n    function InteractivityChecker() {\n    }\n    /** Gets whether an element is disabled. */\n    InteractivityChecker.prototype.isDisabled = function (element) {\n        // This does not capture some cases, such as a non-form control with a disabled attribute or\n        // a form control inside of a disabled form, but should capture the most common cases.\n        return element.hasAttribute('disabled');\n    };\n    /**\n     * Gets whether an element is visible for the purposes of interactivity.\n     *\n     * This will capture states like `display: none` and `visibility: hidden`, but not things like\n     * being clipped by an `overflow: hidden` parent or being outside the viewport.\n     */\n    InteractivityChecker.prototype.isVisible = function (element) {\n        // There are additional special cases that this does not capture, but this will work for\n        // the most common cases.\n        // Use logic from jQuery to check for `display: none`.\n        // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n        if (!(element.offsetWidth || element.offsetHeight || element.getClientRects().length)) {\n            return false;\n        }\n        // Check for css `visibility` property.\n        // TODO(jelbourn): do any browsers we support return an empty string instead of 'visible'?\n        return getComputedStyle(element).getPropertyValue('visibility') == 'visible';\n    };\n    /**\n     * Gets whether an element can be reached via Tab key.\n     * Assumes that the element has already been checked with isFocusable.\n     */\n    InteractivityChecker.prototype.isTabbable = function (element) {\n        // Again, naive approach that does not capture many special cases and browser quirks.\n        return element.tabIndex >= 0;\n    };\n    /** Gets whether an element can be focused by the user. */\n    InteractivityChecker.prototype.isFocusable = function (element) {\n        // Perform checks in order of left to most expensive.\n        // Again, naive approach that does not capture many edge cases and browser quirks.\n        return isPotentiallyFocusable(element) && !this.isDisabled(element) && this.isVisible(element);\n    };\n    InteractivityChecker = __decorate$11([\n        _angular_core.Injectable(), \n        __metadata$11('design:paramtypes', [])\n    ], InteractivityChecker);\n    return InteractivityChecker;\n}());\n/** Gets whether an element's  */\nfunction isNativeFormElement(element) {\n    var nodeName = element.nodeName.toLowerCase();\n    return nodeName === 'input' ||\n        nodeName === 'select' ||\n        nodeName === 'button' ||\n        nodeName === 'textarea';\n}\n/** Gets whether an element is an <input type=\"hidden\">. */\nfunction isHiddenInput(element) {\n    return isInputElement(element) && element.type == 'hidden';\n}\n/** Gets whether an element is an anchor that has an href attribute. */\nfunction isAnchorWithHref(element) {\n    return isAnchorElement(element) && element.hasAttribute('href');\n}\n/** Gets whether an element is an input element. */\nfunction isInputElement(element) {\n    return element.nodeName == 'input';\n}\n/** Gets whether an element is an anchor element. */\nfunction isAnchorElement(element) {\n    return element.nodeName.toLowerCase() == 'a';\n}\n/** Gets whether an element has a valid tabindex. */\nfunction hasValidTabIndex(element) {\n    if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n        return false;\n    }\n    var tabIndex = element.getAttribute('tabindex');\n    // IE11 parses tabindex=\"\" as the value \"-32768\"\n    if (tabIndex == '-32768') {\n        return false;\n    }\n    return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n}\n/**\n * Gets whether an element is potentially focusable without taking current visible/disabled state\n * into account.\n */\nfunction isPotentiallyFocusable(element) {\n    // Inputs are potentially focusable *unless* they're type=\"hidden\".\n    if (isHiddenInput(element)) {\n        return false;\n    }\n    return isNativeFormElement(element) ||\n        isAnchorWithHref(element) ||\n        element.hasAttribute('contenteditable') ||\n        hasValidTabIndex(element);\n}\n\nvar __decorate$10 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$10 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Directive for trapping focus within a region.\n *\n * NOTE: This directive currently uses a very simple (naive) approach to focus trapping.\n * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n * Things like tabIndex > 0, flex `order`, and shadow roots can cause to two to misalign.\n * This will be replaced with a more intelligent solution before the library is considered stable.\n */\nvar FocusTrap = (function () {\n    function FocusTrap(_checker) {\n        this._checker = _checker;\n    }\n    /** Focuses the first tabbable element within the focus trap region. */\n    FocusTrap.prototype.focusFirstTabbableElement = function () {\n        var rootElement = this.trappedContent.nativeElement;\n        var redirectToElement = rootElement.querySelector('[md-focus-start]') ||\n            this._getFirstTabbableElement(rootElement);\n        if (redirectToElement) {\n            redirectToElement.focus();\n        }\n    };\n    /** Focuses the last tabbable element within the focus trap region. */\n    FocusTrap.prototype.focusLastTabbableElement = function () {\n        var rootElement = this.trappedContent.nativeElement;\n        var focusTargets = rootElement.querySelectorAll('[md-focus-end]');\n        var redirectToElement = null;\n        if (focusTargets.length) {\n            redirectToElement = focusTargets[focusTargets.length - 1];\n        }\n        else {\n            redirectToElement = this._getLastTabbableElement(rootElement);\n        }\n        if (redirectToElement) {\n            redirectToElement.focus();\n        }\n    };\n    /** Get the first tabbable element from a DOM subtree (inclusive). */\n    FocusTrap.prototype._getFirstTabbableElement = function (root) {\n        if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n            return root;\n        }\n        // Iterate in DOM order.\n        var childCount = root.children.length;\n        for (var i = 0; i < childCount; i++) {\n            var tabbableChild = this._getFirstTabbableElement(root.children[i]);\n            if (tabbableChild) {\n                return tabbableChild;\n            }\n        }\n        return null;\n    };\n    /** Get the last tabbable element from a DOM subtree (inclusive). */\n    FocusTrap.prototype._getLastTabbableElement = function (root) {\n        if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n            return root;\n        }\n        // Iterate in reverse DOM order.\n        for (var i = root.children.length - 1; i >= 0; i--) {\n            var tabbableChild = this._getLastTabbableElement(root.children[i]);\n            if (tabbableChild) {\n                return tabbableChild;\n            }\n        }\n        return null;\n    };\n    __decorate$10([\n        _angular_core.ViewChild('trappedContent'), \n        __metadata$10('design:type', _angular_core.ElementRef)\n    ], FocusTrap.prototype, \"trappedContent\", void 0);\n    FocusTrap = __decorate$10([\n        _angular_core.Component({selector: 'focus-trap',\n            // TODO(jelbourn): move this to a separate file.\n            template: \"\\n  <div tabindex=\\\"0\\\" (focus)=\\\"focusLastTabbableElement()\\\"></div>\\n  <div #trappedContent><ng-content></ng-content></div>\\n  <div tabindex=\\\"0\\\" (focus)=\\\"focusFirstTabbableElement()\\\"></div>\",\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$10('design:paramtypes', [InteractivityChecker])\n    ], FocusTrap);\n    return FocusTrap;\n}());\n\nvar __decorate$12 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$12 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$1 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LIVE_ANNOUNCER_ELEMENT_TOKEN = new _angular_core.OpaqueToken('mdLiveAnnouncerElement');\nvar MdLiveAnnouncer = (function () {\n    function MdLiveAnnouncer(elementToken) {\n        // We inject the live element as `any` because the constructor signature cannot reference\n        // browser globals (HTMLElement) on non-browser environments, since having a class decorator\n        // causes TypeScript to preserve the constructor signature types.\n        this._liveElement = elementToken || this._createLiveElement();\n    }\n    /**\n     * @param message Message to be announced to the screenreader\n     * @param politeness The politeness of the announcer element.\n     */\n    MdLiveAnnouncer.prototype.announce = function (message, politeness) {\n        var _this = this;\n        if (politeness === void 0) { politeness = 'polite'; }\n        this._liveElement.textContent = '';\n        // TODO: ensure changing the politeness works on all environments we support.\n        this._liveElement.setAttribute('aria-live', politeness);\n        // This 100ms timeout is necessary for some browser + screen-reader combinations:\n        // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n        // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n        //   second time without clearing and then using a non-zero delay.\n        // (using JAWS 17 at time of this writing).\n        setTimeout(function () { return _this._liveElement.textContent = message; }, 100);\n    };\n    /** Removes the aria-live element from the DOM. */\n    MdLiveAnnouncer.prototype._removeLiveElement = function () {\n        if (this._liveElement && this._liveElement.parentNode) {\n            this._liveElement.parentNode.removeChild(this._liveElement);\n        }\n    };\n    MdLiveAnnouncer.prototype._createLiveElement = function () {\n        var liveEl = document.createElement('div');\n        liveEl.classList.add('md-visually-hidden');\n        liveEl.setAttribute('aria-atomic', 'true');\n        liveEl.setAttribute('aria-live', 'polite');\n        document.body.appendChild(liveEl);\n        return liveEl;\n    };\n    MdLiveAnnouncer = __decorate$12([\n        _angular_core.Injectable(),\n        __param$1(0, _angular_core.Optional()),\n        __param$1(0, _angular_core.Inject(LIVE_ANNOUNCER_ELEMENT_TOKEN)), \n        __metadata$12('design:paramtypes', [Object])\n    ], MdLiveAnnouncer);\n    return MdLiveAnnouncer;\n}());\n\nvar __decorate$9 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$9 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar A11Y_PROVIDERS = [MdLiveAnnouncer, InteractivityChecker];\nvar A11yModule = (function () {\n    function A11yModule() {\n    }\n    A11yModule.forRoot = function () {\n        return {\n            ngModule: A11yModule,\n            providers: A11Y_PROVIDERS,\n        };\n    };\n    A11yModule = __decorate$9([\n        _angular_core.NgModule({\n            declarations: [FocusTrap],\n            exports: [FocusTrap],\n        }), \n        __metadata$9('design:paramtypes', [])\n    ], A11yModule);\n    return A11yModule;\n}());\n\nvar __decorate$13 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$13 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n// \"Polyfill\" for `Node.replaceWith()`.\n// cf. https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith\nfunction _replaceWith(toReplaceEl, otherEl) {\n    toReplaceEl.parentElement.replaceChild(otherEl, toReplaceEl);\n}\nvar DomProjectionHost = (function () {\n    function DomProjectionHost(ref) {\n        this.ref = ref;\n    }\n    DomProjectionHost = __decorate$13([\n        _angular_core.Directive({\n            selector: 'dom-projection-host'\n        }), \n        __metadata$13('design:paramtypes', [_angular_core.ElementRef])\n    ], DomProjectionHost);\n    return DomProjectionHost;\n}());\nvar DomProjection = (function () {\n    function DomProjection() {\n    }\n    /**\n     * Project an element into a host element.\n     * Replace a host element by another element. This also replaces the children of the element\n     * by the children of the host.\n     *\n     * It should be used like this:\n     *\n     * ```\n     *   @Component({\n     *     template: `<div>\n     *       <dom-projection-host>\n     *         <div>other</div>\n     *         <ng-content></ng-content>\n     *       </dom-projection-host>\n     *     </div>`\n     *   })\n     *   class Cmpt {\n     *     constructor(private _projector: DomProjection, private _el: ElementRef) {}\n     *     ngOnInit() { this._projector.project(this._el, this._projector); }\n     *   }\n     * ```\n     *\n     * This component will move the content of the element it's applied to in the outer div. Because\n     * `project()` also move the children of the host inside the projected element, the element will\n     * contain the `<div>other</div>` HTML as well as its own children.\n     *\n     * Note: without `<ng-content></ng-content>` the projection will project an empty element.\n     */\n    DomProjection.prototype.project = function (ref, host) {\n        var projectedEl = ref.nativeElement;\n        var hostEl = host.ref.nativeElement;\n        var childNodes = projectedEl.childNodes;\n        var child = childNodes[0];\n        // We hoist all of the projected element's children out into the projected elements position\n        // because we *only* want to move the projected element and not its children.\n        _replaceWith(projectedEl, child);\n        var l = childNodes.length;\n        while (l--) {\n            child.parentNode.insertBefore(childNodes[0], child.nextSibling);\n            child = child.nextSibling; // nextSibling is now the childNodes[0].\n        }\n        // Insert all host children under the projectedEl, then replace host by component.\n        l = hostEl.childNodes.length;\n        while (l--) {\n            projectedEl.appendChild(hostEl.childNodes[0]);\n        }\n        _replaceWith(hostEl, projectedEl);\n        // At this point the host is replaced by the component. Nothing else to be done.\n    };\n    DomProjection = __decorate$13([\n        _angular_core.Injectable(), \n        __metadata$13('design:paramtypes', [])\n    ], DomProjection);\n    return DomProjection;\n}());\nvar ProjectionModule = (function () {\n    function ProjectionModule() {\n    }\n    ProjectionModule.forRoot = function () {\n        return {\n            ngModule: ProjectionModule,\n            providers: [DomProjection]\n        };\n    };\n    ProjectionModule = __decorate$13([\n        _angular_core.NgModule({\n            exports: [DomProjectionHost],\n            declarations: [DomProjectionHost],\n        }), \n        __metadata$13('design:paramtypes', [])\n    ], ProjectionModule);\n    return ProjectionModule;\n}());\n\n/**\n * Screenreaders will often fire fake mousedown events when a focusable element\n * is activated using the keyboard. We can typically distinguish between these faked\n * mousedown events and real mousedown events using the \"buttons\" property. While\n * real mousedowns will indicate the mouse button that was pressed (e.g. \"1\" for\n * the left mouse button), faked mousedowns will usually set the property value to 0.\n */\nfunction isFakeMousedownFromScreenReader(event) {\n    return event.buttons === 0;\n}\n\nvar __decorate$14 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$14 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nvar MdUniqueSelectionDispatcher = (function () {\n    function MdUniqueSelectionDispatcher() {\n        this._listeners = [];\n    }\n    /** Notify other items that selection for the given name has been set. */\n    MdUniqueSelectionDispatcher.prototype.notify = function (id, name) {\n        for (var _i = 0, _a = this._listeners; _i < _a.length; _i++) {\n            var listener = _a[_i];\n            listener(id, name);\n        }\n    };\n    /** Listen for future changes to item selection. */\n    MdUniqueSelectionDispatcher.prototype.listen = function (listener) {\n        this._listeners.push(listener);\n    };\n    MdUniqueSelectionDispatcher = __decorate$14([\n        _angular_core.Injectable(), \n        __metadata$14('design:paramtypes', [])\n    ], MdUniqueSelectionDispatcher);\n    return MdUniqueSelectionDispatcher;\n}());\n\n// Due to a bug in the ChromeDriver, Angular 2 keyboard events are not triggered by `sendKeys`\n// during E2E tests when using dot notation such as `(keydown.rightArrow)`. To get around this,\n// we are temporarily using a single (keydown) handler.\n// See: https://github.com/angular/angular/issues/9419\nvar UP_ARROW = 38;\nvar DOWN_ARROW = 40;\nvar RIGHT_ARROW = 39;\nvar LEFT_ARROW = 37;\nvar PAGE_UP = 33;\nvar PAGE_DOWN = 34;\nvar HOME = 36;\nvar END = 35;\nvar ENTER = 13;\nvar SPACE = 32;\nvar TAB = 9;\nvar ESCAPE = 27;\n(function (KeyCodes) {\n    KeyCodes[KeyCodes[\"UP_ARROW\"] = 38] = \"UP_ARROW\";\n    KeyCodes[KeyCodes[\"DOWN_ARROW\"] = 40] = \"DOWN_ARROW\";\n    KeyCodes[KeyCodes[\"RIGHT_ARROW\"] = 39] = \"RIGHT_ARROW\";\n    KeyCodes[KeyCodes[\"LEFT_ARROW\"] = 37] = \"LEFT_ARROW\";\n    KeyCodes[KeyCodes[\"PAGE_UP\"] = 33] = \"PAGE_UP\";\n    KeyCodes[KeyCodes[\"PAGE_DOWN\"] = 34] = \"PAGE_DOWN\";\n    KeyCodes[KeyCodes[\"HOME\"] = 36] = \"HOME\";\n    KeyCodes[KeyCodes[\"END\"] = 35] = \"END\";\n    KeyCodes[KeyCodes[\"ENTER\"] = 13] = \"ENTER\";\n    KeyCodes[KeyCodes[\"SPACE\"] = 32] = \"SPACE\";\n    KeyCodes[KeyCodes[\"BACKSPACE\"] = 8] = \"BACKSPACE\";\n    KeyCodes[KeyCodes[\"DELETE\"] = 46] = \"DELETE\";\n    KeyCodes[KeyCodes[\"TAB\"] = 9] = \"TAB\";\n    KeyCodes[KeyCodes[\"ESCAPE\"] = 27] = \"ESCAPE\";\n    KeyCodes[KeyCodes[\"COMMA\"] = 188] = \"COMMA\";\n})(exports.KeyCodes || (exports.KeyCodes = {}));\n\nvar __decorate$15 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$15 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n/** Selector that matches all elements that may have style collisions with material1. */\nvar ELEMENTS_SELECTOR = \"\\n  md-card,\\n  md-card-actions,\\n  md-card-content,\\n  md-card-footer,\\n  md-card-header,\\n  md-card-subtitle,\\n  md-card-title,\\n  md-card-title-group,\\n  md-checkbox,\\n  md-dialog-container,\\n  md-divider,\\n  md-grid-list,\\n  md-grid-tile,\\n  md-grid-tile-footer,\\n  md-grid-tile-header,\\n  md-hint,\\n  md-icon,\\n  md-ink-bar,\\n  md-input,\\n  md-list,\\n  md-list-item,\\n  md-menu,\\n  md-nav-list,\\n  md-option,\\n  md-placeholder,\\n  md-progress-bar,\\n  md-progress-circle,\\n  md-radio-button,\\n  md-radio-group,\\n  md-select,\\n  md-sidenav,\\n  md-slider,\\n  md-spinner,\\n  md-tab,\\n  md-toolbar\\n\";\n/**\n * Directive to apply to all material2 components that use the same element name as a\n * component in material2. It does two things:\n * 1) Adds the css class \"md2\" to the host element so that material1 can use this class with a\n *    :not() in order to avoid affecting material2 elements.\n * 2) Adds a css class to the element that is identical to the element's tag. E.g., the element\n *    `<md-card>` would be given a css class `md-card`. This is done so that material2 can style\n *    only these classes instead of defining element rules that would affect material1 components.\n */\nvar StyleCompatibility = (function () {\n    function StyleCompatibility(renderer, elementRef) {\n        var element = elementRef.nativeElement;\n        renderer.setElementClass(element, 'md2', true);\n        renderer.setElementClass(element, element.nodeName.toLowerCase(), true);\n    }\n    StyleCompatibility = __decorate$15([\n        _angular_core.Directive({\n            selector: ELEMENTS_SELECTOR,\n        }), \n        __metadata$15('design:paramtypes', [_angular_core.Renderer, _angular_core.ElementRef])\n    ], StyleCompatibility);\n    return StyleCompatibility;\n}());\nvar StyleCompatibilityModule = (function () {\n    function StyleCompatibilityModule() {\n    }\n    StyleCompatibilityModule.forRoot = function () {\n        return {\n            ngModule: StyleCompatibilityModule,\n            providers: [],\n        };\n    };\n    StyleCompatibilityModule = __decorate$15([\n        _angular_core.NgModule({\n            declarations: [StyleCompatibility],\n            exports: [StyleCompatibility],\n        }), \n        __metadata$15('design:paramtypes', [])\n    ], StyleCompatibilityModule);\n    return StyleCompatibilityModule;\n}());\n\nvar AnimationCurves = (function () {\n    function AnimationCurves() {\n    }\n    AnimationCurves.STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n    AnimationCurves.DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n    AnimationCurves.ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n    AnimationCurves.SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n    return AnimationCurves;\n}());\n;\nvar AnimationDurations = (function () {\n    function AnimationDurations() {\n    }\n    AnimationDurations.COMPLEX = '375ms';\n    AnimationDurations.ENTERING = '225ms';\n    AnimationDurations.EXITING = '195ms';\n    return AnimationDurations;\n}());\n;\n\n/** Coerces a data-bound value (typically a string) to a boolean. */\nfunction coerceBooleanProperty(value) {\n    return value != null && \"\" + value !== 'false';\n}\n\n/** Coerces a data-bound value (typically a string) to a number. */\nfunction coerceNumberProperty(value, fallbackValue) {\n    if (fallbackValue === void 0) { fallbackValue = 0; }\n    // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n    // and other non-number values as NaN, where Number just uses 0) but it considers the string\n    // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n    return isNaN(parseFloat(value)) || isNaN(Number(value)) ? fallbackValue : Number(value);\n}\n\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MdCoreModule = (function () {\n    function MdCoreModule() {\n    }\n    MdCoreModule.forRoot = function () {\n        return {\n            ngModule: MdCoreModule,\n            providers: [A11Y_PROVIDERS, OVERLAY_PROVIDERS],\n        };\n    };\n    MdCoreModule = __decorate([\n        _angular_core.NgModule({\n            imports: [MdLineModule, RtlModule, MdRippleModule, PortalModule, OverlayModule, A11yModule],\n            exports: [MdLineModule, RtlModule, MdRippleModule, PortalModule, OverlayModule, A11yModule],\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdCoreModule);\n    return MdCoreModule;\n}());\n\nvar __decorate$18 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$18 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2Accordion = (function () {\n    function Md2Accordion() {\n        this.class = '';\n        this.close = new _angular_core.EventEmitter();\n        this.open = new _angular_core.EventEmitter();\n        this.tabs = [];\n    }\n    Object.defineProperty(Md2Accordion.prototype, \"multiple\", {\n        get: function () { return this._multiple; },\n        set: function (value) { this._multiple = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Add or append tab in accordion\n     * @param tab object of Md2AccordionTab\n     */\n    Md2Accordion.prototype.addTab = function (tab) {\n        this.tabs.push(tab);\n    };\n    __decorate$18([\n        _angular_core.Input(), \n        __metadata$18('design:type', Boolean)\n    ], Md2Accordion.prototype, \"multiple\", null);\n    __decorate$18([\n        _angular_core.Input(), \n        __metadata$18('design:type', String)\n    ], Md2Accordion.prototype, \"class\", void 0);\n    __decorate$18([\n        _angular_core.Output(), \n        __metadata$18('design:type', _angular_core.EventEmitter)\n    ], Md2Accordion.prototype, \"close\", void 0);\n    __decorate$18([\n        _angular_core.Output(), \n        __metadata$18('design:type', _angular_core.EventEmitter)\n    ], Md2Accordion.prototype, \"open\", void 0);\n    Md2Accordion = __decorate$18([\n        _angular_core.Component({selector: 'md2-accordion',\n            template: \"<ng-content></ng-content>\",\n            host: {\n                '[class]': 'class',\n                '[class.md2-accordion]': 'true'\n            },\n            styles: [\"\\n    .md2-accordion { display: block; }\\n  \"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$18('design:paramtypes', [])\n    ], Md2Accordion);\n    return Md2Accordion;\n}());\n\nvar __decorate$19 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$19 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2AccordionHeader = (function () {\n    function Md2AccordionHeader() {\n    }\n    Md2AccordionHeader = __decorate$19([\n        _angular_core.Directive({ selector: 'md2-accordion-header' }), \n        __metadata$19('design:paramtypes', [])\n    ], Md2AccordionHeader);\n    return Md2AccordionHeader;\n}());\nvar Md2AccordionTab = (function () {\n    function Md2AccordionTab(accordion) {\n        this.accordion = accordion;\n        this.accordion.addTab(this);\n    }\n    /**\n     * Toggle the accordion\n     * @param event\n     * @return if it is disabled\n     */\n    Md2AccordionTab.prototype.toggle = function (event) {\n        if (this.disabled) {\n            event.preventDefault();\n            return;\n        }\n        var index = this.findTabIndex();\n        if (this.active) {\n            this.active = !this.active;\n            this.accordion.close.emit({ originalEvent: event, index: index });\n        }\n        else if (!this.accordion.multiple) {\n            for (var i = 0; i < this.accordion.tabs.length; i++) {\n                this.accordion.tabs[i].active = false;\n            }\n            this.active = true;\n            this.accordion.open.emit({ originalEvent: event, index: index });\n        }\n        else {\n            this.active = true;\n            this.accordion.open.emit({ originalEvent: event, index: index });\n        }\n        event.preventDefault();\n    };\n    /**\n     * Find index of specific tab of accordion\n     * @return index number of this tab\n     */\n    Md2AccordionTab.prototype.findTabIndex = function () {\n        var index = -1;\n        for (var i = 0; i < this.accordion.tabs.length; i++) {\n            if (this.accordion.tabs[i] === this) {\n                index = i;\n                break;\n            }\n        }\n        return index;\n    };\n    __decorate$19([\n        _angular_core.Input(), \n        __metadata$19('design:type', String)\n    ], Md2AccordionTab.prototype, \"header\", void 0);\n    __decorate$19([\n        _angular_core.Input(), \n        __metadata$19('design:type', Boolean)\n    ], Md2AccordionTab.prototype, \"active\", void 0);\n    __decorate$19([\n        _angular_core.Input(), \n        __metadata$19('design:type', Boolean)\n    ], Md2AccordionTab.prototype, \"disabled\", void 0);\n    Md2AccordionTab = __decorate$19([\n        _angular_core.Component({selector: 'md2-accordion-tab',\n            template: \"\\n    <div class=\\\"md2-accordion-header\\\" (click)=\\\"toggle($event)\\\">\\n      <span>{{header}}</span>\\n      <ng-content select=\\\"md2-accordion-header\\\"></ng-content>\\n      <span class=\\\"md2-accordion-header-icon\\\"></span>\\n    </div>\\n    <div class=\\\"md2-accordion-tab-content\\\">\\n      <ng-content></ng-content>\\n    </div>\\n  \",\n            styles: [\"\\n    md2-accordion-tab { position: relative; display: block; outline: 0; border: 0; border-width: 0 0 1px 0; border-style: solid; border-color: rgba(0, 0, 0, 0.12); -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }\\n    md2-accordion-tab[hidden] { display: none; }\\n    md2-accordion-tab.md2-accordion-tab-active { border-color: rgba(0, 0, 0, 0.12); }\\n    md2-accordion-tab .md2-accordion-header { position: relative; border-radius: 0; color: rgba(0, 0, 0, 0.85); font-weight: 500; cursor: pointer; display: block; align-items: inherit; line-height: 40px; margin: 0; max-height: 40px; overflow: hidden; padding: 0 35px 0 16px; text-align: left; text-decoration: none; white-space: nowrap; width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-drag: none; }\\n    md2-accordion-tab.md2-accordion-tab-active .md2-accordion-header { color: #106cc8; }\\n    md2-accordion-tab.md2-accordion-tab-disabled .md2-accordion-header { pointer-events: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-drag: none; opacity: 0.5; cursor: default; }\\n    md2-accordion-tab .md2-accordion-header-icon { position: absolute; top: 12px; right: 17px; width: 8px; height: 8px; overflow: hidden; display: inline-block; border-width: 0 2px 2px 0; border-style: solid; border-color: rgba(0, 0, 0, 0.54); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); -webkit-transform: rotate(45deg); transform: rotate(45deg); -moz-transition: 0.3s ease-in-out; -o-transition: 0.3s ease-in-out; -webkit-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out; }\\n    md2-accordion-tab.md2-accordion-tab-active .md2-accordion-header-icon { -moz-transform: rotate(225deg); -ms-transform: rotate(225deg); -o-transform: rotate(225deg); -webkit-transform: rotate(225deg); transform: rotate(225deg); top: 16px; }\\n    md2-accordion-tab .md2-accordion-tab-content { position: relative; display: none; padding: 16px; }\\n    md2-accordion-tab.md2-accordion-tab-active .md2-accordion-tab-content { display: block; }\\n  \"],\n            host: {\n                'role': 'accordion-tab',\n                '[class.md2-accordion-tab-active]': 'active',\n                '[class.md2-accordion-tab-disabled]': 'disabled'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$19('design:paramtypes', [Md2Accordion])\n    ], Md2AccordionTab);\n    return Md2AccordionTab;\n}());\n\nvar __decorate$17 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$17 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MD2_ACCORDION_DIRECTIVES = [Md2Accordion, Md2AccordionTab, Md2AccordionHeader];\nvar Md2AccordionModule = (function () {\n    function Md2AccordionModule() {\n    }\n    Md2AccordionModule.forRoot = function () {\n        return {\n            ngModule: Md2AccordionModule,\n            providers: []\n        };\n    };\n    Md2AccordionModule = __decorate$17([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_ACCORDION_DIRECTIVES,\n            declarations: MD2_ACCORDION_DIRECTIVES,\n        }), \n        __metadata$17('design:paramtypes', [])\n    ], Md2AccordionModule);\n    return Md2AccordionModule;\n}());\n\nvar __decorate$21 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$21 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar HighlightPipe = (function () {\n    function HighlightPipe() {\n    }\n    /**\n     * Transform function\n     * @param value string\n     * @param query string filter value\n     * @return filtered string with markup\n     */\n    HighlightPipe.prototype.transform = function (value, query) {\n        if (query.length < 1) {\n            return value;\n        }\n        return query ? value.replace(new RegExp(this.escapeRegexp(query), 'gi'), '<span class=\"highlight\">$&</span>') : value;\n    };\n    /**\n     * filter pipe\n     * @param queryToEscape\n     * @return queryToEscape with replace string\n     */\n    HighlightPipe.prototype.escapeRegexp = function (queryToEscape) {\n        return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n    };\n    HighlightPipe = __decorate$21([\n        _angular_core.Pipe({ name: 'highlight' }), \n        __metadata$21('design:paramtypes', [])\n    ], HighlightPipe);\n    return HighlightPipe;\n}());\n\nvar __decorate$20 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$20 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Item = (function () {\n    function Item(source, textKey, valueKey) {\n        if (typeof source === 'string') {\n            this.text = this.value = source;\n        }\n        if (typeof source === 'object') {\n            this.text = source[textKey];\n            this.value = valueKey ? source[valueKey] : source;\n        }\n    }\n    return Item;\n}());\nvar noop = function () { };\nvar nextId = 0;\nvar MD2_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Autocomplete; }),\n    multi: true\n};\nvar Md2Autocomplete = (function () {\n    function Md2Autocomplete(element) {\n        this.element = element;\n        this.change = new _angular_core.EventEmitter();\n        this.textChange = new _angular_core.EventEmitter();\n        this._value = '';\n        this._disabled = false;\n        this._isInitialized = false;\n        this._onTouchedCallback = noop;\n        this._onChangeCallback = noop;\n        this._items = [];\n        this.list = [];\n        this.focusedOption = 0;\n        this.inputBuffer = '';\n        this.selectedItem = null;\n        this.inputFocused = false;\n        this.noBlur = true;\n        this.id = 'md2-autocomplete-' + (++nextId);\n        this.tabindex = 0;\n        this.placeholder = '';\n        this.textKey = 'text';\n        this.valueKey = null;\n        this.minLength = 1;\n    }\n    Md2Autocomplete.prototype.ngAfterContentInit = function () { this._isInitialized = true; };\n    Object.defineProperty(Md2Autocomplete.prototype, \"readonly\", {\n        get: function () { return this._readonly; },\n        set: function (value) { this._readonly = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Autocomplete.prototype, \"required\", {\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Autocomplete.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Autocomplete.prototype, \"items\", {\n        set: function (value) { this._items = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Autocomplete.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) {\n            var _this = this;\n            if (value !== this._value) {\n                this._value = value;\n                this.inputBuffer = '';\n                if (value) {\n                    var selItm = this._items.find(function (i) { return _this.equals(_this.valueKey ? i[_this.valueKey] : i, value); });\n                    this.selectedItem = new Item(selItm, this.textKey, this.valueKey);\n                    if (this.selectedItem) {\n                        this.inputBuffer = this.selectedItem.text;\n                    }\n                }\n                if (!this.inputBuffer) {\n                    this.inputBuffer = '';\n                }\n                if (this._isInitialized) {\n                    this._onChangeCallback(value);\n                    this.change.emit(value);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Compare two vars or objects\n     * @param o1 compare first object\n     * @param o2 compare second object\n     * @return boolean comparation result\n     */\n    Md2Autocomplete.prototype.equals = function (o1, o2) {\n        if (o1 === o2) {\n            return true;\n        }\n        if (o1 === null || o2 === null) {\n            return false;\n        }\n        if (o1 !== o1 && o2 !== o2) {\n            return true;\n        }\n        var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n        if (t1 === t2 && t1 === 'object') {\n            keySet = Object.create(null);\n            for (key in o1) {\n                if (!this.equals(o1[key], o2[key])) {\n                    return false;\n                }\n                keySet[key] = true;\n            }\n            for (key in o2) {\n                if (!(key in keySet) && key.charAt(0) !== '$' && o2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    };\n    Object.defineProperty(Md2Autocomplete.prototype, \"isMenuVisible\", {\n        get: function () {\n            return ((this.inputFocused || this.noBlur) && this.list && this.list.length && !this.selectedItem) && !this.readonly ? true : false;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * update scroll of suggestion menu\n     */\n    Md2Autocomplete.prototype.updateScroll = function () {\n        if (this.focusedOption < 0) {\n            return;\n        }\n        var menuContainer = this.element.nativeElement.querySelector('.md2-autocomplete-menu');\n        if (!menuContainer) {\n            return;\n        }\n        var choices = menuContainer.querySelectorAll('.md2-option');\n        if (choices.length < 1) {\n            return;\n        }\n        var highlighted = choices[this.focusedOption];\n        if (!highlighted) {\n            return;\n        }\n        var top = highlighted.offsetTop + highlighted.clientHeight - menuContainer.scrollTop;\n        var height = menuContainer.offsetHeight;\n        if (top > height) {\n            menuContainer.scrollTop += top - height;\n        }\n        else if (top < highlighted.clientHeight) {\n            menuContainer.scrollTop -= highlighted.clientHeight - top;\n        }\n    };\n    /**\n     * input event listner\n     * @param event\n     */\n    Md2Autocomplete.prototype.inputKeydown = function (event) {\n        var _this = this;\n        if (this.disabled) {\n            return;\n        }\n        this.textChange.emit(this.inputBuffer);\n        switch (event.keyCode) {\n            case TAB:\n                this.listLeave();\n                break;\n            case ESCAPE:\n                event.stopPropagation();\n                event.preventDefault();\n                if (this.inputBuffer) {\n                    this.onClear();\n                }\n                break;\n            case ENTER:\n                event.preventDefault();\n                event.stopPropagation();\n                if (this.isMenuVisible) {\n                    this.select(event, this.focusedOption);\n                }\n                break;\n            case DOWN_ARROW:\n                event.preventDefault();\n                event.stopPropagation();\n                if (this.isMenuVisible) {\n                    this.focusedOption = (this.focusedOption === this.list.length - 1) ? 0 : Math.min(this.focusedOption + 1, this.list.length - 1);\n                    this.updateScroll();\n                }\n                break;\n            case UP_ARROW:\n                event.preventDefault();\n                event.stopPropagation();\n                if (this.isMenuVisible) {\n                    this.focusedOption = (this.focusedOption === 0) ? this.list.length - 1 : Math.max(0, this.focusedOption - 1);\n                    this.updateScroll();\n                }\n                break;\n            default:\n                setTimeout(function () {\n                    _this.updateItems(new RegExp(_this.inputBuffer, 'ig'));\n                }, 10);\n        }\n    };\n    /**\n     * select option\n     * @param event\n     * @param index of selected item\n     */\n    Md2Autocomplete.prototype.select = function (event, index) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.selectedItem = this.list[index];\n        this.inputBuffer = this.list[index].text;\n        this.updateValue();\n    };\n    /**\n     * clear selected suggestion\n     */\n    Md2Autocomplete.prototype.onClear = function () {\n        if (this.disabled) {\n            return;\n        }\n        this.inputBuffer = '';\n        this.selectedItem = null;\n        this.updateItems(new RegExp(this.inputBuffer, 'ig'));\n        this._value = this.selectedItem ? this.selectedItem.value : this.selectedItem;\n        this.updateValue();\n    };\n    /**\n     * update value\n     */\n    Md2Autocomplete.prototype.updateValue = function () {\n        this._value = this.selectedItem ? this.selectedItem.value : this.selectedItem;\n        this._onChangeCallback(this._value);\n        this.change.emit(this._value);\n        this.onFocus();\n    };\n    /**\n     * component focus listener\n     */\n    Md2Autocomplete.prototype.onFocus = function () {\n        if (this.disabled) {\n            return;\n        }\n        this.element.nativeElement.querySelector('input').focus();\n    };\n    /**\n     * input focus listener\n     */\n    Md2Autocomplete.prototype.onInputFocus = function () {\n        this.inputFocused = true;\n        this.updateItems(new RegExp(this.inputBuffer, 'ig'));\n        this.focusedOption = 0;\n    };\n    /**\n     * input blur listener\n     */\n    Md2Autocomplete.prototype.onInputBlur = function () {\n        this.inputFocused = false;\n    };\n    /**\n     * suggestion menu mouse enter listener\n     */\n    Md2Autocomplete.prototype.listEnter = function () { this.noBlur = true; };\n    /**\n     * suggestion menu mouse leave listener\n     */\n    Md2Autocomplete.prototype.listLeave = function () { this.noBlur = false; };\n    /**\n     * Update suggestion to filter the query\n     * @param query\n     */\n    Md2Autocomplete.prototype.updateItems = function (query) {\n        var _this = this;\n        if (this.inputBuffer.length < this.minLength) {\n            this.list = [];\n        }\n        else {\n            this.list = this._items.map(function (i) { return new Item(i, _this.textKey, _this.valueKey); }).filter(function (i) { return query.test(i.text); });\n            if (this.list.length && this.list[0].text !== this.inputBuffer) {\n                this.selectedItem = null;\n            }\n        }\n    };\n    Md2Autocomplete.prototype.writeValue = function (value) {\n        var _this = this;\n        if (value !== this._value) {\n            this._value = value;\n            this.inputBuffer = '';\n            if (value) {\n                var selItm = this._items.find(function (i) { return _this.equals(_this.valueKey ? i[_this.valueKey] : i, value); });\n                this.selectedItem = new Item(selItm, this.textKey, this.valueKey);\n                if (this.selectedItem) {\n                    this.inputBuffer = this.selectedItem.text;\n                }\n            }\n            if (!this.inputBuffer) {\n                this.inputBuffer = '';\n            }\n        }\n    };\n    Md2Autocomplete.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };\n    Md2Autocomplete.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };\n    __decorate$20([\n        _angular_core.Output(), \n        __metadata$20('design:type', _angular_core.EventEmitter)\n    ], Md2Autocomplete.prototype, \"change\", void 0);\n    __decorate$20([\n        _angular_core.Output(), \n        __metadata$20('design:type', Object)\n    ], Md2Autocomplete.prototype, \"textChange\", void 0);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', String)\n    ], Md2Autocomplete.prototype, \"id\", void 0);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Number)\n    ], Md2Autocomplete.prototype, \"tabindex\", void 0);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', String)\n    ], Md2Autocomplete.prototype, \"placeholder\", void 0);\n    __decorate$20([\n        _angular_core.Input('item-text'), \n        __metadata$20('design:type', String)\n    ], Md2Autocomplete.prototype, \"textKey\", void 0);\n    __decorate$20([\n        _angular_core.Input('item-value'), \n        __metadata$20('design:type', String)\n    ], Md2Autocomplete.prototype, \"valueKey\", void 0);\n    __decorate$20([\n        _angular_core.Input('min-length'), \n        __metadata$20('design:type', Number)\n    ], Md2Autocomplete.prototype, \"minLength\", void 0);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Boolean)\n    ], Md2Autocomplete.prototype, \"readonly\", null);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Boolean)\n    ], Md2Autocomplete.prototype, \"required\", null);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Boolean)\n    ], Md2Autocomplete.prototype, \"disabled\", null);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Array), \n        __metadata$20('design:paramtypes', [Array])\n    ], Md2Autocomplete.prototype, \"items\", null);\n    __decorate$20([\n        _angular_core.Input(), \n        __metadata$20('design:type', Object)\n    ], Md2Autocomplete.prototype, \"value\", null);\n    Md2Autocomplete = __decorate$20([\n        _angular_core.Component({selector: 'md2-autocomplete',\n            template: \"\\n    <div class=\\\"md2-autocomplete-wrap\\\" [class.is-focused]=\\\"inputFocused || isMenuVisible\\\">\\n      <input [(ngModel)]=\\\"inputBuffer\\\" type=\\\"text\\\" tabs=\\\"false\\\" autocomplete=\\\"off\\\" [readonly]=\\\"readonly\\\" [tabindex]=\\\"disabled ? -1 : tabindex\\\" [disabled]=\\\"disabled\\\" class=\\\"md2-autocomplete-input\\\" (focus)=\\\"onInputFocus()\\\" (blur)=\\\"onInputBlur()\\\" (keydown)=\\\"inputKeydown($event)\\\" (change)=\\\"$event.stopPropagation()\\\" />\\n      <span class=\\\"md2-autocomplete-placeholder\\\" [class.has-value]=\\\"inputBuffer\\\">\\n        {{placeholder}}\\n        <span class=\\\"md2-placeholder-required\\\" *ngIf=\\\"required\\\">*</span>\\n      </span>\\n      <svg *ngIf=\\\"inputBuffer\\\" (click)=\\\"onClear()\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n        <path d=\\\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\\\" />\\n      </svg>\\n    </div>\\n    <ul *ngIf=\\\"isMenuVisible\\\" class=\\\"md2-autocomplete-menu\\\" (mouseenter)=\\\"listEnter()\\\" (mouseleave)=\\\"listLeave()\\\">\\n      <li class=\\\"md2-option\\\" *ngFor=\\\"let l of list; let i = index;\\\" [class.focus]=\\\"focusedOption === i\\\" (click)=\\\"select($event, i)\\\">\\n        <div class=\\\"md2-text\\\" [innerHtml]=\\\"l.text | highlight:inputBuffer\\\"></div>\\n      </li>\\n    </ul>\\n  \",\n            styles: [\"\\n    md2-autocomplete { position: relative; display: block; margin: 18px 0; outline: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -moz-backface-visibility: hidden; -webkit-backface-visibility: hidden; backface-visibility: hidden; }\\n    md2-autocomplete.md2-autocomplete-disabled { pointer-events: none; cursor: default; }\\n    md2-autocomplete .md2-autocomplete-wrap { position: relative; display: block; width: 100%; padding: 2px 2px 1px; border-bottom: 1px solid rgba(0, 0, 0, 0.12); box-sizing: border-box; min-width: 64px; min-height: 26px; cursor: pointer; }\\n    .md2-autocomplete-wrap.is-focused { padding-bottom: 0; border-bottom: 2px solid #106cc8; }\\n    md2-autocomplete.md2-autocomplete-disabled .md2-autocomplete-wrap { color: rgba(0,0,0,0.38); border-color: transparent; background-image: linear-gradient(to right, rgba(0,0,0,0.38) 0%, rgba(0,0,0,0.38) 33%, transparent 0%); background-position: bottom -1px left 0; background-size: 4px 1px; background-repeat: repeat-x; cursor: default; cursor: default; }\\n    md2-autocomplete.md2-autocomplete-disabled .md2-autocomplete-wrap.is-focused { padding-bottom: 1px; border-bottom: 1px solid transparent; }\\n    .md2-autocomplete-wrap .md2-autocomplete-input { width: 100%; height: 26px; font-size: 15px; outline: none; background: transparent; border: 0; box-sizing: border-box; }\\n    md2-autocomplete.md2-autocomplete-disabled .md2-autocomplete-input { color: rgba(0,0,0,0.38); }\\n    md2-autocomplete .md2-autocomplete-placeholder { color: rgba(0, 0, 0, 0.38); position: absolute; right: 26px; bottom: 100%; left: 0; color: rgba(0,0,0,0.38); max-width: 100%; padding-left: 3px; padding-right: 0; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; z-index: 1; transform: translate3d(0,26px,0) scale(1); transition: transform .4s cubic-bezier(.25,.8,.25,1); transform-origin: left top; color: rgba(0, 0, 0, 0.38); }\\n    .md2-autocomplete-wrap.is-focused .md2-autocomplete-placeholder { color: #2196f3; }\\n    .md2-autocomplete-wrap.is-focused .md2-autocomplete-placeholder .md2-placeholder-required { color: #f00; }\\n    .md2-autocomplete-wrap.is-focused .md2-autocomplete-placeholder,\\n    md2-autocomplete .md2-autocomplete-placeholder.has-value { transform: translate3d(0,6px,0) scale(.75); }\\n    .md2-autocomplete-wrap svg { position: absolute; right: 0; top: 0; display: block; height: 100%; background: #fff; fill: currentColor; color: rgba(0,0,0,0.54); }\\n    .md2-autocomplete-menu { position: absolute; left: 0; top: 100%; display: block; z-index: 10; width: 100%; margin: 0; padding: 8px 0; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); max-height: 256px; min-height: 48px; overflow-y: auto; background: #fff; }\\n    .md2-autocomplete-menu .md2-option { position: relative; display: block; color: #212121; cursor: pointer; width: auto; padding: 0 16px; height: 48px; line-height: 48px; -moz-transition: background 0.15s linear; -o-transition: background 0.15s linear; -webkit-transition: background 0.15s linear; transition: background 0.15s linear; }\\n    .md2-autocomplete-menu .md2-option:hover,\\n    .md2-autocomplete-menu .md2-option.focus { background: #eeeeee; }\\n    .md2-autocomplete-menu .md2-option .md2-text { width: auto; white-space: nowrap; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; font-size: 16px; }\\n    .md2-autocomplete-menu .highlight { color: #757575; }\\n  \"],\n            providers: [MD2_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'autocomplete',\n                '[id]': 'id',\n                '[class.md2-autocomplete-disabled]': 'disabled',\n                '[attr.aria-disabled]': 'disabled'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$20('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Autocomplete);\n    return Md2Autocomplete;\n}());\nvar MD2_AUTOCOMPLETE_DIRECTIVES = [Md2Autocomplete, HighlightPipe];\nvar Md2AutocompleteModule = (function () {\n    function Md2AutocompleteModule() {\n    }\n    Md2AutocompleteModule.forRoot = function () {\n        return {\n            ngModule: Md2AutocompleteModule,\n            providers: []\n        };\n    };\n    Md2AutocompleteModule = __decorate$20([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule],\n            exports: MD2_AUTOCOMPLETE_DIRECTIVES,\n            declarations: MD2_AUTOCOMPLETE_DIRECTIVES,\n        }), \n        __metadata$20('design:paramtypes', [])\n    ], Md2AutocompleteModule);\n    return Md2AutocompleteModule;\n}());\n\nvar __decorate$22 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$22 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar noop$1 = function () { };\nvar Chip = (function () {\n    function Chip(source, textKey, valueKey) {\n        if (typeof source === 'string') {\n            this.text = this.value = source;\n        }\n        if (typeof source === 'object') {\n            this.text = source[textKey];\n            this.value = valueKey ? source[valueKey] : source;\n        }\n    }\n    return Chip;\n}());\nvar nextId$1 = 0;\nvar MD2_CHIPS_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Chips; }),\n    multi: true\n};\nvar Md2Chips = (function () {\n    function Md2Chips(elementRef) {\n        this.elementRef = elementRef;\n        this.addOnBlur = true;\n        this.addOnComma = true;\n        this.addOnEnter = true;\n        this.addOnPaste = true;\n        this.addOnSpace = false;\n        this.allowedPattern = /.+/;\n        this.pasteSplitPattern = ',';\n        this.placeholder = 'Add New';\n        this.isAutoComplete = false;\n        this.isRemovable = true;\n        this.readonly = false;\n        this.minChips = 0;\n        this.maxChips = 10000;\n        this.id = 'md2-chips-' + (++nextId$1);\n        this.autocompleteItemText = 'text';\n        this.textKey = 'text';\n        this.valueKey = null;\n        this.change = new _angular_core.EventEmitter();\n        this.onTouchedCallback = noop$1;\n        this.onChangeCallback = noop$1;\n        this.chipItemList = [];\n        this.inputValue = '';\n        this._value = '';\n        this.selectedChip = -1;\n        this.inputFocused = false;\n        this.isEmptyAutoComplete = true;\n    }\n    Object.defineProperty(Md2Chips.prototype, \"element\", {\n        get: function () {\n            var elements = { root: this.elementRef.nativeElement, mainDiv: null, template: null };\n            elements.mainDiv = elements.root.querySelector('.md2-chips-container');\n            elements.template = elements.mainDiv.querySelector('.md2-template');\n            return elements;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Chips.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) { this.setValue(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Chips.prototype, \"setValue\", {\n        /**\n         * set value\n         * @param value\n         */\n        set: function (value) {\n            if (value !== this._value) {\n                this._value = value;\n                this.chipItemList = [];\n                if (value) {\n                    if (value && value.length && typeof value[0] === 'object' && Array.isArray(value)) {\n                        for (var i = 0; i < value.length; i++) {\n                            this.chipItemList.push(new Chip(value[i], this.textKey, this.valueKey));\n                        }\n                        this.isObject = true;\n                    }\n                    else if (value && value.length && typeof value[0] === 'string' && Array.isArray(value)) {\n                        this.chipItemList = value;\n                        this.isObject = false;\n                    }\n                }\n            }\n            this.onChangeCallback(value);\n            this.change.emit(this.chipItemList);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Md2Chips.prototype.changeAutocomplete = function (value) {\n        if (value) {\n            var objText = value[this.autocompleteItemText];\n            this.addNewChip(objText);\n            this.item = null;\n        }\n    };\n    Md2Chips.prototype.ngAfterContentInit = function () {\n        var elements = this.element;\n        this.splitRegExp = new RegExp(this.pasteSplitPattern);\n        if (elements.template) {\n            this.templateHtmlString = elements.template.innerHTML;\n        }\n    };\n    //check autocomplete input is empty or not\n    Md2Chips.prototype.valueupdate = function (evt) {\n        this.isEmptyAutoComplete = evt ? false : true;\n    };\n    /**\n     * input key listener\n     * @param event\n     */\n    Md2Chips.prototype.inputChanged = function (event) {\n        var key = event.keyCode;\n        switch (key) {\n            //back space\n            case exports.KeyCodes.BACKSPACE:\n                this.backspaceEvent();\n                break;\n            //delete\n            case exports.KeyCodes.DELETE:\n                this.backspaceEvent();\n                break;\n            //left arrow\n            case exports.KeyCodes.LEFT_ARROW:\n                if (this.isAutoComplete && this.isEmptyAutoComplete) {\n                    this.leftArrowKeyEvents();\n                }\n                else if (!this.isAutoComplete && !this.inputValue) {\n                    this.leftArrowKeyEvents();\n                }\n                break;\n            //right arrow\n            case exports.KeyCodes.RIGHT_ARROW:\n                if (this.isAutoComplete && this.isEmptyAutoComplete) {\n                    this.rightArrowKeyEvents();\n                }\n                else if (!this.isAutoComplete && !this.inputValue) {\n                    this.rightArrowKeyEvents();\n                }\n                break;\n            //enter\n            case exports.KeyCodes.ENTER:\n                if (this.addOnEnter) {\n                    this.addNewChip(this.inputValue);\n                    event.preventDefault();\n                }\n                break;\n            //comma\n            case exports.KeyCodes.COMMA:\n                if (this.addOnComma) {\n                    this.addNewChip(this.inputValue);\n                    event.preventDefault();\n                }\n                break;\n            //space\n            case exports.KeyCodes.SPACE:\n                if (this.addOnSpace) {\n                    this.addNewChip(this.inputValue);\n                    event.preventDefault();\n                }\n                break;\n            default:\n                break;\n        }\n    };\n    Md2Chips.prototype.onFocus = function () {\n        if (this.readonly) {\n            return;\n        }\n        if (!this.isAutoComplete) {\n            this.elementRef.nativeElement.querySelector('input.chip-input').focus();\n        }\n        this._resetSelected();\n    };\n    Md2Chips.prototype.inputBlurred = function (event) {\n        this.inputFocused = false;\n    };\n    Md2Chips.prototype.inputFocus = function (event) {\n        if (this.readonly) {\n            return;\n        }\n        this.inputFocused = true;\n    };\n    Md2Chips.prototype.inputPaste = function (event) {\n        var _this = this;\n        var clipboardData = event.clipboardData || (event.originalEvent && event.originalEvent.clipboardData);\n        var pastedString = clipboardData.getData('text/plain');\n        var chips = this.addRegExpString(pastedString);\n        var chipsToAdd = chips.filter(function (chip) { return _this._isValid(chip); });\n        this.addNewChip(chipsToAdd);\n        setTimeout(function () { return _this._resetInput(); });\n    };\n    Md2Chips.prototype.leftArrowKeyEvents = function () {\n        event.preventDefault();\n        if (this.selectedChip) {\n            if (this.selectedChip < 0) {\n                this.selectedChip = this.chipItemList.length - 1;\n            }\n            else {\n                this.selectedChip = this.selectedChip - 1;\n            }\n        }\n    };\n    Md2Chips.prototype.rightArrowKeyEvents = function () {\n        event.preventDefault();\n        if (this.selectedChip != -1) {\n            if (this.selectedChip >= this.chipItemList.length) {\n                this.selectedChip = 0;\n            }\n            else {\n                this.selectedChip = this.selectedChip + 1;\n            }\n        }\n    };\n    Md2Chips.prototype.addRegExpString = function (chipInputString) {\n        chipInputString = chipInputString.trim();\n        var chips = chipInputString.split(this.splitRegExp);\n        return chips.filter(function (chip) { return !!chip; });\n    };\n    Md2Chips.prototype._isValid = function (chipString) {\n        if (chipString) {\n            var isExist = void 0;\n            if (this.isObject) {\n                isExist = this.chipItemList.filter(function (chip) { return chip.text === chipString; });\n                return isExist.length ? false : true;\n            }\n            else {\n                if (this.chipItemList.indexOf(chipString) === -1)\n                    return this.allowedPattern.test(chipString);\n            }\n        }\n    };\n    /**\n    * add new chip\n    * @param chips\n    */\n    Md2Chips.prototype.addNewChip = function (chips) {\n        var validInput = this._isValid(chips);\n        if (validInput) {\n            if (this.maxChips) {\n                if (this.chipItemList.length < this.maxChips) {\n                    if (this.isObject && this.chipItemList.length > 0) {\n                        var a = {};\n                        a[this.textKey] = chips;\n                        this.chipItemList.push(new Chip(a, this.textKey, this.valueKey));\n                    }\n                    else {\n                        this.chipItemList.push(chips);\n                    }\n                }\n            }\n            else {\n                this.chipItemList.push(new Chip(chips, this.textKey, this.valueKey));\n                this.item = null;\n            }\n        }\n        this._resetSelected();\n        this._resetInput();\n        this.updateValue();\n    };\n    /**\n   * remove selected chip\n   * @param chipIndexToRemove index of selected chip\n   */\n    Md2Chips.prototype.removeSelectedChip = function (chipIndexToRemove) {\n        this.chipItemList.splice(chipIndexToRemove, 1);\n        this._resetSelected();\n        this.updateValue();\n    };\n    /**\n    * select chip\n    * @param index of select chip\n    */\n    Md2Chips.prototype.selectChip = function (index) {\n        if (index >= -1 && index <= this.chipItemList.length) {\n            this.selectedChip = index;\n        }\n    };\n    Md2Chips.prototype.backspaceEvent = function () {\n        if (!this.inputValue.length && this.chipItemList.length && this.isRemovable && this.isEmptyAutoComplete) {\n            if (this.selectedChip != -1) {\n                this.removeSelectedChip(this.selectedChip);\n                this.selectedChip = this.chipItemList.length - 1;\n            }\n            else {\n                this.selectedChip = this.chipItemList.length - 1;\n            }\n        }\n    };\n    Md2Chips.prototype._resetSelected = function () {\n        this.selectedChip = -1;\n    };\n    Md2Chips.prototype._resetInput = function () {\n        if (this.isAutoComplete) {\n            this.chipInputForm.controls['autocomplete'].setValue('');\n        }\n        else {\n            this.chipInputForm.controls['chipInput'].setValue('');\n        }\n    };\n    /**\n     * update value\n     */\n    Md2Chips.prototype.updateValue = function () {\n        this._value = new Array();\n        for (var i = 0; i < this.chipItemList.length; i++) {\n            if (this.isObject) {\n                this._value.push(this.chipItemList[i].value);\n            }\n            else {\n                this._value.push(this.chipItemList[i]);\n            }\n        }\n        this.onChangeCallback(this._value);\n        this.change.emit(this._value);\n    };\n    Md2Chips.prototype.writeValue = function (value) {\n        if (value !== this._value) {\n            this._value = value;\n            this.chipItemList = [];\n            if (value) {\n                if (value && value.length && typeof value[0] === 'object' && Array.isArray(value)) {\n                    for (var i = 0; i < value.length; i++) {\n                        this.chipItemList.push(new Chip(value[i], this.textKey, this.valueKey));\n                    }\n                    this.isObject = true;\n                }\n                else if (value && value.length && typeof value[0] === 'string' && Array.isArray(value)) {\n                    this.chipItemList = value;\n                    this.isObject = false;\n                }\n            }\n        }\n    };\n    Md2Chips.prototype.registerOnChange = function (fn) { this.onChangeCallback = fn; };\n    Md2Chips.prototype.registerOnTouched = function (fn) { this.onTouchedCallback = fn; };\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"addOnBlur\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"addOnComma\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"addOnEnter\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"addOnPaste\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"addOnSpace\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', RegExp)\n    ], Md2Chips.prototype, \"allowedPattern\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Array)\n    ], Md2Chips.prototype, \"ngModel\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"pasteSplitPattern\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"placeholder\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Array)\n    ], Md2Chips.prototype, \"autocompleteDataList\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"isAutoComplete\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"isRemovable\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Boolean)\n    ], Md2Chips.prototype, \"readonly\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Number)\n    ], Md2Chips.prototype, \"minChips\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Number)\n    ], Md2Chips.prototype, \"maxChips\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"id\", void 0);\n    __decorate$22([\n        _angular_core.Input('autocomplete-item-text'), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"autocompleteItemText\", void 0);\n    __decorate$22([\n        _angular_core.Input('item-text'), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"textKey\", void 0);\n    __decorate$22([\n        _angular_core.Input('item-value'), \n        __metadata$22('design:type', String)\n    ], Md2Chips.prototype, \"valueKey\", void 0);\n    __decorate$22([\n        _angular_core.Output(), \n        __metadata$22('design:type', _angular_core.EventEmitter)\n    ], Md2Chips.prototype, \"change\", void 0);\n    __decorate$22([\n        _angular_core.ViewChild('chipInputForm'), \n        __metadata$22('design:type', _angular_forms.NgForm)\n    ], Md2Chips.prototype, \"chipInputForm\", void 0);\n    __decorate$22([\n        _angular_core.Input(), \n        __metadata$22('design:type', Object)\n    ], Md2Chips.prototype, \"value\", null);\n    __decorate$22([\n        _angular_core.HostListener('focus'), \n        __metadata$22('design:type', Function), \n        __metadata$22('design:paramtypes', []), \n        __metadata$22('design:returntype', void 0)\n    ], Md2Chips.prototype, \"onFocus\", null);\n    Md2Chips = __decorate$22([\n        _angular_core.Component({\n            selector: 'md2-chips',\n            template: \"<div class=\\\"md2-chips-container\\\" [class.md2-chip-disabled]=\\\"readonly\\\">\\n        <span *ngFor=\\\"let chip of chipItemList; let i = index\\\" class=\\\"md2-chip\\\" [class.active]=\\\"selectedChip === i\\\">\\n            <span *ngIf=\\\"isObject\\\">{{chip.text}}</span>\\n            <span *ngIf=\\\"!isObject\\\">{{chip}}</span>\\n            <span [innerHTML]=\\\"templateHtmlString\\\"></span>\\n            <svg (click)=\\\"removeSelectedChip(i)\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" *ngIf=\\\"isRemovable\\\">\\n                <path d=\\\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\\\" />\\n            </svg>\\n        </span>\\n        <ng-content select=\\\".md2-template\\\"></ng-content>\\n        <form #chipInputForm=\\\"ngForm\\\" class=\\\"chip-input-form\\\" *ngIf=\\\"!readonly\\\">\\n            <input *ngIf=\\\"!isAutoComplete\\\" class=\\\"chip-input\\\" type=\\\"text\\\" [(ngModel)]=\\\"inputValue\\\" name=\\\"chipInput\\\" [placeholder]=\\\"placeholder\\\" (paste)=\\\"inputPaste($event)\\\" (keydown)=\\\"inputChanged($event)\\\" (blur)=\\\"inputBlurred($event)\\\" (focus)=\\\"inputFocus()\\\" />\\n            <div *ngIf=\\\"isAutoComplete\\\">\\n                <md2-autocomplete [items]=\\\"autocompleteDataList\\\"\\n                                  [item-text]=\\\"autocompleteItemText\\\"\\n                                  [(ngModel)]=\\\"item\\\" name=\\\"autocomplete\\\" (textChange)=\\\"valueupdate($event)\\\" (change)=\\\"changeAutocomplete($event)\\\" [placeholder]=\\\"placeholder\\\" (keydown)=\\\"inputChanged($event)\\\">\\n                </md2-autocomplete>\\n            </div>\\n        </form>\\n    </div>\\n    <div class=\\\"chip-error\\\" *ngIf=\\\"this.chipItemList.length<this.minChips\\\">Minimum {{minChips}} chip required.</div>\\n    <div class=\\\"chip-error\\\" *ngIf=\\\"this.chipItemList.length>=this.maxChips\\\">You are able to add Maximum {{maxChips}} chip.</div>\\n    \",\n            styles: [\"\\n    .template-content{display:inline;}\\n    md2-chips{outline:none;}\\n    md2-chips .md2-chips-container{display: block;box-shadow: 0 1px #ccc;padding: 5px 0;margin-bottom:10px;min-height:50px;box-sizing: border-box;clear:both;}\\n    md2-chips .md2-chips-container:after{clear:both;content:'';display:table;}\\n    md2-chips.chip-input-focus .md2-chips-container{box-shadow: 0 2px #0d8bff;}\\n    md2-chips .md2-chip-disabled{cursor: default;}\\n    md2-chips md2-autocomplete{margin:0;}\\n    md2-chips .md2-autocomplete-wrap{border-bottom:0 !important;}\\n    .md2-template{display:none;}\\n    .chip-input-disabled{pointer-events: none;cursor: default;}\\n    .md2-chip{font-size: 16px;position: relative;cursor: default;border-radius: 16px;display: block;height: 32px;line-height: 32px;margin: 8px 8px 0 0;padding: 0 28px 0 12px;float: left;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;max-width: 100%;background: rgb(224,224,224);color: rgb(66,66,66);white-space: nowrap;overflow: hidden;-ms-text-overflow: ellipsis;-o-text-overflow: ellipsis;text-overflow: ellipsis;}\\n    .md2-chip.active {color: white;background: #0d8bff;}    \\n    .chip-input-form {display: inline-block;height:32px;margin: 8px 8px 0 0;}\\n    .md2-chip svg {position: absolute; top: 4px; right: 4px; cursor: pointer; display: inline-block; overflow: hidden;fill: currentColor; color: rgba(0,0,0,0.54); }\\n    .md2-chip.active svg { color: rgba(255,255,255,0.87); }\\n    .chip-remove {cursor: pointer;display: inline-block;padding: 0 3px;color: #616161;font-size: 30px;vertical-align: top;line-height: 21px;font-family: serif;}\\n    .chip-input {display: inline-block;width: auto;box-shadow: one;border: 0;outline:none;height: 32px;line-height: 32px;font-size: 16px;}\\n    .chip-error{font-size:13px;color:#fd0f0f;}\\n    .md2-chips-container .chip-input-form .md2-autocomplete-wrap{border-bottom:0;}\\n    .md2-chips-container .md2-autocomplete-wrap.is-focused .md2-autocomplete-placeholder{display:none;}\\n    .md2-chips-container .md2-autocomplete-wrap .md2-autocomplete-placeholder.has-value{display:none;}\\n    .md2-chips-container .md2-autocomplete-wrap svg{display:none;}\\n    .md2-chips-container .md2-autocomplete-wrap .md2-autocomplete-input{height:32px;font-size:16px;}\\n    .md2-chips-container md2-autocomplete .md2-autocomplete-placeholder{color: #a2a2a2;font-size: 16px;}\\n  \"],\n            providers: [MD2_CHIPS_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'chips',\n                '[id]': 'id',\n                '[tabindex]': 'readonly ? -1 : tabindex',\n                '[class.chip-input-focus]': 'inputFocused || selectedChip >= 0',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$22('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Chips);\n    return Md2Chips;\n}());\nvar MD2_CHIPS_DIRECTIVES = [Md2Chips];\nvar Md2ChipsModule = (function () {\n    function Md2ChipsModule() {\n    }\n    Md2ChipsModule.forRoot = function () {\n        return {\n            ngModule: Md2ChipsModule,\n            providers: []\n        };\n    };\n    Md2ChipsModule = __decorate$22([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule, Md2AutocompleteModule],\n            declarations: MD2_CHIPS_DIRECTIVES,\n            exports: MD2_CHIPS_DIRECTIVES\n        }), \n        __metadata$22('design:paramtypes', [])\n    ], Md2ChipsModule);\n    return Md2ChipsModule;\n}());\n\nvar __decorate$23 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$23 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2Collapse = (function () {\n    function Md2Collapse() {\n        this.isExpanded = true;\n        this.isCollapsing = false;\n    }\n    Object.defineProperty(Md2Collapse.prototype, \"collapse\", {\n        get: function () { return this.isExpanded; },\n        set: function (value) {\n            this.isExpanded = value;\n            this.toggle();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * toggle collapse\n     */\n    Md2Collapse.prototype.toggle = function () {\n        if (this.isExpanded) {\n            this.hide();\n        }\n        else {\n            this.show();\n        }\n    };\n    /**\n     * hide collapse\n     */\n    Md2Collapse.prototype.hide = function () {\n        var _this = this;\n        this.isCollapsing = true;\n        this.isExpanded = false;\n        setTimeout(function () {\n            _this.isCollapsing = false;\n        }, 4);\n    };\n    /**\n     * show collapse\n     */\n    Md2Collapse.prototype.show = function () {\n        var _this = this;\n        this.isCollapsing = true;\n        this.isExpanded = true;\n        setTimeout(function () {\n            _this.isCollapsing = false;\n        }, 4);\n    };\n    __decorate$23([\n        _angular_core.Input(), \n        __metadata$23('design:type', Boolean)\n    ], Md2Collapse.prototype, \"collapse\", null);\n    Md2Collapse = __decorate$23([\n        _angular_core.Directive({\n            selector: '[collapse]',\n            host: {\n                '[class.in]': 'isExpanded',\n                '[class.collapse]': 'true',\n                '[class.collapsing]': 'isCollapsing',\n                '[attr.aria-expanded]': 'isExpanded',\n                '[attr.aria-hidden]': '!isExpanded',\n            }\n        }), \n        __metadata$23('design:paramtypes', [])\n    ], Md2Collapse);\n    return Md2Collapse;\n}());\nvar MD2_COLLAPSE_DIRECTIVES = [Md2Collapse];\nvar Md2CollapseModule = (function () {\n    function Md2CollapseModule() {\n    }\n    Md2CollapseModule.forRoot = function () {\n        return {\n            ngModule: Md2CollapseModule,\n            providers: []\n        };\n    };\n    Md2CollapseModule = __decorate$23([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_COLLAPSE_DIRECTIVES,\n            declarations: MD2_COLLAPSE_DIRECTIVES,\n        }), \n        __metadata$23('design:paramtypes', [])\n    ], Md2CollapseModule);\n    return Md2CollapseModule;\n}());\n\nvar __decorate$25 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$25 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar ColorpickerService = (function () {\n    function ColorpickerService() {\n    }\n    /**\n  * hsla to hsva\n  * @param hsla\n  */\n    ColorpickerService.prototype.hsla2hsva = function (hsla) {\n        var h = Math.min(hsla.h, 1), s = Math.min(hsla.s, 1), l = Math.min(hsla.l, 1), a = Math.min(hsla.a, 1);\n        if (l === 0) {\n            return { h: h, s: 0, v: 0, a: a };\n        }\n        else {\n            var v = l + s * (1 - Math.abs(2 * l - 1)) / 2;\n            return { h: h, s: 2 * (v - l) / v, v: v, a: a };\n        }\n    };\n    /**\n    * hsva to hsla\n    * @param hsva\n    */\n    ColorpickerService.prototype.hsva2hsla = function (hsva) {\n        var h = hsva.h, s = hsva.s, v = hsva.v, a = hsva.a;\n        if (v === 0) {\n            return new Hsla(h, 0, 0, a);\n        }\n        else if (s === 0 && v === 1) {\n            return new Hsla(h, 1, 1, a);\n        }\n        else {\n            var l = v * (2 - s) / 2;\n            return new Hsla(h, v * s / (1 - Math.abs(2 * l - 1)), l, a);\n        }\n    };\n    /**\n     * rgba to hsva\n     * @param rgba\n     */\n    ColorpickerService.prototype.rgbaToHsva = function (rgba) {\n        var r = Math.min(rgba.r, 1), g = Math.min(rgba.g, 1), b = Math.min(rgba.b, 1), a = Math.min(rgba.a, 1);\n        var max = Math.max(r, g, b), min = Math.min(r, g, b);\n        var h, s, v = max;\n        var d = max - min;\n        s = max === 0 ? 0 : d / max;\n        if (max === min) {\n            h = 0;\n        }\n        else {\n            switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n            }\n            h /= 6;\n        }\n        return new Hsva(h, s, v, a);\n    };\n    /**\n     * hsva to rgba\n     * @param hsva\n     */\n    ColorpickerService.prototype.hsvaToRgba = function (hsva) {\n        var h = hsva.h, s = hsva.s, v = hsva.v, a = hsva.a;\n        var r, g, b;\n        var i = Math.floor(h * 6);\n        var f = h * 6 - i;\n        var p = v * (1 - s);\n        var q = v * (1 - f * s);\n        var t = v * (1 - (1 - f) * s);\n        switch (i % 6) {\n            case 0:\n                r = v, g = t, b = p;\n                break;\n            case 1:\n                r = q, g = v, b = p;\n                break;\n            case 2:\n                r = p, g = v, b = t;\n                break;\n            case 3:\n                r = p, g = q, b = v;\n                break;\n            case 4:\n                r = t, g = p, b = v;\n                break;\n            case 5:\n                r = v, g = p, b = q;\n                break;\n        }\n        return new Rgba(r, g, b, a);\n    };\n    /**\n     * string to hsva\n     * @param colorString\n     */\n    ColorpickerService.prototype.stringToHsva = function (colorString) {\n        var stringParsers = [\n            {\n                re: /(rgb)a?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*%?,\\s*(\\d{1,3})\\s*%?(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n                parse: function (execResult) {\n                    return new Rgba(parseInt(execResult[2]) / 255, parseInt(execResult[3]) / 255, parseInt(execResult[4]) / 255, isNaN(parseFloat(execResult[5])) ? 1 : parseFloat(execResult[5]));\n                }\n            },\n            {\n                re: /(hsl)a?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})%\\s*,\\s*(\\d{1,3})%\\s*(?:,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)/,\n                parse: function (execResult) {\n                    return new Hsla(parseInt(execResult[2]) / 360, parseInt(execResult[3]) / 100, parseInt(execResult[4]) / 100, isNaN(parseFloat(execResult[5])) ? 1 : parseFloat(execResult[5]));\n                }\n            },\n            {\n                re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/,\n                parse: function (execResult) {\n                    return new Rgba(parseInt(execResult[1], 16) / 255, parseInt(execResult[2], 16) / 255, parseInt(execResult[3], 16) / 255, 1);\n                }\n            },\n            {\n                re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/,\n                parse: function (execResult) {\n                    return new Rgba(parseInt(execResult[1] + execResult[1], 16) / 255, parseInt(execResult[2] + execResult[2], 16) / 255, parseInt(execResult[3] + execResult[3], 16) / 255, 1);\n                }\n            }\n        ];\n        colorString = colorString.toLowerCase();\n        var hsva = null;\n        for (var key in stringParsers) {\n            if (stringParsers.hasOwnProperty(key)) {\n                var parser = stringParsers[key];\n                var match = parser.re.exec(colorString), color = match && parser.parse(match);\n                if (color) {\n                    if (color instanceof Rgba) {\n                        hsva = this.rgbaToHsva(color);\n                    }\n                    else if (color instanceof Hsla) {\n                        hsva = this.hsla2hsva(color);\n                    }\n                    return hsva;\n                }\n            }\n        }\n        return hsva;\n    };\n    /**\n     * output formate of color\n     * @param hsva\n     * @param outputFormat\n     */\n    ColorpickerService.prototype.outputFormat = function (hsva, outputFormat) {\n        if (hsva.a < 1) {\n            switch (outputFormat) {\n                case 'hsla':\n                    var hsla = this.hsva2hsla(hsva);\n                    var hslaText = new Hsla(Math.round((hsla.h) * 360), Math.round(hsla.s * 100), Math.round(hsla.l * 100), Math.round(hsla.a * 100) / 100);\n                    return 'hsla(' + hslaText.h + ',' + hslaText.s + '%,' + hslaText.l + '%,' + hslaText.a + ')';\n                default:\n                    var rgba = this.denormalizeRGBA(this.hsvaToRgba(hsva));\n                    return 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + Math.round(rgba.a * 100) / 100 + ')';\n            }\n        }\n        else {\n            switch (outputFormat) {\n                case 'hsla':\n                    var hsla = this.hsva2hsla(hsva);\n                    var hslaText = new Hsla(Math.round((hsla.h) * 360), Math.round(hsla.s * 100), Math.round(hsla.l * 100), Math.round(hsla.a * 100) / 100);\n                    return 'hsl(' + hslaText.h + ',' + hslaText.s + '%,' + hslaText.l + '%)';\n                case 'rgba':\n                    var rgba = this.denormalizeRGBA(this.hsvaToRgba(hsva));\n                    return 'rgb(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ')';\n                default:\n                    return this.hexText(this.denormalizeRGBA(this.hsvaToRgba(hsva)));\n            }\n        }\n    };\n    ColorpickerService.prototype.hexText = function (rgba) {\n        var mainText = ((1 << 24) | (rgba.r << 16) | (rgba.g << 8) | rgba.b).toString(16);\n        var hexText = '#' + mainText.substr(1);\n        if (hexText[1] === hexText[2] && hexText[3] === hexText[4] && hexText[5] === hexText[6]) {\n            hexText = '#' + hexText[1] + hexText[3] + hexText[5];\n        }\n        return hexText.toUpperCase();\n    };\n    ColorpickerService.prototype.denormalizeRGBA = function (rgba) {\n        return new Rgba(Math.round(rgba.r * 255), Math.round(rgba.g * 255), Math.round(rgba.b * 255), rgba.a);\n    };\n    ColorpickerService = __decorate$25([\n        _angular_core.Injectable(), \n        __metadata$25('design:paramtypes', [])\n    ], ColorpickerService);\n    return ColorpickerService;\n}());\n\nvar __decorate$24 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$24 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar noop$2 = function () { };\nvar nextId$2 = 0;\nvar MD2_COLORPICKER_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Colorpicker; }),\n    multi: true\n};\nvar TextDirective = (function () {\n    function TextDirective() {\n        this.newValue = new _angular_core.EventEmitter();\n    }\n    TextDirective.prototype.changeInput = function (value) {\n        if (this.rg === undefined) {\n            this.newValue.emit(value);\n        }\n        else {\n            var numeric = parseFloat(value);\n            if (!isNaN(numeric) && numeric >= 0 && numeric <= this.rg) {\n                this.newValue.emit({ v: numeric, rg: this.rg });\n            }\n        }\n    };\n    __decorate$24([\n        _angular_core.Output('newValue'), \n        __metadata$24('design:type', Object)\n    ], TextDirective.prototype, \"newValue\", void 0);\n    __decorate$24([\n        _angular_core.Input('text'), \n        __metadata$24('design:type', Object)\n    ], TextDirective.prototype, \"text\", void 0);\n    __decorate$24([\n        _angular_core.Input('rg'), \n        __metadata$24('design:type', Number)\n    ], TextDirective.prototype, \"rg\", void 0);\n    TextDirective = __decorate$24([\n        _angular_core.Directive({\n            selector: '[text]',\n            host: {\n                '(input)': 'changeInput($event.target.value)'\n            }\n        }), \n        __metadata$24('design:paramtypes', [])\n    ], TextDirective);\n    return TextDirective;\n}());\nvar ColorpickerSliderDirective = (function () {\n    function ColorpickerSliderDirective(el) {\n        var _this = this;\n        this.el = el;\n        this.change = new _angular_core.EventEmitter();\n        this.listenerMove = function (event) { _this.move(event); };\n        this.listenerStop = function () { _this.stop(); };\n    }\n    /**\n     * set cursor position\n     * @param event\n     */\n    ColorpickerSliderDirective.prototype.setCursor = function (event) {\n        var height = this.el.nativeElement.offsetHeight;\n        var width = this.el.nativeElement.offsetWidth;\n        var x = Math.max(0, Math.min(this.getX(event), width));\n        var y = Math.max(0, Math.min(this.getY(event), height));\n        if (this.pointX !== undefined && this.pointY !== undefined) {\n            this.change.emit({ s: x / width, v: (1 - y / height), pointX: this.pointX, pointY: this.pointY });\n        }\n        else if (this.pointX === undefined && this.pointY !== undefined) {\n            this.change.emit({ v: y / height, rg: this.pointY });\n        }\n        else {\n            this.change.emit({ v: x / width, rg: this.pointX });\n        }\n    };\n    /**\n     * input event listner\n     * @param event\n     */\n    ColorpickerSliderDirective.prototype.move = function (event) {\n        event.preventDefault();\n        this.setCursor(event);\n    };\n    /**\n     * input event listner\n     * @param event\n     */\n    ColorpickerSliderDirective.prototype.start = function (event) {\n        this.setCursor(event);\n        document.addEventListener('mousemove', this.listenerMove);\n        document.addEventListener('touchmove', this.listenerMove);\n        document.addEventListener('mouseup', this.listenerStop);\n        document.addEventListener('touchend', this.listenerStop);\n    };\n    /**\n     * stop mouse event\n     */\n    ColorpickerSliderDirective.prototype.stop = function () {\n        document.removeEventListener('mousemove', this.listenerMove);\n        document.removeEventListener('touchmove', this.listenerMove);\n        document.removeEventListener('mouseup', this.listenerStop);\n        document.removeEventListener('touchend', this.listenerStop);\n    };\n    /**\n     * get x\n     * @param event\n     */\n    ColorpickerSliderDirective.prototype.getX = function (event) {\n        return (event.pageX !== undefined ? event.pageX : event.touches[0].pageX) - this.el.nativeElement.getBoundingClientRect().left - window.pageXOffset;\n    };\n    /**\n     * get y\n     * @param event\n     */\n    ColorpickerSliderDirective.prototype.getY = function (event) {\n        return (event.pageY !== undefined ? event.pageY : event.touches[0].pageY) - this.el.nativeElement.getBoundingClientRect().top - window.pageYOffset;\n    };\n    __decorate$24([\n        _angular_core.Input('colorpicker-slider'), \n        __metadata$24('design:type', String)\n    ], ColorpickerSliderDirective.prototype, \"slider\", void 0);\n    __decorate$24([\n        _angular_core.Input('point-x'), \n        __metadata$24('design:type', Number)\n    ], ColorpickerSliderDirective.prototype, \"pointX\", void 0);\n    __decorate$24([\n        _angular_core.Input('point-y'), \n        __metadata$24('design:type', Number)\n    ], ColorpickerSliderDirective.prototype, \"pointY\", void 0);\n    __decorate$24([\n        _angular_core.Output('change'), \n        __metadata$24('design:type', Object)\n    ], ColorpickerSliderDirective.prototype, \"change\", void 0);\n    ColorpickerSliderDirective = __decorate$24([\n        _angular_core.Directive({\n            selector: '[colorpicker-slider]',\n            host: {\n                '(mousedown)': 'start($event)',\n                '(touchstart)': 'start($event)'\n            }\n        }), \n        __metadata$24('design:paramtypes', [_angular_core.ElementRef])\n    ], ColorpickerSliderDirective);\n    return ColorpickerSliderDirective;\n}());\nvar Md2Colorpicker = (function () {\n    function Md2Colorpicker(service, el) {\n        this.service = service;\n        this.el = el;\n        this._innerValue = '';\n        this._onTouchedCallback = noop$2;\n        this._onChangeCallback = noop$2;\n        this._defalutColor = '#000000';\n        this.cFormat = 'hex';\n        this.colorpickerChange = new _angular_core.EventEmitter();\n        this.change = new _angular_core.EventEmitter();\n        this.tabindex = 0;\n        this.id = 'md2-colorpicker-' + (++nextId$2);\n        this._created = false;\n    }\n    Object.defineProperty(Md2Colorpicker.prototype, \"value\", {\n        get: function () {\n            return this._innerValue;\n        },\n        /**\n        * set accessor including call the onchange callback\n        */\n        set: function (v) {\n            if (v !== this._innerValue) {\n                if (v) {\n                    this.hsva = this.service.stringToHsva(v);\n                }\n                this._innerValue = v;\n                this._onChangeCallback(v);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ;\n    Md2Colorpicker.prototype.ngOnInit = function () {\n        var hsva = this.service.stringToHsva(this._innerValue);\n        if (hsva !== null) {\n            this.hsva = hsva;\n        }\n        else {\n            this.hsva = this.service.stringToHsva(this._defalutColor);\n        }\n        if (this._created) {\n            this.colorpickerChange.emit(this.service.outputFormat(hsva, this.cFormat));\n            this.change.emit(this.service.outputFormat(hsva, this.cFormat));\n        }\n        this.sliderDim = new SliderDimension(150, 230, 130, 150);\n        this.slider = new SliderPosition(0, 0, 0, 0);\n        if (this.cFormat === 'rgba') {\n            this.format = 1;\n        }\n        else if (this.cFormat === 'hsla') {\n            this.format = 2;\n        }\n        else {\n            this.format = 0;\n        }\n        this.update();\n    };\n    /**\n    * Show Colorpicker dialog\n    */\n    Md2Colorpicker.prototype.showColorpicker = function () {\n        if (this.disabled) {\n            return;\n        }\n        if (!this._isColorpickerVisible) {\n            this.update();\n            this._initialColor = this._innerValue;\n            this._isColorpickerVisible = true;\n        }\n        else {\n            this._isColorpickerVisible = false;\n        }\n        if (this._innerValue != this._initialColor) {\n            this.change.emit(this._innerValue);\n        }\n    };\n    /**\n    * input event listner\n    * @param event\n    */\n    Md2Colorpicker.prototype.changeInput = function (event) {\n        var value = event.target.value;\n        this.colorpickerChange.emit(value);\n    };\n    /**\n    * set saturation,lightness,hue,alpha,RGB value\n    * @param val\n    * @param rg\n    */\n    Md2Colorpicker.prototype.setSaturation = function (val) {\n        var hsla = this.service.hsva2hsla(this.hsva);\n        hsla.s = val.v / val.rg;\n        this.hsva = this.service.hsla2hsva(hsla);\n        this.update();\n    };\n    Md2Colorpicker.prototype.setLightness = function (val) {\n        var hsla = this.service.hsva2hsla(this.hsva);\n        hsla.l = val.v / val.rg;\n        this.hsva = this.service.hsla2hsva(hsla);\n        this.update();\n    };\n    Md2Colorpicker.prototype.setHue = function (val) {\n        this.hsva.h = val.v / val.rg;\n        this.update();\n    };\n    Md2Colorpicker.prototype.setAlpha = function (val) {\n        this.hsva.a = val.v / val.rg;\n        this.update();\n    };\n    Md2Colorpicker.prototype.setR = function (val) {\n        var rgba = this.service.hsvaToRgba(this.hsva);\n        rgba.r = val.v / val.rg;\n        this.hsva = this.service.rgbaToHsva(rgba);\n        this.update();\n    };\n    Md2Colorpicker.prototype.setG = function (val) {\n        var rgba = this.service.hsvaToRgba(this.hsva);\n        rgba.g = val.v / val.rg;\n        this.hsva = this.service.rgbaToHsva(rgba);\n        this.update();\n    };\n    Md2Colorpicker.prototype.setB = function (val) {\n        var rgba = this.service.hsvaToRgba(this.hsva);\n        rgba.b = val.v / val.rg;\n        this.hsva = this.service.rgbaToHsva(rgba);\n        this.update();\n    };\n    Md2Colorpicker.prototype.setSaturationAndBrightness = function (val) {\n        this.hsva.s = val.s / val.pointX;\n        this.hsva.v = val.v / val.pointY;\n        this.update();\n    };\n    /**\n    * change color\n    * @param value\n    */\n    Md2Colorpicker.prototype.colorChanged = function (value) {\n        this.colorpickerChange.emit(value);\n        this._onChangeCallback(value);\n        this._innerValue = value;\n    };\n    /**\n    * set color\n    * @param value\n    */\n    Md2Colorpicker.prototype.setColorFromString = function (value) {\n        var hsva = this.service.stringToHsva(value);\n        if (hsva !== null) {\n            this.hsva = hsva;\n        }\n        this.update();\n    };\n    Md2Colorpicker.prototype.formatPolicy = function () {\n        this.format = (this.format + 1) % 3;\n        if (this.format === 0 && this.hsva.a < 1) {\n            this.format++;\n        }\n        return this.format;\n    };\n    /**\n     * update color\n     */\n    Md2Colorpicker.prototype.update = function () {\n        var hsla = this.service.hsva2hsla(this.hsva);\n        var rgba = this.service.denormalizeRGBA(this.service.hsvaToRgba(this.hsva));\n        var hueRgba = this.service.denormalizeRGBA(this.service.hsvaToRgba(new Hsva(this.hsva.h, 1, 1, 1)));\n        this.alphaColor = 'rgb(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ')';\n        this._hueSliderColor = 'rgb(' + hueRgba.r + ',' + hueRgba.g + ',' + hueRgba.b + ')';\n        this.hslaText = new Hsla(Math.round((hsla.h) * 360), Math.round(hsla.s * 100), Math.round(hsla.l * 100), Math.round(hsla.a * 100) / 100);\n        this.rgbaText = new Rgba(rgba.r, rgba.g, rgba.b, Math.round(rgba.a * 100) / 100);\n        this.hexText = this.service.hexText(rgba);\n        if (this.format === 0 && this.hsva.a < 1) {\n            this.format++;\n        }\n        this.outputColor = this.service.outputFormat(this.hsva, this.cFormat);\n        this.slider = new SliderPosition((this.hsva.h) * this.sliderDim.h - 8, this.hsva.s * this.sliderDim.s - 8, (1 - this.hsva.v) * this.sliderDim.v - 8, this.hsva.a * this.sliderDim.a - 8);\n        this.colorChanged(this.outputColor);\n    };\n    Md2Colorpicker.prototype.isDescendant = function (parent, child) {\n        var node = child.parentNode;\n        while (node !== null) {\n            if (node === parent) {\n                return true;\n            }\n            node = node.parentNode;\n        }\n        return false;\n    };\n    Md2Colorpicker.prototype.clickOk = function () {\n        this._isColorpickerVisible = false;\n        if (this._innerValue != this._initialColor) {\n            this.change.emit(this._innerValue);\n        }\n        this.closeColorpicker();\n    };\n    /**\n    * deselect recent color and close popup\n    */\n    Md2Colorpicker.prototype.cancelColor = function () {\n        this._innerValue = this._initialColor;\n        this.setColorFromString(this._innerValue);\n        this.closeColorpicker();\n    };\n    /**\n    * close color picker\n    */\n    Md2Colorpicker.prototype.closeColorpicker = function () {\n        this._isColorpickerVisible = false;\n        this.setColorFromString(this._innerValue);\n    };\n    /**\n     * create color box\n     * @param element\n     * @param offset\n     */\n    Md2Colorpicker.prototype.createBox = function (element, offset) {\n        return {\n            top: element.getBoundingClientRect().top + (offset ? window.pageYOffset : 0),\n            left: element.getBoundingClientRect().left + (offset ? window.pageXOffset : 0),\n            width: element.offsetWidth,\n            height: element.offsetHeight\n        };\n    };\n    Md2Colorpicker.prototype.writeValue = function (value) { this.value = value; };\n    Md2Colorpicker.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };\n    Md2Colorpicker.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };\n    __decorate$24([\n        _angular_core.Input('format'), \n        __metadata$24('design:type', String)\n    ], Md2Colorpicker.prototype, \"cFormat\", void 0);\n    __decorate$24([\n        _angular_core.Output('colorpickerChange'), \n        __metadata$24('design:type', Object)\n    ], Md2Colorpicker.prototype, \"colorpickerChange\", void 0);\n    __decorate$24([\n        _angular_core.Output(), \n        __metadata$24('design:type', Object)\n    ], Md2Colorpicker.prototype, \"change\", void 0);\n    __decorate$24([\n        _angular_core.Input(), \n        __metadata$24('design:type', Number)\n    ], Md2Colorpicker.prototype, \"tabindex\", void 0);\n    __decorate$24([\n        _angular_core.Input(), \n        __metadata$24('design:type', Boolean)\n    ], Md2Colorpicker.prototype, \"disabled\", void 0);\n    __decorate$24([\n        _angular_core.Input(), \n        __metadata$24('design:type', String)\n    ], Md2Colorpicker.prototype, \"id\", void 0);\n    Md2Colorpicker = __decorate$24([\n        _angular_core.Component({selector: 'md2-colorpicker',\n            template: \"<div class=\\\"color-picker-selector\\\" (click)=\\\"showColorpicker()\\\"> <div class=\\\"color-div\\\" [style.background-color]=\\\"_innerValue\\\"> </div> <label class=\\\"color-text\\\">{{_innerValue}}</label> </div> <div class=\\\"md2-colorpicker-wrapper\\\"  [class.active]=\\\"_isColorpickerVisible\\\"> <div class=\\\"md2-color-picker\\\" [style.top.px]=\\\"top\\\" [style.left.px]=\\\"left\\\" > <div [colorpicker-slider] [style.background-color]=\\\"_hueSliderColor\\\" [point-x]=\\\"1\\\" [point-y]=\\\"1\\\" (change)=\\\"setSaturationAndBrightness($event)\\\" class=\\\"saturation-lightness\\\"> <div [style.left.px]=\\\"slider.s\\\" [style.top.px]=\\\"slider.v\\\" class=\\\"cursor\\\"></div> </div> <div [colorpicker-slider] [point-x]=\\\"1\\\" (change)=\\\"setHue($event)\\\" class=\\\"hue\\\"> <div [style.left.px]=\\\"slider.h\\\" class=\\\"cursor\\\"></div> </div> <div [colorpicker-slider] [style.background-color]=\\\"alphaColor\\\" [point-x]=\\\"1\\\" (change)=\\\"setAlpha($event)\\\" class=\\\"alpha\\\"> <div [style.left.px]=\\\"slider.a\\\" class=\\\"cursor\\\"></div> </div> <div [style.background-color]=\\\"outputColor\\\" class=\\\"selected-color\\\"></div> <div [hidden]=\\\"format!=2\\\" class=\\\"hsla-text\\\"> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"360\\\" [rg]=\\\"360\\\" (newValue)=\\\"setHue($event)\\\" [value]=\\\"hslaText.h\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"100\\\" [rg]=\\\"100\\\" (newValue)=\\\"setSaturation($event)\\\" [value]=\\\"hslaText.s\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"100\\\" [rg]=\\\"100\\\" (newValue)=\\\"setLightness($event)\\\" [value]=\\\"hslaText.l\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]+([\\.,][0-9]{1,2})?\\\" min=\\\"0\\\" max=\\\"1\\\" step=\\\"0.1\\\" [rg]=\\\"1\\\" (newValue)=\\\"setAlpha($event)\\\" [value]=\\\"hslaText.a\\\" /> <div>H</div><div>S</div><div>L</div><div>A</div> </div> <div [hidden]=\\\"format!=1\\\" class=\\\"rgba-text\\\"> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"255\\\" [rg]=\\\"255\\\" (newValue)=\\\"setR($event)\\\" [value]=\\\"rgbaText.r\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"255\\\" [rg]=\\\"255\\\" (newValue)=\\\"setG($event)\\\" [value]=\\\"rgbaText.g\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]*\\\" min=\\\"0\\\" max=\\\"255\\\" [rg]=\\\"255\\\" (newValue)=\\\"setB($event)\\\" [value]=\\\"rgbaText.b\\\" /> <input [text] type=\\\"number\\\" pattern=\\\"[0-9]+([\\.,][0-9]{1,2})?\\\" min=\\\"0\\\" max=\\\"1\\\" step=\\\"0.1\\\" [rg]=\\\"1\\\" (newValue)=\\\"setAlpha($event)\\\" [value]=\\\"rgbaText.a\\\" /> <div>R</div><div>G</div><div>B</div><div>A</div> </div> <div [hidden]=\\\"format!=0\\\" class=\\\"hex-text\\\"> <input [text] (newValue)=\\\"setColorFromString($event)\\\" [value]=\\\"hexText\\\" /> <div>Hex</div> </div> <div (click)=\\\"formatPolicy()\\\" class=\\\"type-policy\\\"></div> <div class=\\\"md2-color-picker-ok-btn\\\" (click)=\\\"clickOk()\\\">OK</div> <div class=\\\"md2-color-picker-cancel-btn\\\" (click)=\\\"cancelColor()\\\">Cancel</div> </div> </div> \",\n            styles: [\"md2-colorpicker { position: relative; display: block; max-width: 200px; outline: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .md2-colorpicker-wrapper { width: 230px; height: 270px; position: absolute; border-radius: 2px; background-color: #fff; z-index: 10; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4); transform: scale(0); transform-origin: left top; transition: 150ms; -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .md2-colorpicker-wrapper.active { transform: scale(1); } md2-colorpicker.md2-colorpicker-disabled { pointer-events: none; cursor: default; } .color-picker-selector .color-div { height: 30px; width: 30px; display: inline-block; overflow: hidden; cursor: pointer; border-radius: 50%; vertical-align: middle; box-shadow: 0 1px 1px 0px rgba(0, 0, 0, 0.2), 0 1px 1px 1px rgba(0, 0, 0, 0.14), 0 1px 1px 1px rgba(0, 0, 0, 0.12); } .color-picker-selector .color-text { display: inline-block; margin-left: 5px; vertical-align: middle; cursor: pointer; vertical-align: middle; line-height: 30px; } .md2-color-picker, .md2-color-picker * { box-sizing: border-box; margin: 0; font-size: 12px; } .md2-color-picker i { cursor: default; position: relative; } .md2-color-picker .md2-color-picker-ok-btn { position: absolute; bottom: 5px; right: 80px; border-radius: 3px; padding: 2px 7px; box-sizing: border-box; background: transparent; text-align: center; overflow: hidden; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; outline: none; border: none; display: inline-block; white-space: nowrap; text-decoration: none; vertical-align: middle; font-size: 12px; font-weight: 500; text-transform: uppercase; line-height: 26px; transition: background 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); transform: translate3d(0, 0, 0); box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); color: rgba(0, 0, 0, 0.87059); background-color: #fafafa; } .md2-color-picker .md2-color-picker-ok-btn:hover { background-color: rgba(158, 158, 158, 0.2); } .md2-color-picker .md2-color-picker-cancel-btn { position: absolute; bottom: 5px; right: 7px; border-radius: 3px; padding: 2px 7px; box-sizing: border-box; background: transparent; text-align: center; overflow: hidden; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; outline: none; border: none; display: inline-block; white-space: nowrap; text-decoration: none; vertical-align: middle; font-size: 12px; font-weight: 500; text-transform: uppercase; line-height: 26px; transition: background 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); transform: translate3d(0, 0, 0); box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); color: rgba(0, 0, 0, 0.87059); background-color: #fafafa; } .md2-color-picker .md2-color-picker-cancel-btn:hover { background-color: rgba(158, 158, 158, 0.2); } .md2-color-picker div.cursor-sv { cursor: default; position: relative; border-radius: 50%; width: 15px; height: 15px; border: #ddd solid 1px; } .md2-color-picker div.cursor { cursor: crosshair; position: relative; border-radius: 50%; width: 15px; height: 15px; box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.5), inset 0 0 2px 0 rgba(0, 0, 0, 0.5); border: 2px solid #fff; } .md2-color-picker .saturation-lightness { width: 100%; height: 130px; border: none; top: 0; left: 0; position: absolute; background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACCCAYAAABSD7T3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AIWDwksPWR6lgAAIABJREFUeNrtnVuT47gRrAHN+P//Or/61Y5wONZ7mZ1u3XAeLMjJZGZVgdKsfc5xR3S0RIIUW+CHzCpc2McYo7XGv3ex7UiZd57rjyzzv+v+33X/R/+3r/f7vR386Y+TvKNcf/wdhTLPcv9qU2wZd74uth0t1821jkIZLPcsI/6nWa4XvutquU0Z85mnx80S/ZzgpnLnOtHNt7/ofx1TKXcSNzN/7qbMQ3ju7rNQmMYYd/4s2j9aa+P+gGaMcZrb1M/tdrvf7/d2v99P9/t93O/3cbvdxu12G9frdVwul3E+n8c///nP+2+//Xb66aefxl//+tfx5z//2YK5Al2rgvf4UsbpdGrB52bAvArXpuzjmiqAVSGz5eDmGYXzhbAZmCrnmzddpUU+8Y1dAOYeXCtDUwVwV7YCGH6uAmyMcZ9l5vkUaBPGMUZ7/J5w/792/fvv9Xq93263dr/fTxPECeME8nK5jM/Pz/HTTz/dv337dvrll1/GP/7xj/G3v/1t/OUvfwkVswongjdOp9PzH3U3D3zmWGnZVXn4jCqs7wC2BKP4/8tAzkZsoWx6XrqeHZymvp4ABCBJhTQwKfDT8gzrZCIqi5AhiACjBfEB2rP8/X63MM7f6/V6v9/v7Xa7bYC83W7jcrlsVHIq5ffv30+//fbb+OWXX8ZPP/00/v73v4+ff/75JSvbeu+bL2WMMaFbAlpBNM85QX+ct6qoSqkPAwuQlBVKqGNFSUOAA3Bmu7gC5hNOd15nSwvAOUW7C4giUCV8Sgn5L9hNFIqTsp0GxI0ysioyjAjkY/tGJVEpz+fz+OWXX+7fv38//f777+Pbt2/j119/HT///PP49ddfx8fHRwrmTjV779EXu2px2xhjwtdJZQcAWQIPLPISsMJaSwiD8gzIKrwSyATE5j5nAbR5c1dBUwBlsEWW0h6LqiYsqFPAQxCyRZ3wOSARxmlXMX5k64pQfvv27f75+dk+Pj5OHx8f4/v37+Pbt2/jt99+G9++fRsfHx/jcrmUFLO31gYDWblxRIs/TqfT7ousxJsAxXA2Gc7TA9XdgfdoHbFsj76X2+1WArgI1ageGwA3qupqoHsmcbI6Fu93quggFa9d7LeDtgKfAFHBJ+NEByIkcJ5KervdTmhhGcgJJSZ5vn//fj+fz+18Pp8+Pz/H5+fnmGD+/vvv4/v37+Pj42N8fn6O2+1Ws7JjjP6wraMI5E4RZ8x2vV5TSwkquotV7/d7Tz6HFWsD/qNcdw0CQ3q/321c686TwDVIdbuy73zNldhSHb8I2klZznm+InBS4U6n0302aBFsLhHDAKJVJVglfI9jhvu53W53sLANYNxAiDA6MCeUHx8f9+v12i6XS7tcLqcZW57P5yeY8/fz83Ocz+fnsSmYUyknWEG85WBst9stzSLyMdfr9Qi08iY15UZ0LlDGLhR3o5zK2j7OPUTD0E+nU3tk7Xb/16NFbhloAMuY1zjLUOO3BKeIDe+Z8s3/J4gFo4TM5jPmuRg28foUKKVSwo16TgA5npywcWLHgYl/Pz8/73/605/ab7/91m63W7tcLie0sZj4mao5gTyfz88E0f1+j8EcYzwTPEG2cqjyfHNF0M8fuqEiaOVnRzZZQNh5fwQyHg/HDGfJo89Q1zb/quu5XC6773I2XKfTqd/v9+d3wuqWva/YTdUdEV3fhIv/Viyps6YE3x3r43K5bJQS66zaxVGFsvd+//j4aF+/fm3fv39vt9utff36tf3+++/tdrudvn37ZuNLBaaCMgUzC+rZRiFowxUuJI8YMqcCp9Opq5vagaYU6lGJA1XQqejchw6Cj0Gw5nYBrGw01A2O206n04BGouNNyTfp/FwElhUey6nXrIKw7QQWddxuN2ldL5fL839gSPF8ahu/JvBO48CPSuqMf8Vp9/P53L58+dLu93s7n8/tfr8/39/v9/b5+TkhPJ3P56mQ436/j+/fv+/iSgbzer0+AZx/5+88bv6OMda6S5z6kd21fYC9dxv7cIJJ2d9AOS30fPMzyHiTM8B4DF6XUlYHp4KQW3W+1t77MNB1vGHxWq7Xa7vf78+y5/N5A+H1et29xuP5dbYtyaRu4AksbPq6936fjRzXRxBbPr/b+b18+fKljTHaBBBfn8/n0/1+H1++fBnn8zm0sB8fH5u4cr5GuBhMVk0EEn9RsctgVhM+ixlJtMA23R8B6yysAstBOgFXIKKCMIgToMqNEu2fYMH7ztc732dQKkCj1ytAZtY0Kx8pIr8GGJ+AT3V+2Hirhl++fBmXy2Wz73w+b17P8p+fn8/tUwGVleVkTyUb68DkfayWY4zxNRihU4EpLJPZVrK+u7J4/mgfKqeLW9X2REWlItL1diynbDDb3+jXgYjQqn0rrxWc+NkILP7F7xIbMvx7vV53x40xnlbWJF12ZSag/N0pW6t+ZzmOMzHjajKwDfond78zYTdfq18up97zr2q8v3IioBprRtBl0EZ9og5WBRGOdOHjIjXF7UotFbgOWnXzIJyzYvjG5IYgsmMOxHkz8OsMSrVNWeq5T8DaOcbEv1Od5rbs9aO7YvMet63EkF++fMExq+MRl4/L5bLZN/+ez+fnZ6KazuMqXSQVO5spJXflHAIzes/xJseckRJiDMog9d6VfRrqXMr6KpVV27jRwJacGovOAM1zMdQMnwK1AubK63kdCChvI1C7g0z9nf/D+Xze2Vj8H7Gx4P9duQlsYCrqyN8XqG3Hm/10Oj3jw/n+crlstuM+jPmmxT2dTuPz83Pzt2pn1XsEHX/bnPaVqVmh0xwOt0o6XLLAHePUU203wHfcrspCwmV3TryB5s0Mseeg97x/BwzCjBlbB+pRAPla0BVQuT6V6QHdBlj3d0KG147b+DqxQeUymDO43W4dQar+TIjwmAd0z8/h65vf0/yLv3Pb5XLpru/ydDo9s7ET0I+Pj6dKK9VUEIeKWQWPAOrJ8LKd4vE+t91Y3e7UFlWatg2VwJnb+HPmtvm/sfK59/OaWF3x/eP1UPHvA5DDYDpYXfb0drv1V2DkBkxtw/tEWVVlXWdC9pFYs5/jfh9dS/16vW7s6lTG+TfqsxSJHxkXXq/Xdr1eu4LsfD6P3vsT3N77DkL+zPm5jSdKL4zR3AxQd6rHkLkYlSowsrq7znzu6wSwdsMJOXmA5fBcjxtgMGBYHlr5zokhtsMCTgXLQOW4XC6dEyEMprL8mAQzXRgduix2yZzorxkYsDn3hB1VeMLGsXsVtgl2pW8S3svk0vw7R4hNaHvv4cACl5HFzwIH0Kc6zu4XjDPR/jpAVxWzO1Xk2DDb3vTcxeGU1iWZHkmIDWziWKvirCJ4Dravs6IJ/GG6cTqWdXDy+fArQDVVkLqkVjAoZIITdmmIqXwqa95N3+MGYoZQdRVNO53Y1xRkhO16vY7eu507Ca9lJnbGpxOemQhSw/AQsmmp5zU9BiU8G6wvX76M6/U6Pj4+do0Bz4CpgiknTUeDqwlKBmg3u4OVjrZ1A+rAcgaejWq6eJCvCYFDONSwOgHX4EQRw8lxbzDOdEK6gZ3Hk1b+8g2o1JFtKXyv/fEdTXuWjWXdAZiBp6ADeDrCFiim7B6ZFneeI7Gvm/PMkUDX67W7xI8b0D7/v8dA9qfN5oaCf74WZjH0mf1cmfY1Y0JUFmVrTWu8uzkNcLtEj7u5FXBTkfC6GOA5q8YMxO8KVvF6sAVGdcrUbsKODcQKkLMOMdmlxum642YrPm26AlhZW1YB1R+rrGswE8TaYAWeUMxdf+WjwSvZ2Ef3ytOyfn5+PpVPAaqOn43MtNBqvmjjxbjM4lZjZY4gqNMI5ktaW/sYKNwS+9lFQzGihmMCKPa7+Z0V6Eb0GRmobtpX8JljWu5FMLN5ja6hG9kwQgZqf5+1NH5UxzkFReCdWhJ8XdlGUkxO7HRlYRm4mVO43W7ter12TPJEw/rmEN3L5SKHIWZg9mz+pUoKOYq5bJTJdX2gme1UcxMZQFaEQIlHct32M+Y1BzGkGuzfiyAN9z+ugplZ1symCrDCYYkGxDTpI9RzBy0rHyeDUC1nWaeUaD9n4xkNyYMBDZtzZ3B++fJlY21XFDOcARJlabOyiS3uCpLI9jrZjCDkaVvcCCjwognKShWdzXZWlZMvVTgD8LpqlCLrqgbcB+qYwrgKYpT0ccCqbKyCValkEabn/FynogCrPKfqf51xJ7sGB2ZXcZmxoSOztjx300DZi7a0/2AIR0UlBag9SuDw6KcAzlaB7vHZvWpjK90dyrq6bKyDUZQbR0B05biLQkHIcSUmgIK+SwuqgHCnoio2RQU1yj+BnBy9pphVKLGyC7ZzFK1pxWK+E8IhVCWLN/uLtnUU4ayoYLoaANz8FdtaSvY4pV0BEW2ls61czqllBKpTyKgMAhrZ1cdc1RROtPmvWNkdcKZ7ZKxaWjiPLJMpp7OZKxA+rqG/oJLjxf0pnJlqLoDZo3gyU0mKGys2taKecj/d1C+rJSplBqlTyAqgR+D8KjKlmRL2gtUcAdCtsL+ijCNT1oqqqkH2OHEbG5sDFnUg5Aa+yLou2VU1ptj1S2ZQqv1ORZN9IWzRfgaRBxKoBE8UWyqlJFtrIc0AxNjSjed99CTY/XDfSzCz5M0IZoVEsWnPFNTsl8ooVC1TzbGgqFZNDSgVwKK+1sGDMKqxZCWGVMDysiEr1jVSQJUYwj5iHOlThdHt44SQg9CN+nl8D90NMIgAdgr46JqRiR9I8vRdFvbr17m/yxUMKjNLMiVUADwu2CWGhhi+F55TWM9M9cogzms1dnM4uOF/LAEYWdcqnM7yFmyq3IfwmOROd7Y1iFWtOjoY8To41mTV5IysgFFuRzsbWFGbNIIJCDv1dOo4lZG7jWBwRFtVTKuWyeCByJKOan8oZ3ep9XddNl0tDuaywLz9cXPYeDAA0SpkBO9sbVcTOVWldPv4uyzEkzxHtjvonHoSkFEWNoo1d8DhcQputd2ppNon4BzoAiJ1hBFQg0dVtdbGHHDQWushmNEQukLM2QO1G2Y8bgTXqFhcBJj7EjPgcPts8US8qPpPB/dXznOh5Z438tzH5ec6QgrOKrRRfKmysBmUDB+PhYabMlVPER+GCSITTzr7am2tArH3bgcEzPJm+cr5jJ4NnHNFDVrFXcI5Le9k5Jnw+bedbV+FfRzZIHaOOaOsLY0/7UGs58DjrGwKMIMFIGzOEW1/jGsdAtCN6hEAI4hBe9YXeRROBSVPAVPAqvIM5bx5hVKWAMP6zBRy3iescridVdFBinBxXDnG2GRY2XbCvp1lhvGtO9Bxu5h908XQu42lnSArMFdizMim8uwRCxPGnnOS8lwpnbOiDqTAjsrRN/PcoAScCbaACqVM40ylnjjTBs+bwWlAG23/UKbdkiwKWIQPGzWaczpoSlxPEj822cNWkpS7FyzsDrqpfgpG3jahw2vgbaSQAxuLWZYt7JzyNe8JoZpNAcvDFOdw0wqYT9AK1rZz/DdbSlLPp0ryIxgQJlK9AZlEq7IOXpohg9PIhrCng88JsOxiV4ZWAYfg4sikx/8ky2Z9l862uqwrfscIH8+ugTmVGyiddeVYUgEMn4GZzg14EwIsh9sx2cKKiWXReuOE5gzGOQgdlRKVVdlevqb279Xq0Qnsts2VDaBO0coezsruWtHApu6sKG4IBhN0aGU2kLrMKGRTN3HmbCDwKV14zvkMEDG4QfZVspVlaNU2mhc5TEZ3N1h/zqTheuLpW05ZWTGVjb3dbnNmxKZBnN8JqidaVLKAOyARNLS+MB54Z2+VaqoMLKroVBlngefnTPAcoHNWCSvlfA8CI0HEmBNBnBlXyMrzU7A7WVm94PPqQ2gmqKx+WDGsnvilmcSOBJqOK1nYyAIzuAyesq3UdSK3KfWcYKD95HmfYOU3qser2CtYEUA+FpfqdNvgPBZUBhDrGONRVlQsh8rLcaUCykHG0OOUwTlLBrsh5soEMGezi1E4HRVt1icp5wZEFXdibCkG8Y8vX75sbO4E0iom9z+hjSiOfy3DhpXItpVhE+UGQdvoWjtChmrGHf4YAzKgBNnGtuJxFCeGdhUAfQLLK8kBYAP6gvFJZajMG3Xkycy8KuC0q4Eyymwtwdxdv2M0mIBtK0LKnf640j00Auq4gUkdWGlhs22qJc6dZCsL19oxnlTJG4SYVRIGpD8TPFBuM6OElbS1pldid4mGAyN6ZIupbC5bXJN9fdpbThSxLUaI8IG1XIYBxW3Tjs6KQosKcxfxcQmdnwRGM10GnFcCy2XYunLMyAkdgk4mePiczsLygthcBut6goOqS7YVFXADLjaosB6s6ofcZWAZSIRYqSUkizYwttYab3vUOQ9w2HRxIIg8WwRVeE68xi4UtL3zRphxplzwuZrcqYCq1I3jPI5dnJIygEohMbPqVJSzrwzxBJTs5zN+ReUSgxikPQVF3JVBeNQxbHENrEMNvEdFZVV9lH9+ORGEsNZQpyTNc4C3AG7XF4ngzq+DrO2zbuaaOXgdaFcdkEotoSFBVX2qJ0C8OWZeG4KGlpghA0XfTOPCqV2qqwQ26QWfF2PMLhI2w1lVAa2aPsYd0za25MQRwgcZN6uQDCi+ZxiD4XEM2kZxOT41FnZnaRlcpZouzlRqqdbQVWopQoSB58RV50lBNrHi/AwXS5LrwDVlpY3Fc3ByiYGc52Trist6kOXdwInAQtJpp5QchyaquYOV7Su+fxVMaV3dc0RE2S6mUY0gLt2pMcYqrKIQ9w2l1gpQUMtQYcmmbt5DTNxdhnUCjQqtbK9SUSzvrC0mmhhE1e2FS2+oxypy/ZASutkmtjx3vcBC24PX65nbqkBCRhfjS9kIYPnee8cMagVOhI/3T1fAmdtAWZsCswTJCkQVNa0qWKSKPOpHAUhD9DrbVcyoYkwqhvh17vYAayXLQyKGYdxlUDFp494rBXRjYgO17DDYetNIUj/ezp6S0lnlpEwsWmJMkOwsKXeZKEAjIHn0EQJISaRBcO6UMINz7p/bEjjnw4ft+xmDvksxX4G2rIris7qaeKwAFMP2Oi7n4criuZwtpSUwpfLxSnORSrIqusc5ZFaXysqRWjiZ2DyAWEIL35tVSoQElFACjOeGGSE7AHEQgdo/LSvCOgGBvkxsmDbvlS3Fp5vhaB2TAGqRKrKKMrhLVpaGzEVjZ0OQxDhaCTA+QyRR1d15aQzrJntL3RibsipjG6jlgL4yqbS0sNYg1e84vhbBVrElK64CUcWYXDfKxhpIuxiVJZUxsbMy/uRBKTNRQ4kQ3LdRYLS0rJjRPlTPqY6gdJsEDc+aQXAn+HgsNUCbRuF0Oj0zwnA7bWDkbhO5Ens00qeQhS1laBMl5M/cAaxsLF8rKyql+Tf7ELLEGu/ixiimdCvo0TjfpjKwaggen4eh5v7LokLKbLuyvHhcZG8dhGrEDx7Hg93ZppJF7qBqO3iVveXEDQNInzeoe8Yq6ePaZBZ2JviM3W2UAGotekRCAGq4EkF1X3DOnR11yRsBL1tRa0PVcZiNFXZ2c34FskvomInQQ6lzpJoZbJxk43NwKJFBquJSsrByHydxKOnTxQASBmS3j+JMnsHSla3Ec6K9VWoJVn9zfjwOM7hqYAAqJQwE2a3nA48J2QGegRkpZNivSY+ys3EkKd4oJIwsvIHl3cWgLt5k4NH6OmtLWdpurOkwEMupYc7eMtDRhOcI2ui5JhVIzXzLyto/GAPuZoyo8wkoduVgJglCt7OhGbgID4Mq4si+63zUS1FuFFXFlqyaj2emHlLMcBqYu0FMuR28BbB7lOxRMSiCQXFhCKuwkhZ+pYDiGSgbsKKV8MiSRsuHSIWM9rklRiIlZZuqXjsQK8ooYJMgq3JKWVkhHbhsVxFUzthOWPkYijcbx54IKsSdT+uLr3crGKyoYgFiGR9iBk4kfloUX+JIlQRQqabmpgnhqtpQpb6RVQ1WH5DnrS4hEoGZqaerQ2dhFbz8XePxShmDbo70eISjoorO2vK8SJXI4SUmEU4zWKDzUDtWTYw7xXlbSTEj4FRg7zKnKoGRALv0Gs9Tgc1BpCywGZRQAtqVz2xrBcAMzEpfZwFSa2G5W0QBFjSMapWAEFa3HcGN7CxDzECyIkJ97qwrqWNTWVo876PPsjPkj2wvgroM5lLZKMETKVql/CvnWVFiFa/SzJUQwkoZsr67Y6vlSRV3/2tmNTOY3vnaxYwMuoPKqdzR1w7IqHymlPxaAThfU7Ko2ZXYj4AYJHL+kNdKwRQYESTRa5fsUZ/rVC1TMTyWVyYoqNtuzaHsMyv2tvoarxdfqwYgU1axFo/cnql1FGsqK+uAROV8BX4GU8WcZTATi2q7Qcyi0O0V+GhWBMNRUkn8H1SsWVE5By3Gi0ECqUeJoBfAtDa4amkdXG37AGP5Ggeb84p7UazpoKRzdFzeQ8HkoHGxprKy/Hpm5t12p47J6xTYDEz7uINEXSuxYXvFskYAc+ySxH9sf5ftKzU6IbwVBcUGg5e5FMCEXSErZR0wGayV19woM9guPjTqJdVTqR4uE4nJnLldWVkECCZLd2VLF+xtamex7IpiriSDUpvrpn9lrwGMCHyppMH+ps6LILsuFGUj1XEOXiqbqSHPUKnClpWV68kqtURVNDY4TNaocykoYeTU5ngGEQa/S1DnnE4AeXMcKjHPAmFVjCBENaeyLVNHfr3px8xUstJ94hIpfH4HKE/eDaArK6lSyVVFbdt1gxTIVk3pppVlFXi4pEhVBTObquohU85MLXn1iahvUkHJjSCMc01tLFveVVBx0DodM6jftCu7DOtIzYxrc0qp1JGP2ayYFz2Gb6HvMrO8cnGtV6Gjm3uImSfD2GpWK6uowbZGMxFKQCo1pOMtcMXFpRst+hXGoAomF3sSTBGgTglbBKWwsQ3tZqaYSp0Z1CimRDWFcCJUPYJ00BI5FkKYNoifuQxmN88SWVXWLMaUqqqgC0BmQJR6sk3u9NCf6jYLXxAfqsYEgVLAhRY2AtgtflZNFmFyhxdrLkAdWlk4D88M2ixHyepIdhMHrG/iR1ZGtq0MGpbDbRPYOXeSY1M6Ny4ZstvGSktK+XbFPATj2D371saPEsAMXhXrsZ0km/XStkhhMyBfsa6uXFZe2VCe+YMr1+GKgwrQyNYq1VRrB+EizAow6NsdNKcyVEkYeM73ys6q4kAHp6BiFklTkIrVC5oYV7uzwOGCz4UJ0Stq2lWMJy4wtb+RetL6tZFicnJmBw5UjCvXXMZVJX2MQkbf+XN5EWd78Vz8/JEsMZTBiKNzsm1inLRUQ74H4NidaqI68j5sAFgxcRveC7ieLJXfQYxjZZ2CsiWFewZXJmBIlZ1tdtrX4hSuateKso/RZOtOKW2nmq1oTzeK6dRWAWu2NRVb4hq0SXm1GvtugHrbr5IXqmSktg5CuDE2MSlPwsY5kNE2Wp3AqiZbWVLAxiBF+2iBZbuNj6MB6rsMLC7FyasaYDyo7KkoPyEtw3pEMXfPvxAJi2jAQQgjrz0rLIZSWZlIoNhwd5xK4AR9mYNjWAaLrnuImJeBVN9zBORObVvbr+mTTfFSEJLSRnHo7hEJoIi8MFqjxmvgmF5URZz4zLFgZZ8Ctu2X7ggVccKm9gVxIsOHqxXgNMKnFWZYnf1dBnOhayXq17QwFlWW09eNKyVJFmXqaONGA5aCegMbJ3UUkGY1ic3nKWgjq8qfVYGQG1gRt6rs62a6HiqqUOqdesK5NmX4nGofJoiE1d0dF9lVVkvT1/kEEaaCoYOwFpcVcoLM+7669PxC9rWqktH0sWUYld0VCpuBZ/stVRcGgy9WX2+U1Qthi9SzAqSxzZsy+OiFzBYnySGV6Gku44rD8BCOZBV3BvD5+AKRHNwMEsB6EzHnJpkTAeiUlEGkcECeB6GDZTp5YEJTlvdrknxYjTllMkfNtXwDjM7uVjK5JXUUn43rrqpK2jytaxHW0M5G8DC8rtHMYs7KSgduVQMGTYFqFvVS6rkD3sDJ46afdYFwoq11AOKCBLhvwoUgc8IGANycR6knZrdJPdsuxnyjfd3FovTlRMdEdtOl5CMV5EHsXQBis7TOwvIDZaGj2Vnpbh7cpK63VwYEMLwqbjzyl699sawFFkF1yqjUU31HfC6sW1ZFVFuXVXVgz9keEaw0ys1lWfm+azQAQSWA+hKYVfsZjPncAcUB9oIayy/UZXRNckDGji77GsWbvBo6tPrWPqOyVkBUq+INeqpzNdYs/u0ifh5qmpqIW+33JVSUcwY70KL4U9lYdU6ljtSls7lmfi9g3YzeQfVkaGFaV3ODCnaD2N8wsEDFklE3RzM3ZghdYkWHsszq70FIecnKkVkt8ezMzRq9bkGuKojRLBVSod3Y1yPqKgYW7JRQTPVyy5xIYLjOgxgT52RKJUY1dOrIiRd4futQx/A5AcSmEjz0vFWrkLzvbWAu9HOWbGgxFk1VNTpnBKk6TgwisI/HcxYXP1uAWO72ULFlBTq+aSu2VTUs6hrxM2CF+hEor1VIA9ZmFUaab1lSSgZsVs4sxzHlVLoJHr9H4DhONTkI1XC0/wiY2NoWAG5RlnHFnq6oLccpQddMuJ/O17JVA5OHLi0BqCztq7Y1++ucCd98qLI8MIHBV/cKjxQTme3hFBS3MyCqnDsuym2o80HjvFFTtrURmNaGJsmVahImjTsUXKtQZTAVs7Mvv8/+fzUrZAXcLJ6M4koe6XP0b6SmWWNDzyUpQ8bl+LtWx4tuqZ36cRYV3yuVxPNwvIiqiQCSmu7srgTzR6nkyhpCarXwFy1vGd5iP2cY06lFr5Njhhg1Y6+NB28ftbK83s8rf7kLJbKwDFPbLg25a0AdZJEiqr5phixKMDlRUtcssq1hriLqGoH+zeNgVm9OemjsETV8JdF0NHnkIFxWY1OB4Yrp7rtWJ7NgAAAPXklEQVQ3oNs5nplyVf8u2FoLu1JrHveaZWQjqAkshtFa2gzsSG3Zpkbvg3HafF9slPPlldjFlK80Gysm8Mr4MPhneNWENPGjAIpmilTPATdTRTXlCBYHYAQuPwA36xIpWtGN4q3Y2MhiGsUpuSSnlEJRD8PorC7CFYVw+F51qThgabxsTxWzCGY0ZSsb3lfqAy0OPNjNy8xiQQKsHYFQ2HBZVvVbBuq3m1oWKajqaonsM6uZUr6CjXWNZ0l5E3h3jURma6kP3MJIiy1Lm+kahQq41N2iZja5sjtlLYNZHZrH6qUGm4vMbDp6Rw2CFmvuyFkrBcCyMtFqBaECmsHoK9BZ2LA/lJcRqSaDqnaWbrZdGaz3DLgIvBln4woGztbyJGqslwxkhhHrTjTYFXCtOoKS8uLdofVdAbOylGU6nlYpXWZts4nXBq6WxJitMNokHUJnbnJplQm+aGpY2a5GMV2QD1hRubBPFKdumf5OHkLHz0F9luE5kjBjRa0nFE5CUGqHw32MmjZ6xkgINVnSnZ1VZStK2qKlRaLlQgK7uTq7JFXJwM+3SOEKyhZNI+tJ0I5qMYy9k2qJD7dVWdqKXa0CKNR0Ccjg+B2IYu2fcBZJZkMFgM11r0X92wilghFGgzVnexlqB7xL9mS29SiYUVY2nXOZjNBRsyDsQPRWW5hrZ4XcdC4HVWRbjgJr4sFofK5SzjQ7rhI1UebdPdEbj6sqIvTZQZ5va08rABsAW0UxeWytAk7A2KJ9ZpxzCioB24XFtYAeXYxr6anSqhLgppEqWbGwLunTgrV+IjWlL29ljaAl4EQMGsErp4apeZiquwRXLXAqOCeru32mmydc6oWTSWpFAGdzeTB8RTHVMEtlM90CbbQCYhPjq3egYr1FGdYIQjiuDGZ5zZ/AzobKGOyLxti6c4Rwtv2anyWlLICnlLhxJRXt6A5ebDBWFNONbxWZ2d02mnu4S9YECpeppV1zSWRBWxHYzVIv1CXSouwqqX3jBBBDZdYQbpTQW4ZQlS8r5kH4suSRmg2++3JN10x1PaAmEkmtYlEdeGpJEM6kOuCqCR22oSujj5IV2HdT0zj5prLKTjXFAPjdQlyq7xIBxAQP5yMczG4VxAKw0n6ilZ2QBce2pLulkuxxqnoIzFfgqyqjil9S1VNwBrFmeyeops8yOjZUybZdfS8CuaTIJumzs5tODaNtLpFDQ/PcJGweLhmeL1nB0KqiUDScsiUVD89Di3HtrKtSULw3RLiygZD+7sF8JTObgYsrGvDNUFRGl1iy0Ll1YkUc2aJYMog920I8qW6YDCg1Mqk0JHJFKXkbgbRreI+qpYNOZHrVcDUba7pjsphSJNtK6upgRNAVoOS0mugBeN4bIZgHhuPZ/s1ENaX6KsVr+YNrh1Nb7ipR0PE5zbNRegCbrHRUw6Yf07dLBJl1f8KB9as2V1nNqAsl62LBBhehwalerkHmB1JFIEZKSEusdl5JQj1nJlHXSCF342gJ9CYGrXelknJIXqVP8sD+qtplCR3XH2qfKq0ygMp+KnVkKxNlZ8m2YkIlVMiCnXUwl7qznBKSvQz3m3Pt6oQbXO5b5FixCh/fHxUQW/AEcK6zCNqKQnL9sywqmKuwvqSYzT/aPVNNpVyhvRW21aqciCsjdWvBwILUvh5VyCzbWoC1pJjJ680CWsl+udKB6T5RwG1mlohnlpbg47iz5U9ha0FGtmRLFYBtO99y97Ap0z+ZDTAog6kSLZsMHg/IFkkgp6CpvU2U0cYVSdnmkjwBdOmXbxTWNWzuIbipMioVxEckZEoahSOiy2M3K0jcC1LhVDwaqG0ZvkcWqCnrG4GIxykrqlbWdw6LQyBaZR8HmLRIhQWsHswD42ZXVLNkf9l+FlW0HVQ2lwFsC/Z1FdzlQR0KaPfo+Fdfu+/dwVRICu1CGR7AEIiAhc+AZUF0kOBaPxmUqg4i64vQnU4nFDYJ9Nz+1fVXveH9qmr+kPILx8oKcRV/BFbxbE0JMT0kSD4w6L/lNY8ocsqagVdU3A3MjxhxcGuqzsPH4irpaow1q6OyrVjvp9Npc59E91LldboYVzJWdimWfAW2SNEKcDaX2FmBLLA/uKxlmhh613Is1URQApbKfttwxL02q6Onx5pQxSbPojAg+v5hAnN6LHVRDXIsvKtRjiS0qJUyZTAXVbAK82ElFJWaQdVoqUC1Unt7BVaTQudM6SuqexjQJN4+0icaxv/utbKv83ETbT8H8gjcOKxOJmbUa6OOVXht3dFY6rHv9XoNzFLceEA1o8+pKm0LAHPHZ2rYKjFq0hfZFixsqHJgD3eD5n+U0kb1mFjXkn2lvMSSOsNE/CdIAKF0Sytq6urOHUN5gwg4GZosgbmggM5ucra2qrS2Ig1cbiBBcxYzgzUDNLCvL8GbZXNp6ORy3LmS+Kk83zRIAK6A1ioKa2I9NapIuiUFdfC9766PFZUtqUr6KbWk+zZU1a/ZrIXEztrjTOfz7hwKziCeXIaraHtbZIMz+2pGgazCmw4qWAFvEdhodYp0Xq0pV7G1YWYWbO4qhGq42+Z8BYtrLWvluNPpZAeaFFS1vubPgbgxsqcpnAaszBovKaFoDQ8BGtjfUOl4NAG2nmQV04feJgumvX2fsrQEWZghL0JnVdYkn3DOZIeRN86RqPWCmsvGVqEMRnwxQAxwS8EMYo3IzmY2+BCcLp4MKiuyuhImamlbZFcNoNl7tp+RHd18ZjQIRKyXdFRhN98/hyKqwXWNo7O1wiaXoHN108REZZWEq6grnIfjzeg8jdRf1XEL4kkXa5bBjKxoKaljBjeHlVxQ4GaycpW4lDOAKtnTxHAtOfzOtZwHAM7sqVXkV6yu6kap1nHkXKqWF/4XHqjenNKqBjpR3l1ch3Ejg1+EsgdQhsdG0B4FM9sWAVWpuAyiwTPleZxt9VyZVS2qXfReWqTAilpr9ApoWTjxymit7NwV4JTriZyOA9B0k7HFfULourmKYHVnRQvqGL5HMHdqFcR2qWpmcK6eTwx2dipWrviDilr+fKWq3OWRWdHKwA4eu8wjchbeRzFilqjjZN3ufCpfkJ0/scVpnYk6L0PI77lxdWCZ87WiWm7B/AGquQSnujGKsB8CJmiJq8q1pKIVWyqOiTK66r18BN8r74/AE71fdC3yPS2MxdOpnE1tlVxD9JmVOoggN+r4PjAXVFPa3Eg5jVJGFVUGNolH20GVrUB7BOySWq6WqYQdWR92pcFMYMwckbSgCKCqD67DiiWu1g8MQC9ByfcFqW1L+jL714qNCuznoSxt0da2gtWN1G8F0BK0NN0nuimelUF9dIdAfjO44UT3CjQLoUeLHJFTO3gmpRuIIOvwBQCbqNeo3qtZ9iF6xVK13GRlo4zqimq+CGdTiR1uRY8oqgE02hZBa79kZXPMquxRHKla2saZWN4mRqZUj0vLCKhkjKnqOQHNuSZVJoKvAqS1wpEquvWDC1B2ypwrCPsRMEPVTODMLJMDv6qeKXwi2JYV5Sq4qKyvgGsHCLiuj2jR59V8gMqSJ2FJZRXEHVRHj3sFPrct6OpqlW1GpatQdt0GvwfM6n63InsGVFhJGaBqgqqIV6IsXllZgySPq4R3bnt3wi5cv+cN2yqQLW1T95KYVsWWtKk4cB9W53WQQflQYR6Wl4HaJZjvVE0D5yvq+RKgZCs5qdBEP5sD94cAvQLlSgNaSMAtHx88BuNQ41zdFsX30zKbcs0MLD/ihkpQzl0wiTqKLTfbKmCmyYICnK0IbaieC4CG9iSyLQ7cIMGQwau6TKoq60Apl3WN40LZpca1CKKK9VQyyIEn8w0F8F6CL2h8o3ixGwC7s7EWzCOqmcApYxYD4jsAzVS0sl2t98pA7vrKophCVSonbYpgH6mvSn24pTBV4sdtV3BtMq5k82y+IADvUJ0uAlkCVTxIaPm+UNu/qkV4F1TzHXCGrXIAqItBKypqK99VtAOVs64O4ObX7pHLVCpYHcRmwvLR7TvYAKBBN58LGVzDuFz+hQbWgncQyCZAk+VbsPSouf93261iZgmfCpwRbAvqmSqriU2PwhjaoOyYqtIegVXViTsmyta6bGySpY3gyRrpIyAeaWDDxtpsXwKyalMDKNP7YBXMqEskUsi2uC8FNAPxAKTVfT1o6VzM0E0jF+1rWcUuHvdyg7vgoFplX8HpvHpMCOMRUPHzZkInsqlFKNX/EIO52E0SxSzOwob2VmRLW5D1XIU0rbgM1AzWgyC7fe8G7xUAK/taEBat7luqtyP7EmsaJQOj5F+mrnZfCuYCfBUAWwShyd6pMY/vAHG1UqOYpbI/gy5T0CMKm+UO3gFuC85dgfDVeguPDfITrIBLsLrcgdh3CFgFZjaKJ4Iv3F8ANEqvuxR1tVKOgLoCa1jxboBAkj6v7j/icFbA7f4rfRnQDLRViG13i0vqBQrYVqBbADZT0ZpiHoSzvQpopKIFS3sE1HfBWlHXd0H7LnArqvougMtljHBgZnh3Eoz/BKjLML4Z2Aq0+hEJr9jaVUBbvNzCIUiroC7AWmmFw4o5AK3MtB5VypZMSFgs05JyGVwlwBqsEGAAa2ZU1CjUexXGsE4rKriilBvFzOKKo3AuAroE6QFQU3u8YpNXwS5k+1TZt5UrwouN4KiUEw+k3ZWDp1RXHNRqXb21Ts39945yZSg3VnZFNQ9CF3XeZyr5DgBXKiwCMa2MxeTDYXgP1Fsf9QNKZc0k81RJk3r6EQ3rCmBVyLL75EjZ1pIVDHoFtiOAHoB0BdTVylqBsKKKS+AeBXJVLY+CXASuGvO/Auq7GuEjDfGKg1oKa1z/dmmi9I9SUGNhl0AtfulHAawoYrnSkmNXAVuGEhrEVXvUF+A5Ct2PqNOjDetyna4CmeUolmeXLN4Aq7C5Sj10Q7yjgl+t6CNxSRHmI5X+CpwreYB3Qfdqna4q21KdBuc4GoZsn49ZOOiVinwHqK9WzjvgeweEh2AU5+vtxZ9Cd9Wqkh49V18E5oj6vVyn0RStAyGIO5edXRKd5B0VGVXq2yr3xYp+5Ut+C4QJ4P1N339pQMjRejj4vb/Dcr6rQc3O/0rjmtZpeYCBiCHfCemRbNhbK/pNUPc3wfKy5f2D7OlL3/uPhve/oU4T0F8f+VNM2vyoiv0jK+KHQfdHq+0bncz4oz73/+Y6LbKw1o/5B7eOf1Rl/0du9B9tn/9bvrf/j+v0h6ttn2tp/r/4819y4/zv5391uvzzfwDifz6phT1MPgAAAABJRU5ErkJggg==\\\"); overflow: hidden; border-radius: 4px 4px 0 0; } .md2-color-picker .saturation-lightness:hover { cursor: crosshair; } .md2-color-picker .hue { width: 150px; height: 16px; border: none; top: 140px; left: 60px; position: absolute; background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAQCAYAAAD06IYnAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AIWDwkUFWbCCAAAAFxJREFUaN7t0kEKg0AQAME2x83/n2qu5qCgD1iDhCoYdpnbQC9bbY1qVO/jvc6k3ad91s7/7F1/csgPrujuQ17BDYSFsBAWwgJhISyEBcJCWAgLhIWwEBYIi2f7Ar/1TCgFH2X9AAAAAElFTkSuQmCC\\\"); } .md2-color-picker .alpha { width: 150px; height: 16px; border: none; top: 165px; left: 60px; position: absolute; background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAQCAYAAAD06IYnAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AIWDwYQlZMa3gAAAWVJREFUaN7tmEGO6jAQRCsOArHgBpyAJYGjcGocxAm4A2IHpmoWE0eBH+ezmFlNvU06shJ3W6VEelWMUQAIIF9f6qZpimsA1LYtS2uF51/u27YVAFZVRUkEoGHdPV/sIcbIEIIkUdI/9Xa7neyv61+SWFUVAVCSct00TWn2fv6u3+Ecfd3tXzy/0+nEUu+SPjo/kqzrmiQpScN6v98XewfA8/lMkiLJ2WxGSUopcT6fM6U0NX9/frfbjev1WtfrlZfLhYfDQQHG/AIOlnGwjINlHCxjHCzjYJm/TJWdCwquJXseFFzGwDNNeiKMOJTO8xQdDQaeB29+K9efeLaBo9J7vdvtJj1RjFFjfiv7qv95tjx/7leSQgh93e1ffMeIp6O+YQjho/N791t1XVOSSI7N//K+4/GoxWLBx+PB5/Op5XLJ+/3OlJJWqxU3m83ovv5iGf8KjYNlHCxjHCzjYBkHy5gf5gusvQU7U37jTAAAAABJRU5ErkJggg==\\\"); } .md2-color-picker .selected-color { width: 45px; height: 45px; top: 140px; left: 2%; position: absolute; border: 1px solid #cccccc; } .hex-text { position: absolute; top: 190px; left: 30px; font-size: 11px; } .hex-text input { float: left; width: 150px; border: 1px solid #a9a9a9; padding: 4px; } .hex-text div { text-align: center; color: #555; float: left; clear: left; width: 160px; margin-top: 4px; } .hsla-text, .rgba-text { position: absolute; top: 190px; left: 12px; font-size: 11px; } .hsla-text input, .rgba-text input { margin: 0 0 0 7px; float: left; width: 40px; border: 1px solid #a9a9a9; padding: 4px 0; } .hsla-text div, .rgba-text div { float: left; width: 40px; text-align: center; color: #555; margin-left: 7px; margin-top: 4px; } .hsla-text div:nth-child(5), .rgba-text div:nth-child(5) { clear: left; } .type-policy { position: absolute; top: 190px; left: 206px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAgCAYAAAAffCjxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACewAAAnsB01CO3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIASURBVEiJ7ZY9axRRFIafsxMStrLQJpAgpBFhi+C9w1YSo00I6RZ/g9vZpBf/QOr4GyRgkSKNSrAadsZqQGwCkuAWyRZJsySwvhZ7N/vhzrgbLH3Ld8597jlzz50zJokyxXH8DqDVar0qi6v8BbItqSGpEcfxdlmsFWXkvX8AfAVWg3UKPEnT9GKujMzsAFgZsVaCN1VTQd77XUnrgE1kv+6935268WRpzrnHZvYRWC7YvC3pRZZl3wozqtVqiyH9IgjAspkd1Gq1xUJQtVrdB9ZKIAOthdg/Qc65LUk7wNIMoCVJO865rYFhkqjX6/d7vV4GPJwBMqofURS5JEk6FYBer/eeYb/Mo9WwFnPOvQbeAvfuAAK4BN4sAJtAG/gJIElmNuiJyba3EGNmZiPeZuEVmVell/Y/6N+CzDn3AXhEOOo7Hv/3BeAz8IzQkMPnJbuPx1wC+yYJ7/0nYIP5S/0FHKdp+rwCEEXRS/rf5Hl1Gtb2M0iSpCOpCZzPATmX1EySpHMLAsiy7MjMDoHrGSDXZnaYZdnRwBh7J91utwmczAA6CbG3GgPleX4jqUH/a1CktqRGnuc3hSCAMB32gKspkCtgb3KCQMmkjeP4WNJThrNNZval1WptTIsv7JtQ4tmIdRa8qSoEpWl6YWZNoAN0zKxZNPehpLSBZv2t+Q0CJ9lLnARQLAAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-position: center; background-size: 8px 16px; -moz-background-size: 8px 16px; -webkit-background-size: 8px 16px; -o-background-size: 8px 16px; width: 16px; height: 24px; } /*# sourceMappingURL=colorpicker.css.map */ \"],\n            providers: [MD2_COLORPICKER_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'colorpicker',\n                '[id]': 'id',\n                '[tabindex]': 'disabled ? -1 : tabindex',\n                '[class.md2-colorpicker-disabled]': 'disabled',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$24('design:paramtypes', [ColorpickerService, _angular_core.ElementRef])\n    ], Md2Colorpicker);\n    return Md2Colorpicker;\n}());\nvar Hsva = (function () {\n    function Hsva(h, s, v, a) {\n        this.h = h;\n        this.s = s;\n        this.v = v;\n        this.a = a;\n    }\n    return Hsva;\n}());\nvar Hsla = (function () {\n    function Hsla(h, s, l, a) {\n        this.h = h;\n        this.s = s;\n        this.l = l;\n        this.a = a;\n    }\n    return Hsla;\n}());\nvar Rgba = (function () {\n    function Rgba(r, g, b, a) {\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n    }\n    return Rgba;\n}());\nvar SliderPosition = (function () {\n    function SliderPosition(h, s, v, a) {\n        this.h = h;\n        this.s = s;\n        this.v = v;\n        this.a = a;\n    }\n    return SliderPosition;\n}());\nvar SliderDimension = (function () {\n    function SliderDimension(h, s, v, a) {\n        this.h = h;\n        this.s = s;\n        this.v = v;\n        this.a = a;\n    }\n    return SliderDimension;\n}());\nvar MD2_COLORPICKER_DIRECTIVES = [Md2Colorpicker, ColorpickerSliderDirective, TextDirective];\nvar Md2ColorpickerModule = (function () {\n    function Md2ColorpickerModule() {\n    }\n    Md2ColorpickerModule.forRoot = function () {\n        return {\n            ngModule: Md2ColorpickerModule\n        };\n    };\n    Md2ColorpickerModule = __decorate$24([\n        _angular_core.NgModule({\n            declarations: MD2_COLORPICKER_DIRECTIVES,\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule],\n            exports: MD2_COLORPICKER_DIRECTIVES,\n            providers: [ColorpickerService]\n        }), \n        __metadata$24('design:paramtypes', [])\n    ], Md2ColorpickerModule);\n    return Md2ColorpickerModule;\n}());\n\nvar __decorate$26 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$26 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$2 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar Md2DataTable = (function () {\n    function Md2DataTable() {\n        this.dataLength = 0;\n        this.onDataChange = new _angular_core.EventEmitter();\n        this.onSortChange = new _angular_core.EventEmitter();\n        this.onPageChange = new _angular_core.EventEmitter();\n        this.sortField = '';\n        this.sortOrder = 'asc';\n        this.isDataChanged = false;\n        this.inputData = [];\n        this.pageLength = 1000;\n        this.activePage = 1;\n    }\n    Md2DataTable.prototype.getSort = function () {\n        return { sortField: this.sortField, sortOrder: this.sortOrder };\n    };\n    Md2DataTable.prototype.setSort = function (sortField, sortOrder) {\n        if (this.sortField !== sortField || this.sortOrder !== sortOrder) {\n            this.sortField = sortField;\n            this.sortOrder = sortOrder;\n            this.isDataChanged = true;\n            this.onSortChange.emit({ sortField: sortField, sortOrder: sortOrder });\n        }\n    };\n    Md2DataTable.prototype.getPage = function () {\n        return { activePage: this.activePage, pageLength: this.pageLength, dataLength: this.inputData.length };\n    };\n    Md2DataTable.prototype.setPage = function (activePage, pageLength) {\n        if (this.pageLength !== pageLength || this.activePage !== activePage) {\n            this.activePage = this.activePage !== activePage ? activePage : this.calculateNewActivePage(this.pageLength, pageLength);\n            this.pageLength = pageLength;\n            this.isDataChanged = true;\n            this.onPageChange.emit({\n                activePage: this.activePage,\n                pageLength: this.pageLength,\n                dataLength: this.inputData.length\n            });\n        }\n    };\n    Md2DataTable.prototype.calculateNewActivePage = function (previousPageLength, currentPageLength) {\n        var firstRowOnPage = (this.activePage - 1) * previousPageLength + 1;\n        var newActivePage = Math.ceil(firstRowOnPage / currentPageLength);\n        return newActivePage;\n    };\n    Md2DataTable.prototype.recalculatePage = function () {\n        var _lastPage = Math.ceil(this.inputData.length / this.pageLength);\n        this.activePage = _lastPage < this.activePage ? _lastPage : this.activePage;\n        this.activePage = this.activePage || 1;\n    };\n    Md2DataTable.prototype.ngOnChanges = function (changes) {\n        if (changes['inputData']) {\n            this.inputData = changes['inputData'].currentValue || [];\n            this.recalculatePage();\n            this.onPageChange.emit({\n                activePage: this.activePage,\n                pageLength: this.pageLength,\n                dataLength: this.inputData.length\n            });\n            this.isDataChanged = true;\n        }\n    };\n    Md2DataTable.prototype.ngDoCheck = function () {\n        if (this.dataLength !== this.inputData.length) {\n            this.dataLength = this.inputData.length;\n            this.fillData();\n            this.recalculatePage();\n            this.onPageChange.emit({\n                activePage: this.activePage,\n                pageLength: this.pageLength,\n                dataLength: this.inputData.length\n            });\n            this.isDataChanged = true;\n        }\n        if (this.isDataChanged) {\n            this.fillData();\n            this.isDataChanged = false;\n        }\n    };\n    Md2DataTable.prototype.fillData = function () {\n        this.activePage = this.activePage;\n        this.pageLength = this.pageLength;\n        var offset = (this.activePage - 1) * this.pageLength;\n        var data = this.inputData;\n        var sortField = this.sortField;\n        if (sortField) {\n            data = data.sort(function (a, b) {\n                var x = isNaN(a[sortField + '']) ? a[sortField + ''].toLowerCase() : a[sortField + ''];\n                var y = isNaN(b[sortField + '']) ? b[sortField + ''].toLowerCase() : b[sortField + ''];\n                return (x > y) ? 1 : (y > x) ? -1 : 0;\n            });\n        }\n        if (this.sortOrder === 'desc') {\n            data.reverse();\n        }\n        this.data = data.slice(offset, offset + this.pageLength);\n    };\n    Md2DataTable.prototype.caseInsensitiveIteratee = function (sortField) {\n        return function (row) {\n            var value = row[sortField];\n            if (value && typeof value === 'string' || value instanceof String) {\n                return value.toLowerCase();\n            }\n            return value;\n        };\n    };\n    __decorate$26([\n        _angular_core.Input('md2-data'), \n        __metadata$26('design:type', Array)\n    ], Md2DataTable.prototype, \"inputData\", void 0);\n    __decorate$26([\n        _angular_core.Input('md2-page-length'), \n        __metadata$26('design:type', Object)\n    ], Md2DataTable.prototype, \"pageLength\", void 0);\n    __decorate$26([\n        _angular_core.Input('md2-active-page'), \n        __metadata$26('design:type', Object)\n    ], Md2DataTable.prototype, \"activePage\", void 0);\n    Md2DataTable = __decorate$26([\n        _angular_core.Directive({\n            selector: 'table[md2-data]',\n            exportAs: 'Md2DataTable'\n        }), \n        __metadata$26('design:paramtypes', [])\n    ], Md2DataTable);\n    return Md2DataTable;\n}());\nvar Md2DataTableSortField = (function () {\n    function Md2DataTableSortField(_md2Table) {\n        var _this = this;\n        this._md2Table = _md2Table;\n        this.isAsc = false;\n        this.isDesc = false;\n        _md2Table.onSortChange.subscribe(function (event) {\n            _this.isAsc = (event.sortField === _this.sortField && event.sortOrder === \"asc\");\n            _this.isDesc = (event.sortField === _this.sortField && event.sortOrder === \"desc\");\n        });\n    }\n    Md2DataTableSortField.prototype._sort = function () {\n        if (this.isAsc) {\n            this._md2Table.setSort(this.sortField, \"desc\");\n        }\n        else {\n            this._md2Table.setSort(this.sortField, \"asc\");\n        }\n    };\n    __decorate$26([\n        _angular_core.Input('md2-sort-field'), \n        __metadata$26('design:type', String)\n    ], Md2DataTableSortField.prototype, \"sortField\", void 0);\n    Md2DataTableSortField = __decorate$26([\n        _angular_core.Component({\n            selector: \"[md2-sort-field]\",\n            template: \"\\n    <span (click)=\\\"_sort()\\\">\\n      <ng-content></ng-content>\\n      <svg *ngIf=\\\"isAsc\\\" width=\\\"24\\\"height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n        <path d=\\\"M7 14l5-5 5 5z\\\"/>\\n      </svg>\\n      <svg *ngIf=\\\"isDesc\\\" width=\\\"24\\\"height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n        <path d=\\\"M7 10l5 5 5-5z\\\"/>\\n      </svg>\\n      <svg *ngIf=\\\"!isAsc && !isDesc\\\" width=\\\"24\\\"height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n        <path d=\\\"M7,10.5l5-5l5,5H7z\\\"/>\\n        <path d=\\\"M7,12.5l5,5l5-5H7z\\\"/>\\n      </svg>\\n    </span>\\n  \",\n            styles: [\"\\n    [md2-sort-field] span { position: relative; display: block; line-height: 24px; white-space: nowrap; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }\\n    [md2-sort-field] span svg { display: inline-block; vertical-align: middle; fill: currentColor; }\\n  \"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$26('design:paramtypes', [Md2DataTable])\n    ], Md2DataTableSortField);\n    return Md2DataTableSortField;\n}());\nvar Md2Pagination = (function () {\n    function Md2Pagination(injectMd2Table) {\n        var _this = this;\n        this.injectMd2Table = injectMd2Table;\n        this._minRows = 0;\n        this.dataLength = 0;\n        this.rows = [];\n        this._onPageChange = function (event) {\n            _this._activePage = event.activePage;\n            _this._rows = event.pageLength;\n            _this.dataLength = event.dataLength;\n            _this._lastPage = Math.ceil(_this.dataLength / _this._rows);\n        };\n    }\n    Md2Pagination.prototype.ngOnChanges = function (changes) {\n        if (changes.rows) {\n        }\n        this._md2Table = this.md2InputTable || this.injectMd2Table;\n        this._onPageChange(this._md2Table.getPage());\n        this._md2Table.onPageChange.subscribe(this._onPageChange);\n    };\n    Md2Pagination.prototype._setPage = function (page) {\n        this._md2Table.setPage(page, this._rows);\n    };\n    Md2Pagination.prototype._setRows = function (rows) {\n        this._md2Table.setPage(this._activePage, rows);\n    };\n    __decorate$26([\n        _angular_core.Input('md2-rows'), \n        __metadata$26('design:type', Object)\n    ], Md2Pagination.prototype, \"rows\", void 0);\n    __decorate$26([\n        _angular_core.Input('md2-table'), \n        __metadata$26('design:type', Md2DataTable)\n    ], Md2Pagination.prototype, \"md2InputTable\", void 0);\n    Md2Pagination = __decorate$26([\n        _angular_core.Component({\n            selector: 'md2-pagination',\n            template: \"\\n    <ul class=\\\"md2-pagination\\\" *ngIf=\\\"dataLength > _rows\\\">\\n      <li [class.disabled]=\\\"_activePage <= 1\\\" (click)=\\\"_setPage(1)\\\">\\n        <svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n          <path d=\\\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\\\"/>\\n        </svg>\\n      </li>\\n      <li *ngIf=\\\"_activePage > 4 && _activePage + 1 > _lastPage\\\" (click)=\\\"_setPage(_activePage - 4)\\\">{{_activePage-4}}</li>\\n      <li *ngIf=\\\"_activePage > 3 && _activePage + 2 > _lastPage\\\" (click)=\\\"_setPage(_activePage - 3)\\\">{{_activePage-3}}</li>\\n      <li *ngIf=\\\"_activePage > 2\\\" (click)=\\\"_setPage(_activePage - 2)\\\">{{_activePage-2}}</li>\\n      <li *ngIf=\\\"_activePage > 1\\\" (click)=\\\"_setPage(_activePage - 1)\\\">{{_activePage-1}}</li>\\n      <li class=\\\"active\\\">{{_activePage}}</li>\\n      <li *ngIf=\\\"_activePage + 1 <= _lastPage\\\" (click)=\\\"_setPage(_activePage + 1)\\\">{{_activePage+1}}</li>\\n      <li *ngIf=\\\"_activePage + 2 <= _lastPage\\\" (click)=\\\"_setPage(_activePage + 2)\\\">{{_activePage+2}}</li>\\n      <li *ngIf=\\\"_activePage + 3 <= _lastPage && _activePage < 3\\\" (click)=\\\"_setPage(_activePage + 3)\\\">{{_activePage+3}}</li>\\n      <li *ngIf=\\\"_activePage + 4 <= _lastPage && _activePage < 2\\\" (click)=\\\"_setPage(_activePage + 4)\\\">{{_activePage+4}}</li>\\n      <li [class.disabled]=\\\"_activePage >= _lastPage\\\" (click)=\\\"_setPage(_lastPage)\\\">\\n        <svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n          <path d=\\\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\\\"/>\\n        </svg>\\n      </li>\\n    </ul>\\n    <div class=\\\"md2-rows-select\\\" *ngIf=\\\"dataLength > _minRows\\\">\\n      Rows per page:\\n      <select (change)=\\\"_setRows($event.target.value)\\\">\\n        <option *ngFor=\\\"let row of rows\\\" [selected]=\\\"_rows===row\\\">{{row}}</option>\\n      </select>\\n    </div>\\n  \",\n            styles: [\"\\n    md2-pagination { display: block; color: #0e59a5; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }\\n    md2-pagination:before,\\n    md2-pagination:after { display: table; content: ''; }\\n    md2-pagination:after { clear: both; }\\n    md2-pagination .md2-pagination { display: inline-block; margin: .5rem 0; padding: 0; }\\n    md2-pagination .md2-pagination li { position: relative; display: inline-block; width: 36px; vertical-align: top; text-align: center; line-height: 36px; border-radius: 100px; cursor: pointer; box-sizing: border-box; }\\n    md2-pagination .md2-pagination li:hover { background: rgba(0,0,0,0.12); }\\n    md2-pagination .md2-pagination li.disabled,\\n    md2-pagination .md2-pagination li.disabled:hover { pointer-events: none; background: transparent; cursor: default; opacity: .5; }\\n    md2-pagination .md2-pagination li.active,\\n    md2-pagination .md2-pagination li.active:hover { background: #106CC8; color: #fff; cursor: default; }\\n    md2-pagination .md2-pagination li svg { fill: currentColor; margin-bottom: -7px; }\\n    md2-pagination .md2-rows-select { display: inline-block; margin: .5rem 0; padding: 0; float: right; color: rgba(0,0,0,.54); line-height: 36px; }\\n    md2-pagination .md2-rows-select select { border: 0; outline: 0; }\\n  \"],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }),\n        __param$2(0, _angular_core.Optional()), \n        __metadata$26('design:paramtypes', [Md2DataTable])\n    ], Md2Pagination);\n    return Md2Pagination;\n}());\nvar MD2_DATA_TABLE_DIRECTIVES = [Md2DataTable, Md2DataTableSortField, Md2Pagination];\nvar Md2DataTableModule = (function () {\n    function Md2DataTableModule() {\n    }\n    Md2DataTableModule.forRoot = function () {\n        return {\n            ngModule: Md2DataTableModule,\n            providers: []\n        };\n    };\n    Md2DataTableModule = __decorate$26([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_DATA_TABLE_DIRECTIVES,\n            declarations: MD2_DATA_TABLE_DIRECTIVES,\n        }), \n        __metadata$26('design:paramtypes', [])\n    ], Md2DataTableModule);\n    return Md2DataTableModule;\n}());\n\nvar __decorate$28 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$28 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2DateUtil = (function () {\n    function Md2DateUtil() {\n    }\n    /**\n     * Gets the first day of the month for the given date's month.\n     * @param {Date} date\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.getFirstDateOfMonth = function (date) {\n        return new Date(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes());\n    };\n    /**\n     * Gets the number of days in the month for the given date's month.\n     * @param date\n     * @returns {number}\n     */\n    Md2DateUtil.prototype.getNumberOfDaysInMonth = function (date) {\n        return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n    };\n    /**\n     * Get an arbitrary date in the month after the given date's month.\n     * @param date\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.getDateInNextMonth = function (date) {\n        return new Date(date.getFullYear(), date.getMonth() + 1, 1, date.getHours(), date.getMinutes());\n    };\n    /**\n     * Get an arbitrary date in the month before the given date's month.\n     * @param date\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.getDateInPreviousMonth = function (date) {\n        return new Date(date.getFullYear(), date.getMonth() - 1, 1, date.getHours(), date.getMinutes());\n    };\n    /**\n     * Gets whether two dates have the same month and year.\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {boolean}\n     */\n    Md2DateUtil.prototype.isSameMonthAndYear = function (d1, d2) {\n        return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();\n    };\n    /**\n     * Gets whether two dates are the same day (not not necesarily the same time).\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {boolean}\n     */\n    Md2DateUtil.prototype.isSameDay = function (d1, d2) {\n        return d1.getDate() == d2.getDate() && this.isSameMonthAndYear(d1, d2);\n    };\n    /**\n     * Gets whether a date is in the month immediately after some date.\n     * @param {Date} startDate The date from which to compare.\n     * @param {Date} endDate The date to check.\n     * @returns {boolean}\n     */\n    Md2DateUtil.prototype.isInNextMonth = function (startDate, endDate) {\n        var nextMonth = this.getDateInNextMonth(startDate);\n        return this.isSameMonthAndYear(nextMonth, endDate);\n    };\n    /**\n     * Gets whether a date is in the month immediately before some date.\n     * @param {Date} startDate The date from which to compare.\n     * @param {Date} endDate The date to check.\n     * @returns {boolean}\n     */\n    Md2DateUtil.prototype.isInPreviousMonth = function (startDate, endDate) {\n        var previousMonth = this.getDateInPreviousMonth(startDate);\n        return this.isSameMonthAndYear(endDate, previousMonth);\n    };\n    /**\n     * Gets the midpoint between two dates.\n     * @param {Date} d1\n     * @param {Date} d2\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.getDateMidpoint = function (d1, d2) {\n        return this.createDateAtMidnight((d1.getTime() + d2.getTime()) / 2);\n    };\n    /**\n     * Gets the week of the month that a given date occurs in.\n     * @param {Date} date\n     * @returns {number} Index of the week of the month (zero-based).\n     */\n    Md2DateUtil.prototype.getWeekOfMonth = function (date) {\n        var firstDayOfMonth = this.getFirstDateOfMonth(date);\n        return Math.floor((firstDayOfMonth.getDay() + date.getDate() - 1) / 7);\n    };\n    /**\n     * Gets a new date incremented by the given number of minutes. Number of minutes can be negative.\n     * @param {Date} date\n     * @param {number} numberOfMinutes\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.incrementMinutes = function (date, numberOfMinutes) {\n        return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes() + numberOfMinutes);\n    };\n    /**\n     * Gets a new date incremented by the given number of hours. Number of hours can be negative.\n     * @param {Date} date\n     * @param {number} numberOfHours\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.incrementHours = function (date, numberOfHours) {\n        return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours() + numberOfHours, date.getMinutes());\n    };\n    /**\n     * Gets a new date incremented by the given number of days. Number of days can be negative.\n     * @param {Date} date\n     * @param {number} numberOfDays\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.incrementDays = function (date, numberOfDays) {\n        return new Date(date.getFullYear(), date.getMonth(), date.getDate() + numberOfDays, date.getHours(), date.getMinutes());\n    };\n    /**\n     * Gets a new date incremented by the given number of months. Number of months can be negative.\n     * If the date of the given month does not match the target month, the date will be set to the\n     * last day of the month.\n     * @param {Date} date\n     * @param {number} numberOfMonths\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.incrementMonths = function (date, numberOfMonths) {\n        // If the same date in the target month does not actually exist, the Date object will\n        // automatically advance *another* month by the number of missing days.\n        // For example, if you try to go from Jan. 30 to Feb. 30, you'll end up on March 2.\n        // So, we check if the month overflowed and go to the last day of the target month instead.\n        var dateInTargetMonth = new Date(date.getFullYear(), date.getMonth() + numberOfMonths, 1, date.getHours(), date.getMinutes());\n        var numberOfDaysInMonth = this.getNumberOfDaysInMonth(dateInTargetMonth);\n        if (numberOfDaysInMonth < date.getDate()) {\n            dateInTargetMonth.setDate(numberOfDaysInMonth);\n        }\n        else {\n            dateInTargetMonth.setDate(date.getDate());\n        }\n        return dateInTargetMonth;\n    };\n    /**\n     * Get the integer distance between two months. This *only* considers the month and year\n     * portion of the Date instances.\n     *\n     * @param {Date} start\n     * @param {Date} end\n     * @returns {number} Number of months between `start` and `end`. If `end` is before `start`\n     *     chronologically, this number will be negative.\n     */\n    Md2DateUtil.prototype.getMonthDistance = function (start, end) {\n        return (12 * (end.getFullYear() - start.getFullYear())) + (end.getMonth() - start.getMonth());\n    };\n    /**\n     * Gets the last day of the month for the given date.\n     * @param {Date} date\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.getLastDateOfMonth = function (date) {\n        return new Date(date.getFullYear(), date.getMonth(), this.getNumberOfDaysInMonth(date), date.getHours(), date.getMinutes());\n    };\n    /**\n     * Checks whether a date is valid.\n     * @param {Date} date\n     * @return {boolean} Whether the date is a valid Date.\n     */\n    Md2DateUtil.prototype.isValidDate = function (date) {\n        return date != null && date.getTime && !isNaN(date.getTime());\n    };\n    /**\n     * Sets a date's time to midnight.\n     * @param {Date} date\n     */\n    Md2DateUtil.prototype.setDateTimeToMidnight = function (date) {\n        if (this.isValidDate(date)) {\n            date.setHours(0, 0, 0, 0);\n        }\n    };\n    /**\n     * Creates a date with the time set to midnight.\n     * Drop-in replacement for two forms of the Date constructor:\n     * 1. No argument for Date representing now.\n     * 2. Single-argument value representing number of seconds since Unix Epoch\n     * or a Date object.\n     * @param {number|Date=} opt_value\n     * @return {Date} New date with time set to midnight.\n     */\n    Md2DateUtil.prototype.createDateAtMidnight = function (opt_value) {\n        var date;\n        if (!opt_value) {\n            date = new Date();\n        }\n        else {\n            date = new Date(opt_value);\n        }\n        this.setDateTimeToMidnight(date);\n        return date;\n    };\n    /**\n     * Checks if a date is within a min and max range, ignoring the time component.\n     * If minDate or maxDate are not dates, they are ignored.\n     * @param {Date} date\n     * @param {Date} minDate\n     * @param {Date} maxDate\n     */\n    Md2DateUtil.prototype.isDateWithinRange = function (date, minDate, maxDate) {\n        var dateAtMidnight = this.createDateAtMidnight(date);\n        var minDateAtMidnight = this.isValidDate(minDate) ? this.createDateAtMidnight(minDate) : null;\n        var maxDateAtMidnight = this.isValidDate(maxDate) ? this.createDateAtMidnight(maxDate) : null;\n        return (!minDateAtMidnight || minDateAtMidnight <= dateAtMidnight) &&\n            (!maxDateAtMidnight || maxDateAtMidnight >= dateAtMidnight);\n    };\n    /**\n     * Gets a new date incremented by the given number of years. Number of years can be negative.\n     * See `incrementMonths` for notes on overflow for specific dates.\n     * @param {Date} date\n     * @param {number} numberOfYears\n     * @returns {Date}\n     */\n    Md2DateUtil.prototype.incrementYears = function (date, numberOfYears) {\n        return this.incrementMonths(date, numberOfYears * 12);\n    };\n    /**\n     * Get the integer distance between two years. This *only* considers the year portion of the\n     * Date instances.\n     *\n     * @param {Date} start\n     * @param {Date} end\n     * @returns {number} Number of months between `start` and `end`. If `end` is before `start`\n     *     chronologically, this number will be negative.\n     */\n    Md2DateUtil.prototype.getYearDistance = function (start, end) {\n        return end.getFullYear() - start.getFullYear();\n    };\n    /**\n     * Clamps a date between a minimum and a maximum date.\n     * @param {Date} date Date to be clamped\n     * @param {Date=} minDate Minimum date\n     * @param {Date=} maxDate Maximum date\n     * @return {Date}\n     */\n    Md2DateUtil.prototype.clampDate = function (date, minDate, maxDate) {\n        var boundDate = date;\n        if (minDate && date < minDate) {\n            boundDate = new Date(minDate.getTime());\n        }\n        if (maxDate && date > maxDate) {\n            boundDate = new Date(maxDate.getTime());\n        }\n        return boundDate;\n    };\n    /**\n     * Extracts and parses the timestamp from a DOM node.\n     * @param  {HTMLElement} node Node from which the timestamp will be extracted.\n     * @return {number} Time since epoch.\n     */\n    Md2DateUtil.prototype.getTimestampFromNode = function (node) {\n        if (node && node.hasAttribute('data-timestamp')) {\n            return Number(node.getAttribute('data-timestamp'));\n        }\n    };\n    /**\n     * Checks if a month is within a min and max range, ignoring the date and time components.\n     * If minDate or maxDate are not dates, they are ignored.\n     * @param {Date} date\n     * @param {Date} minDate\n     * @param {Date} maxDate\n     */\n    Md2DateUtil.prototype.isMonthWithinRange = function (date, minDate, maxDate) {\n        var month = date.getMonth();\n        var year = date.getFullYear();\n        return (!minDate || minDate.getFullYear() < year || minDate.getMonth() <= month) &&\n            (!maxDate || maxDate.getFullYear() > year || maxDate.getMonth() >= month);\n    };\n    Md2DateUtil = __decorate$28([\n        _angular_core.Injectable(), \n        __metadata$28('design:paramtypes', [])\n    ], Md2DateUtil);\n    return Md2DateUtil;\n}());\n\nvar __decorate$27 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$27 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar noop$3 = function () { };\nvar nextId$3 = 0;\nvar MD2_DATEPICKER_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Datepicker; }),\n    multi: true\n};\nvar Md2Datepicker = (function () {\n    function Md2Datepicker(dateUtil, element) {\n        this.dateUtil = dateUtil;\n        this.element = element;\n        //private mouseMoveListener: any;\n        //private mouseUpListener: any;\n        this._value = null;\n        this._disabled = false;\n        this._isInitialized = false;\n        this._onTouchedCallback = noop$3;\n        this._onChangeCallback = noop$3;\n        this.isHoursVisible = true;\n        this.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n        this.days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n        this.hours = [];\n        this.minutes = [];\n        this.prevMonth = 1;\n        this.currMonth = 2;\n        this.nextMonth = 3;\n        this.years = [];\n        this.dates = [];\n        this.today = new Date();\n        this._displayDate = null;\n        this.selectedDate = null;\n        this.displayDay = { year: 0, month: '', date: '', day: '', hour: '', minute: '' };\n        this.displayInputDate = '';\n        this.clock = {\n            dialRadius: 120,\n            outerRadius: 99,\n            innerRadius: 66,\n            tickRadius: 17,\n            hand: { x: 0, y: 0 },\n            x: 0, y: 0,\n            dx: 0, dy: 0,\n            moved: false\n        };\n        this._minDate = null;\n        this._maxDate = null;\n        this.change = new _angular_core.EventEmitter();\n        this.type = 'date';\n        this.name = '';\n        this.id = 'md2-datepicker-' + (++nextId$3);\n        this.format = this.type === 'date' ? 'DD/MM/YYYY' : this.type === 'time' ? 'HH:mm' : this.type === 'datetime' ? 'DD/MM/YYYY HH:mm' : 'DD/MM/YYYY';\n        this.tabindex = 0;\n        this.getYears();\n        this.generateClock();\n        //this.mouseMoveListener = (event: MouseEvent) => { this.onMouseMoveClock(event); };\n        //this.mouseUpListener = (event: MouseEvent) => { this.onMouseUpClock(event); };\n    }\n    Md2Datepicker.prototype.ngAfterContentInit = function () {\n        this._isInitialized = true;\n        this.isCalendarVisible = this.type !== 'time' ? true : false;\n    };\n    Object.defineProperty(Md2Datepicker.prototype, \"readonly\", {\n        get: function () { return this._readonly; },\n        set: function (value) { this._readonly = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"required\", {\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"min\", {\n        set: function (value) {\n            this._minDate = new Date(value);\n            this._minDate.setHours(0, 0, 0, 0);\n            this.getYears();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"max\", {\n        set: function (value) {\n            this._maxDate = new Date(value);\n            this._maxDate.setHours(0, 0, 0, 0);\n            this.getYears();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) {\n            if (value && value !== this._value) {\n                if (this.dateUtil.isValidDate(value)) {\n                    this._value = value;\n                }\n                else {\n                    if (this.type === 'time') {\n                        this._value = new Date('1-1-1 ' + value);\n                    }\n                    else {\n                        this._value = new Date(value);\n                    }\n                }\n                this.displayInputDate = this._formatDate(this._value);\n                var date = '';\n                if (this.type !== 'time') {\n                    date += this._value.getFullYear() + '-' + (this._value.getMonth() + 1) + '-' + this._value.getDate();\n                }\n                if (this.type === 'datetime') {\n                    date += ' ';\n                }\n                if (this.type !== 'date') {\n                    date += this._value.getHours() + ':' + this._value.getMinutes();\n                }\n                if (this._isInitialized) {\n                    this._onChangeCallback(date);\n                    this.change.emit(date);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Datepicker.prototype, \"displayDate\", {\n        get: function () {\n            if (this._displayDate && this.dateUtil.isValidDate(this._displayDate)) {\n                return this._displayDate;\n            }\n            else {\n                return this.today;\n            }\n        },\n        set: function (date) {\n            if (date && this.dateUtil.isValidDate(date)) {\n                if (this._minDate && this._minDate > date) {\n                    date = this._minDate;\n                }\n                if (this._maxDate && this._maxDate < date) {\n                    date = this._maxDate;\n                }\n                this._displayDate = date;\n                this.displayDay = {\n                    year: date.getFullYear(),\n                    month: this.months[date.getMonth()],\n                    date: this._prependZero(date.getDate() + ''),\n                    day: this.days[date.getDay()],\n                    hour: this._prependZero(date.getHours() + ''),\n                    minute: this._prependZero(date.getMinutes() + '')\n                };\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Md2Datepicker.prototype.onClick = function (event) {\n        if (this.disabled) {\n            event.stopPropagation();\n            event.preventDefault();\n            return;\n        }\n    };\n    Md2Datepicker.prototype.onKeyDown = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        if (this.isDatepickerVisible) {\n            event.preventDefault();\n            event.stopPropagation();\n            switch (event.keyCode) {\n                case exports.KeyCodes.TAB:\n                case exports.KeyCodes.ESCAPE:\n                    this.onBlur();\n                    break;\n            }\n            var displayDate = this.displayDate;\n            if (this.isYearsVisible) {\n                switch (event.keyCode) {\n                    case exports.KeyCodes.ENTER:\n                    case exports.KeyCodes.SPACE:\n                        this.onClickOk();\n                        break;\n                    case exports.KeyCodes.DOWN_ARROW:\n                        if (this.displayDate.getFullYear() === (this.today.getFullYear() + 100))\n                            break;\n                        this.displayDate = this.dateUtil.incrementYears(displayDate, 1);\n                        this._scrollToSelectedYear();\n                        break;\n                    case exports.KeyCodes.UP_ARROW:\n                        if (this.displayDate.getFullYear() === 1900)\n                            break;\n                        this.displayDate = this.dateUtil.incrementYears(displayDate, -1);\n                        this._scrollToSelectedYear();\n                        break;\n                }\n            }\n            else if (this.isCalendarVisible) {\n                switch (event.keyCode) {\n                    case exports.KeyCodes.ENTER:\n                    case exports.KeyCodes.SPACE:\n                        this.setDate(this.displayDate);\n                        break;\n                    case exports.KeyCodes.RIGHT_ARROW:\n                        this.displayDate = this.dateUtil.incrementDays(displayDate, 1);\n                        break;\n                    case exports.KeyCodes.LEFT_ARROW:\n                        this.displayDate = this.dateUtil.incrementDays(displayDate, -1);\n                        break;\n                    case exports.KeyCodes.PAGE_DOWN:\n                        this.displayDate = this.dateUtil.incrementMonths(displayDate, 1);\n                        break;\n                    case exports.KeyCodes.PAGE_UP:\n                        this.displayDate = this.dateUtil.incrementMonths(displayDate, -1);\n                        break;\n                    case exports.KeyCodes.DOWN_ARROW:\n                        this.displayDate = this.dateUtil.incrementDays(displayDate, 7);\n                        break;\n                    case exports.KeyCodes.UP_ARROW:\n                        this.displayDate = this.dateUtil.incrementDays(displayDate, -7);\n                        break;\n                    case exports.KeyCodes.HOME:\n                        this.displayDate = this.dateUtil.getFirstDateOfMonth(displayDate);\n                        break;\n                    case exports.KeyCodes.END:\n                        this.displayDate = this.dateUtil.getLastDateOfMonth(displayDate);\n                        break;\n                }\n                if (!this.dateUtil.isSameMonthAndYear(displayDate, this.displayDate)) {\n                    this.generateCalendar();\n                }\n            }\n            else if (this.isHoursVisible) {\n                switch (event.keyCode) {\n                    case exports.KeyCodes.ENTER:\n                    case exports.KeyCodes.SPACE:\n                        this.setHour(this.displayDate.getHours());\n                        break;\n                    case exports.KeyCodes.UP_ARROW:\n                        this.displayDate = this.dateUtil.incrementHours(displayDate, 1);\n                        this._resetClock();\n                        break;\n                    case exports.KeyCodes.DOWN_ARROW:\n                        this.displayDate = this.dateUtil.incrementHours(displayDate, -1);\n                        this._resetClock();\n                        break;\n                }\n            }\n            else {\n                switch (event.keyCode) {\n                    case exports.KeyCodes.ENTER:\n                    case exports.KeyCodes.SPACE:\n                        this.setMinute(this.displayDate.getMinutes());\n                        break;\n                    case exports.KeyCodes.UP_ARROW:\n                        this.displayDate = this.dateUtil.incrementMinutes(displayDate, 1);\n                        this._resetClock();\n                        break;\n                    case exports.KeyCodes.DOWN_ARROW:\n                        this.displayDate = this.dateUtil.incrementMinutes(displayDate, -1);\n                        this._resetClock();\n                        break;\n                }\n            }\n        }\n        else {\n            switch (event.keyCode) {\n                case exports.KeyCodes.ENTER:\n                case exports.KeyCodes.SPACE:\n                    event.preventDefault();\n                    event.stopPropagation();\n                    this.showDatepicker();\n                    break;\n            }\n        }\n    };\n    Md2Datepicker.prototype.onBlur = function () {\n        this.isDatepickerVisible = false;\n        this.isYearsVisible = false;\n        this.isCalendarVisible = this.type !== 'time' ? true : false;\n        this.isHoursVisible = true;\n    };\n    /**\n     * Display Years\n     */\n    Md2Datepicker.prototype.showYear = function () {\n        this.isYearsVisible = true;\n        this.isCalendarVisible = true;\n        this._scrollToSelectedYear();\n    };\n    Md2Datepicker.prototype.getYears = function () {\n        var startYear = this._minDate ? this._minDate.getFullYear() : 1900, endYear = this._maxDate ? this._maxDate.getFullYear() : this.today.getFullYear() + 100;\n        this.years = [];\n        for (var i = startYear; i <= endYear; i++) {\n            this.years.push(i);\n        }\n    };\n    Md2Datepicker.prototype._scrollToSelectedYear = function () {\n        var _this = this;\n        setTimeout(function () {\n            var yearContainer = _this.element.nativeElement.querySelector('.md2-years'), selectedYear = _this.element.nativeElement.querySelector('.md2-year.selected');\n            yearContainer.scrollTop = (selectedYear.offsetTop + 20) - yearContainer.clientHeight / 2;\n        }, 0);\n    };\n    /**\n     * select year\n     * @param year\n     */\n    Md2Datepicker.prototype.setYear = function (year) {\n        var date = this.displayDate;\n        this.displayDate = new Date(year, date.getMonth(), date.getDate(), date.getHours(), date.getMinutes());\n        this.generateCalendar();\n        this.isYearsVisible = false;\n        //this.isCalendarVisible = true;\n    };\n    /**\n     * Display Datepicker\n     */\n    Md2Datepicker.prototype.showDatepicker = function () {\n        if (this.disabled || this.readonly) {\n            return;\n        }\n        this.isDatepickerVisible = true;\n        this.selectedDate = this.value || new Date(1, 0, 1);\n        this.displayDate = this.value || this.today;\n        this.generateCalendar();\n        this._resetClock();\n        this.element.nativeElement.focus();\n    };\n    /**\n     * Display Calendar\n     */\n    Md2Datepicker.prototype.showCalendar = function () {\n        this.isYearsVisible = false;\n        this.isCalendarVisible = true;\n    };\n    /**\n     * Toggle Hour visiblity\n     */\n    Md2Datepicker.prototype.toggleHours = function (value) {\n        this.isYearsVisible = false;\n        this.isCalendarVisible = false;\n        this.isYearsVisible = false;\n        this.isHoursVisible = value;\n        this._resetClock();\n    };\n    /**\n     * Ok Button Event\n     */\n    Md2Datepicker.prototype.onClickOk = function () {\n        if (this.isYearsVisible) {\n            this.generateCalendar();\n            this.isYearsVisible = false;\n            this.isCalendarVisible = true;\n        }\n        else if (this.isCalendarVisible) {\n            this.setDate(this.displayDate);\n        }\n        else if (this.isHoursVisible) {\n            this.isHoursVisible = false;\n            this._resetClock();\n        }\n        else {\n            this.value = this.displayDate;\n            this.onBlur();\n        }\n    };\n    /**\n     * Date Selection Event\n     * @param event Event Object\n     * @param date Date Object\n     */\n    Md2Datepicker.prototype.onClickDate = function (event, date) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (date.disabled) {\n            return;\n        }\n        if (date.calMonth === this.prevMonth) {\n            this.updateMonth(-1);\n        }\n        else if (date.calMonth === this.currMonth) {\n            this.setDate(new Date(date.dateObj.year, date.dateObj.month, date.dateObj.day, this.displayDate.getHours(), this.displayDate.getMinutes()));\n        }\n        else if (date.calMonth === this.nextMonth) {\n            this.updateMonth(1);\n        }\n    };\n    /**\n     * Set Date\n     * @param date Date Object\n     */\n    Md2Datepicker.prototype.setDate = function (date) {\n        if (this.type === 'date') {\n            this.value = date;\n            this.onBlur();\n        }\n        else {\n            this.selectedDate = date;\n            this.displayDate = date;\n            this.isCalendarVisible = false;\n            this.isHoursVisible = true;\n            this._resetClock();\n        }\n    };\n    /**\n     * Update Month\n     * @param noOfMonths increment number of months\n     */\n    Md2Datepicker.prototype.updateMonth = function (noOfMonths) {\n        this.displayDate = this.dateUtil.incrementMonths(this.displayDate, noOfMonths);\n        this.generateCalendar();\n    };\n    /**\n     * Check is Before month enabled or not\n     * @return boolean\n     */\n    Md2Datepicker.prototype.isBeforeMonth = function () {\n        return !this._minDate ? true : this._minDate && this.dateUtil.getMonthDistance(this.displayDate, this._minDate) < 0;\n    };\n    /**\n     * Check is After month enabled or not\n     * @return boolean\n     */\n    Md2Datepicker.prototype.isAfterMonth = function () {\n        return !this._maxDate ? true : this._maxDate && this.dateUtil.getMonthDistance(this.displayDate, this._maxDate) > 0;\n    };\n    /**\n     * Check the date is enabled or not\n     * @param date Date Object\n     * @return boolean\n     */\n    Md2Datepicker.prototype._isDisabledDate = function (date) {\n        if (this._minDate && this._maxDate) {\n            return (this._minDate > date) || (this._maxDate < date);\n        }\n        else if (this._minDate) {\n            return (this._minDate > date);\n        }\n        else if (this._maxDate) {\n            return (this._maxDate < date);\n        }\n        else {\n            return false;\n        }\n        //if (this.disableWeekends) {\n        //  let dayNbr = this.getDayNumber(date);\n        //  if (dayNbr === 0 || dayNbr === 6) {\n        //    return true;\n        //  }\n        //}\n        //return false;\n    };\n    /**\n     * Generate Month Calendar\n     */\n    Md2Datepicker.prototype.generateCalendar = function () {\n        var year = this.displayDate.getFullYear();\n        var month = this.displayDate.getMonth();\n        this.dates.length = 0;\n        var firstDayOfMonth = this.dateUtil.getFirstDateOfMonth(this.displayDate);\n        var numberOfDaysInMonth = this.dateUtil.getNumberOfDaysInMonth(this.displayDate);\n        var numberOfDaysInPrevMonth = this.dateUtil.getNumberOfDaysInMonth(this.dateUtil.incrementMonths(this.displayDate, -1));\n        var dayNbr = 1;\n        var calMonth = this.prevMonth;\n        for (var i = 1; i < 7; i++) {\n            var week = [];\n            if (i === 1) {\n                var prevMonth = numberOfDaysInPrevMonth - firstDayOfMonth.getDay() + 1;\n                for (var j = prevMonth; j <= numberOfDaysInPrevMonth; j++) {\n                    var iDate = { year: year, month: month - 1, day: j, hour: 0, minute: 0 };\n                    var date = new Date(year, month - 1, j);\n                    week.push({\n                        date: date,\n                        dateObj: iDate,\n                        calMonth: calMonth,\n                        today: this.dateUtil.isSameDay(this.today, date),\n                        disabled: this._isDisabledDate(date)\n                    });\n                }\n                calMonth = this.currMonth;\n                var daysLeft = 7 - week.length;\n                for (var j = 0; j < daysLeft; j++) {\n                    var iDate = { year: year, month: month, day: dayNbr, hour: 0, minute: 0 };\n                    var date = new Date(year, month, dayNbr);\n                    week.push({\n                        date: date,\n                        dateObj: iDate,\n                        calMonth: calMonth,\n                        today: this.dateUtil.isSameDay(this.today, date),\n                        disabled: this._isDisabledDate(date)\n                    });\n                    dayNbr++;\n                }\n            }\n            else {\n                for (var j = 1; j < 8; j++) {\n                    if (dayNbr > numberOfDaysInMonth) {\n                        dayNbr = 1;\n                        calMonth = this.nextMonth;\n                    }\n                    var iDate = { year: year, month: calMonth === this.currMonth ? month : month + 1, day: dayNbr, hour: 0, minute: 0 };\n                    var date = new Date(year, iDate.month, dayNbr);\n                    week.push({\n                        date: date,\n                        dateObj: iDate,\n                        calMonth: calMonth,\n                        today: this.dateUtil.isSameDay(this.today, date),\n                        disabled: this._isDisabledDate(date)\n                    });\n                    dayNbr++;\n                }\n            }\n            this.dates.push(week);\n        }\n    };\n    /**\n     * Select Hour\n     * @param event Event Object\n     * @param hour number of hours\n     */\n    Md2Datepicker.prototype.onClickHour = function (event, hour) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.setHour(hour);\n    };\n    /**\n     * Select Minute\n     * @param event Event Object\n     * @param minute number of minutes\n     */\n    Md2Datepicker.prototype.onClickMinute = function (event, minute) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.setMinute(minute);\n    };\n    /**\n     * Set hours\n     * @param hour number of hours\n     */\n    Md2Datepicker.prototype.setHour = function (hour) {\n        var date = this.displayDate;\n        this.isHoursVisible = false;\n        this.displayDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), hour, date.getMinutes());\n        this._resetClock();\n    };\n    /**\n     * Set minutes\n     * @param minute number of minutes\n     */\n    Md2Datepicker.prototype.setMinute = function (minute) {\n        var date = this.displayDate;\n        this.displayDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), minute);\n        this.selectedDate = this.displayDate;\n        this.value = this.selectedDate;\n        this.onBlur();\n    };\n    //private onMouseDownClock(event: MouseEvent) {\n    //  document.addEventListener('mousemove', this.mouseMoveListener);\n    //  document.addEventListener('mouseup', this.mouseUpListener);\n    //  //let offset = this.offset(event.currentTarget)\n    //  //this.clock.x = offset.left + this.clock.dialRadius;\n    //  //this.clock.y = offset.top + this.clock.dialRadius;\n    //  //this.clock.dx = event.pageX - this.clock.x;\n    //  //this.clock.dy = event.pageY - this.clock.y;\n    //  //let z = Math.sqrt(this.clock.dx * this.clock.dx + this.clock.dy * this.clock.dy);\n    //  //if (z < this.clock.outerRadius - this.clock.tickRadius || z > this.clock.outerRadius + this.clock.tickRadius) { return; }\n    //  //event.preventDefault();\n    //  //this.setClockHand(this.clock.dx, this.clock.dy);\n    //  ////this.onMouseMoveClock = this.onMouseMoveClock.bind(this);\n    //  ////this.onMouseUpClock = this.onMouseUpClock.bind(this);\n    //  //document.addEventListener('mousemove', this.onMouseMoveClock);\n    //  //document.addEventListener('mouseup', this.onMouseUpClock);\n    //}\n    //onMouseMoveClock(event: MouseEvent) {\n    //  event.preventDefault();\n    //  event.stopPropagation();\n    //  let x = event.pageX - this.clock.x,\n    //    y = event.pageY - this.clock.y;\n    //  this.clock.moved = true;\n    //  this._setClockHand(x, y);//, false, true\n    //  //if (!moved && x === dx && y === dy) {\n    //  //  // Clicking in chrome on windows will trigger a mousemove event\n    //  //  return;\n    //  //}\n    //}\n    //onMouseUpClock(event: MouseEvent) {\n    //  event.preventDefault();\n    //  document.removeEventListener('mousemove', this.mouseMoveListener);\n    //  document.removeEventListener('mouseup', this.mouseUpListener);\n    //  //let space = false;\n    //  let x = event.pageX - this.clock.x,\n    //    y = event.pageY - this.clock.y;\n    //  if ((space || this.clockEvent.moved) && x === this.clockEvent.dx && y === this.clockEvent.dy) {\n    //    this.setClockHand(x, y);\n    //  }\n    //  //if (this.isHoursVisible) {\n    //  //  //self.toggleView('minutes', duration / 2);\n    //  //} else {\n    //  //  //if (options.autoclose) {\n    //  //  //  self.minutesView.addClass('clockpicker-dial-out');\n    //  //  //  setTimeout(function () {\n    //  //  //    self.done();\n    //  //  //  }, duration / 2);\n    //  //  //}\n    //  //}\n    //  if ((space || moved) && x === dx && y === dy) {\n    //    self.setHand(x, y);\n    //  }\n    //  if (self.currentView === 'hours') {\n    //    self.toggleView('minutes', duration / 2);\n    //  } else {\n    //    if (options.autoclose) {\n    //      self.minutesView.addClass('clockpicker-dial-out');\n    //      setTimeout(function () {\n    //        self.done();\n    //      }, duration / 2);\n    //    }\n    //  }\n    //  plate.prepend(canvas);\n    //  // Reset cursor style of body\n    //  clearTimeout(movingTimer);\n    //  $body.removeClass('clockpicker-moving');\n    //}\n    /**\n     * reser clock hands\n     */\n    Md2Datepicker.prototype._resetClock = function () {\n        var hour = this.displayDate.getHours();\n        var minute = this.displayDate.getMinutes();\n        var value = this.isHoursVisible ? hour : minute, unit = Math.PI / (this.isHoursVisible ? 6 : 30), radian = value * unit, radius = this.isHoursVisible && value > 0 && value < 13 ? this.clock.innerRadius : this.clock.outerRadius, x = Math.sin(radian) * radius, y = -Math.cos(radian) * radius;\n        this._setClockHand(x, y);\n    };\n    /**\n     * set clock hand\n     * @param x number of x position\n     * @param y number of y position\n     */\n    Md2Datepicker.prototype._setClockHand = function (x, y) {\n        var radian = Math.atan2(x, y), unit = Math.PI / (this.isHoursVisible ? 6 : 30), z = Math.sqrt(x * x + y * y), inner = this.isHoursVisible && z < (this.clock.outerRadius + this.clock.innerRadius) / 2, radius = inner ? this.clock.innerRadius : this.clock.outerRadius, value = 0;\n        if (radian < 0) {\n            radian = Math.PI * 2 + radian;\n        }\n        value = Math.round(radian / unit);\n        radian = value * unit;\n        if (this.isHoursVisible) {\n            if (value === 12) {\n                value = 0;\n            }\n            value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n        }\n        else {\n            if (value === 60) {\n                value = 0;\n            }\n        }\n        this.clock.hand = {\n            x: Math.sin(radian) * radius,\n            y: Math.cos(radian) * radius\n        };\n    };\n    /**\n     * render Click\n     */\n    Md2Datepicker.prototype.generateClock = function () {\n        this.hours.length = 0;\n        for (var i = 0; i < 24; i++) {\n            var radian = i / 6 * Math.PI;\n            var inner = i > 0 && i < 13, radius = inner ? this.clock.innerRadius : this.clock.outerRadius;\n            this.hours.push({\n                hour: i === 0 ? '00' : i,\n                top: this.clock.dialRadius - Math.cos(radian) * radius - this.clock.tickRadius,\n                left: this.clock.dialRadius + Math.sin(radian) * radius - this.clock.tickRadius\n            });\n        }\n        for (var i = 0; i < 60; i += 5) {\n            var radian = i / 30 * Math.PI;\n            this.minutes.push({\n                minute: i === 0 ? '00' : i,\n                top: this.clock.dialRadius - Math.cos(radian) * this.clock.outerRadius - this.clock.tickRadius,\n                left: this.clock.dialRadius + Math.sin(radian) * this.clock.outerRadius - this.clock.tickRadius\n            });\n        }\n    };\n    /**\n     * format date\n     * @param date Date Object\n     * @return string with formatted date\n     */\n    Md2Datepicker.prototype._formatDate = function (date) {\n        return this.format\n            .replace('YYYY', date.getFullYear() + '')\n            .replace('MM', this._prependZero((date.getMonth() + 1) + ''))\n            .replace('DD', this._prependZero(date.getDate() + ''))\n            .replace('HH', this._prependZero(date.getHours() + ''))\n            .replace('mm', this._prependZero(date.getMinutes() + ''))\n            .replace('ss', this._prependZero(date.getSeconds() + ''));\n    };\n    /**\n     * Prepend Zero\n     * @param value String value\n     * @return string with prepend Zero\n     */\n    Md2Datepicker.prototype._prependZero = function (value) {\n        return parseInt(value) < 10 ? '0' + value : value;\n    };\n    /**\n     * Get Offset\n     * @param element HtmlElement\n     * @return top, left offset from page\n     */\n    Md2Datepicker.prototype._offset = function (element) {\n        var top = 0, left = 0;\n        do {\n            top += element.offsetTop || 0;\n            left += element.offsetLeft || 0;\n            element = element.offsetParent;\n        } while (element);\n        return {\n            top: top,\n            left: left\n        };\n    };\n    Md2Datepicker.prototype.writeValue = function (value) {\n        if (value && value !== this._value) {\n            if (this.dateUtil.isValidDate(value)) {\n                this._value = value;\n            }\n            else {\n                if (this.type === 'time') {\n                    this._value = new Date('1-1-1 ' + value);\n                }\n                else {\n                    this._value = new Date(value);\n                }\n            }\n            this.displayInputDate = this._formatDate(this._value);\n            var date = '';\n            if (this.type !== 'time') {\n                date += this._value.getFullYear() + '-' + (this._value.getMonth() + 1) + '-' + this._value.getDate();\n            }\n            if (this.type === 'datetime') {\n                date += ' ';\n            }\n            if (this.type !== 'date') {\n                date += this._value.getHours() + ':' + this._value.getMinutes();\n            }\n        }\n    };\n    Md2Datepicker.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };\n    Md2Datepicker.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };\n    __decorate$27([\n        _angular_core.Output(), \n        __metadata$27('design:type', _angular_core.EventEmitter)\n    ], Md2Datepicker.prototype, \"change\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], Md2Datepicker.prototype, \"type\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], Md2Datepicker.prototype, \"name\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], Md2Datepicker.prototype, \"id\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], Md2Datepicker.prototype, \"class\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], Md2Datepicker.prototype, \"placeholder\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String)\n    ], Md2Datepicker.prototype, \"format\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Number)\n    ], Md2Datepicker.prototype, \"tabindex\", void 0);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], Md2Datepicker.prototype, \"readonly\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], Md2Datepicker.prototype, \"required\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Boolean)\n    ], Md2Datepicker.prototype, \"disabled\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String), \n        __metadata$27('design:paramtypes', [String])\n    ], Md2Datepicker.prototype, \"min\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', String), \n        __metadata$27('design:paramtypes', [String])\n    ], Md2Datepicker.prototype, \"max\", null);\n    __decorate$27([\n        _angular_core.Input(), \n        __metadata$27('design:type', Object)\n    ], Md2Datepicker.prototype, \"value\", null);\n    __decorate$27([\n        _angular_core.HostListener('click', ['$event']), \n        __metadata$27('design:type', Function), \n        __metadata$27('design:paramtypes', [MouseEvent]), \n        __metadata$27('design:returntype', void 0)\n    ], Md2Datepicker.prototype, \"onClick\", null);\n    __decorate$27([\n        _angular_core.HostListener('keydown', ['$event']), \n        __metadata$27('design:type', Function), \n        __metadata$27('design:paramtypes', [KeyboardEvent]), \n        __metadata$27('design:returntype', void 0)\n    ], Md2Datepicker.prototype, \"onKeyDown\", null);\n    __decorate$27([\n        _angular_core.HostListener('blur'), \n        __metadata$27('design:type', Function), \n        __metadata$27('design:paramtypes', []), \n        __metadata$27('design:returntype', void 0)\n    ], Md2Datepicker.prototype, \"onBlur\", null);\n    Md2Datepicker = __decorate$27([\n        _angular_core.Component({selector: 'md2-datepicker',\n            template: \"<div class=\\\"md2-datepicker-input-container\\\" (click)=\\\"showDatepicker()\\\"> <div class=\\\"md2-datepicker-calendar-icon\\\"> <svg *ngIf=\\\"type==='date'\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"> <path d=\\\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\\\"></path> </svg> <svg *ngIf=\\\"type==='time'\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"> <path d=\\\"M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z\\\"></path> </svg> <svg *ngIf=\\\"type==='datetime'\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"> <path d=\\\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\\\"></path> </svg> </div> <div class=\\\"md2-datepicker-input\\\"> <span class=\\\"md2-datepicker-placeholder\\\" [class.has-value]=\\\"value\\\"> {{placeholder}} <span class=\\\"md2-placeholder-required\\\" *ngIf=\\\"required\\\">*</span> </span> <span class=\\\"md2-datepicker-input-text\\\">{{displayInputDate}}</span> <svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"> <path d=\\\"M7 10l5 5 5-5z\\\" /> </svg> </div> </div> <div class=\\\"md2-datepicker-wrapper\\\" [class.active]=\\\"isDatepickerVisible\\\"> <div class=\\\"md2-datepicker-header\\\"> <span class=\\\"md2-datepicker-year\\\" [class.active]=\\\"isYearsVisible\\\" [class.hidden]=\\\"type==='time'\\\" (click)=\\\"showYear()\\\">{{displayDay.year}}</span> <span class=\\\"md2-datepicker-date\\\" [class.active]=\\\"isCalendarVisible && !isYearsVisible\\\" [class.hidden]=\\\"type==='time'\\\" (click)=\\\"showCalendar()\\\">{{displayDay.day.substr(0, 3)}},&nbsp;{{displayDay.month.substr(0, 3)}}&nbsp;{{displayDay.date}}</span> <span class=\\\"md2-datepicker-time\\\" [class.active]=\\\"!isCalendarVisible\\\" [class.hidden]=\\\"type==='date'\\\"> <span class=\\\"md2-datepicker-hour\\\" [class.active]=\\\"isHoursVisible\\\" (click)=\\\"toggleHours(true)\\\">{{displayDay.hour}}</span>:<span class=\\\"md2-datepicker-minute\\\" [class.active]=\\\"!isHoursVisible\\\" (click)=\\\"toggleHours(false)\\\">{{displayDay.minute}}</span> </span> </div> <div class=\\\"md2-datepicker-body\\\"> <div class=\\\"md2-years\\\" [class.active]=\\\"isYearsVisible\\\"> <div class=\\\"md2-years-wrapper\\\"> <div *ngFor=\\\"let y of years\\\" class=\\\"md2-year\\\" [class.selected]=\\\"y === displayDay.year\\\" (click)=\\\"setYear(y)\\\">{{y}}</div> </div> </div> <div class=\\\"md2-datepicker-container\\\" [class.active]=\\\"!isYearsVisible\\\"> <div class=\\\"md2-calendar\\\" [class.active]=\\\"isCalendarVisible\\\"> <div class=\\\"md2-calendar-controls\\\"> <div class=\\\"md2-calendar-prev-month\\\" [class.disabled]=\\\"!isBeforeMonth()\\\" (click)=\\\"isBeforeMonth() && updateMonth(-1)\\\"> <svg viewBox=\\\"0 0 24 24\\\" width=\\\"24\\\" height=\\\"24\\\"> <path d=\\\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\\\"></path> </svg> </div> <div class=\\\"md2-calendar-next-month\\\" [class.disabled]=\\\"!isAfterMonth()\\\" (click)=\\\"isAfterMonth() && updateMonth(1)\\\"> <svg viewBox=\\\"0 0 24 24\\\" width=\\\"24\\\" height=\\\"24\\\"> <path d=\\\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\\\"></path> </svg> </div> <div class=\\\"md2-calendar-header\\\">{{displayDay.month}} {{displayDay.year}}</div> </div> <table class=\\\"md2-calendar-month\\\"> <thead><tr><th *ngFor=\\\"let d of days\\\">{{d.substr(0, 1)}}</th></tr></thead> <tbody> <tr *ngFor=\\\"let w of dates\\\"> <td *ngFor=\\\"let d of w\\\"> <div class=\\\"md2-calendar-day\\\" [class.today]=\\\"d.today\\\" [class.focus]=\\\"dateUtil.isSameDay(displayDate, d.date)\\\" [class.selected]=\\\"dateUtil.isSameDay(selectedDate, d.date)\\\" [class.disabled]=\\\"d.disabled\\\" [class.prev-month]=\\\"d.calMonth===prevMonth\\\" [class.curr-month]=\\\"d.calMonth===currMonth\\\" [class.next-month]=\\\"d.calMonth===nextMonth\\\" (click)=\\\"onClickDate($event,d)\\\">{{d.dateObj.day}}</div> </td> </tr> </tbody> </table> </div> <div class=\\\"md2-clock\\\" [class.active]=\\\"!isCalendarVisible\\\"> <!-- (mousedown)=\\\"onMouseDownClock($event)\\\"--> <div class=\\\"md2-clock-hand\\\"> <svg class=\\\"md2-clock-svg\\\" width=\\\"240\\\" height=\\\"240\\\"> <g transform=\\\"translate(120,120)\\\"> <line x1=\\\"0\\\" y1=\\\"0\\\" [attr.x2]=\\\"clock.hand.x\\\" [attr.y2]=\\\"clock.hand.y\\\"></line> <circle class=\\\"md2-clock-bg\\\" r=\\\"17\\\" [attr.cx]=\\\"clock.hand.x\\\" [attr.cy]=\\\"clock.hand.y\\\"></circle> <circle class=\\\"md2-clock-fg\\\" r=\\\"3.5\\\" [attr.cx]=\\\"clock.hand.x\\\" [attr.cy]=\\\"clock.hand.y\\\"></circle> <circle class=\\\"md2-clock-center\\\" cx=\\\"0\\\" cy=\\\"0\\\" r=\\\"2\\\"></circle> </g> </svg> </div> <div class=\\\"md2-clock-hours\\\" [class.active]=\\\"isHoursVisible\\\"> <div *ngFor=\\\"let h of hours\\\" class=\\\"md2-clock-hour\\\" [style.top]=\\\"h.top + 'px'\\\" [style.left]=\\\"h.left + 'px'\\\" (click)=\\\"onClickHour($event,h.hour)\\\">{{h.hour}}</div> </div> <div class=\\\"md2-clock-minutes\\\" [class.active]=\\\"!isHoursVisible\\\"> <div *ngFor=\\\"let m of minutes\\\" class=\\\"md2-clock-minute\\\" [style.top]=\\\"m.top + 'px'\\\" [style.left]=\\\"m.left + 'px'\\\" (click)=\\\"onClickMinute($event,m.minute)\\\">{{m.minute}}</div> </div> </div> </div> </div> <div class=\\\"md2-datepicker-footer\\\"> <div class=\\\"md2-button\\\" (click)=\\\"onBlur()\\\">Cancel</div> <div class=\\\"md2-button\\\" (click)=\\\"onClickOk()\\\">Ok</div> </div> </div> \",\n            styles: [\"md2-datepicker { position: relative; display: block; max-width: 200px; outline: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } md2-datepicker.md2-datepicker-disabled { pointer-events: none; cursor: default; } .md2-datepicker-input-container { display: block; padding: 18px 0 18px 32px; white-space: nowrap; cursor: pointer; } .md2-datepicker-calendar-icon { position: absolute; top: 21px; left: 0; display: block; height: 24px; width: 24px; vertical-align: middle; fill: currentColor; color: rgba(0, 0, 0, 0.54); } .md2-datepicker-input { position: relative; display: block; height: 30px; padding: 2px 26px 1px 2px; margin: 0; line-height: 26px; color: rgba(0, 0, 0, 0.87); vertical-align: middle; box-sizing: border-box; border-bottom: 1px solid rgba(0, 0, 0, 0.12); } .md2-datepicker-input svg { position: absolute; right: 0; top: 2px; fill: currentColor; color: rgba(0, 0, 0, 0.54); } md2-datepicker.md2-datepicker-disabled .md2-datepicker-input { color: rgba(0, 0, 0, 0.38); border-color: transparent; background-image: linear-gradient(to right, rgba(0, 0, 0, 0.38) 0%, rgba(0, 0, 0, 0.38) 33%, transparent 0%); background-position: bottom -1px left 0; background-size: 4px 1px; background-repeat: repeat-x; } .md2-datepicker-placeholder { position: absolute; right: 26px; bottom: 100%; left: 0; color: rgba(0, 0, 0, 0.38); max-width: 100%; padding-left: 3px; padding-right: 0; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; z-index: 1; transform: translate3d(0, 26px, 0) scale(1); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); transform-origin: left top; } .md2-datepicker-placeholder.has-value, md2-datepicker:focus .md2-datepicker-placeholder { transform: translate3d(0, 6px, 0) scale(0.75); } md2-datepicker:focus .md2-datepicker-placeholder { color: #2196f3; } md2-datepicker:focus .md2-datepicker-placeholder .md2-placeholder-required { color: #f00; } md2-datepicker.md2-datepicker-disabled:focus .md2-datepicker-placeholder, md2-datepicker.md2-datepicker-disabled:focus .md2-datepicker-placeholder .md2-placeholder-required { color: rgba(0, 0, 0, 0.38); } .md2-datepicker-input-text { display: block; font-size: 15px; line-height: 26px; } .md2-datepicker-wrapper { position: absolute; top: 0; left: 0; display: inline-block; width: 300px; border-radius: 2px; background-color: #fff; z-index: 10; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4); transform: scale(0); transform-origin: left top; transition: 150ms; -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .md2-datepicker-wrapper.active { transform: scale(1); } .md2-datepicker-header { display: block; padding: 20px; color: #fff; font-size: 28px; line-height: 28px; font-weight: 500; background: #2196f3; box-sizing: border-box; } .md2-datepicker-year { display: block; height: 16px; margin: 0 0 10px; font-size: 16px; line-height: 16px; opacity: 0.7; cursor: pointer; } .md2-datepicker-year.active { opacity: 1; pointer-events: none; } .md2-datepicker-year.hidden { display: none; } .md2-datepicker-date { cursor: pointer; opacity: 0.7; } .md2-datepicker-date.active { opacity: 1; pointer-events: none; } .md2-datepicker-date.hidden { display: none; } .md2-datepicker-time { display: inline-block; padding-left: 10px; cursor: pointer; opacity: 0.7; } .md2-datepicker-time.active { opacity: 1; } .md2-datepicker-time.hidden { display: none; } .md2-datepicker-hour, .md2-datepicker-minute { opacity: 1; } .md2-datepicker-time.active .md2-datepicker-hour, .md2-datepicker-time.active .md2-datepicker-minute { opacity: 0.7; } .md2-datepicker-time.active .md2-datepicker-hour.active, .md2-datepicker-time.active .md2-datepicker-minute.active { opacity: 1; pointer-events: none; } .md2-datepicker-body { position: relative; width: 100%; height: 300px; overflow: hidden; } .md2-datepicker-footer { text-align: right; } .md2-datepicker-footer .md2-button { display: inline-block; min-width: 64px; margin: 4px 8px 8px 0px; padding: 0 12px; font-size: 14px; color: #2196f3; line-height: 36px; text-align: center; text-transform: uppercase; border-radius: 2px; cursor: pointer; box-sizing: border-box; transition: all 450ms cubic-bezier(0.23, 1, 0.32, 1); } .md2-datepicker-footer .md2-button:hover { background: #ebebeb; } .md2-years { position: absolute; top: 10px; right: 100%; bottom: 10px; display: block; width: 100%; line-height: 40px; background: #fff; overflow-x: hidden; overflow-y: auto; transition: 300ms; } .md2-years.active { right: 0; } .md2-years .md2-years-wrapper { display: flex; flex-direction: column; justify-content: center; min-height: 100%; } .md2-years .md2-year { position: relative; display: block; margin: 0 auto; padding: 0; font-size: 17px; font-weight: 400; text-align: center; cursor: pointer; } .md2-years .md2-year.selected { color: #2196f3; font-size: 26px; font-weight: 500; } .md2-datepicker-container { position: absolute; top: 0; left: 100%; display: block; width: 100%; transition: 300ms; } .md2-datepicker-container.active { left: 0; } .md2-calendar { position: absolute; right: 100%; display: block; width: 100%; font-size: 12px; font-weight: 400; text-align: center; transition: 300ms; } .md2-calendar.active { right: 0; } .md2-calendar-controls { position: relative; display: block; height: 48px; text-align: left; } .md2-calendar-header { height: 48px; line-height: 48px; font-size: 14px; font-weight: 500; text-align: center; } .md2-calendar-prev-month, .md2-calendar-next-month { position: absolute; display: inline-block; width: 48px; height: 48px; padding: 12px; margin: 0 12px; box-sizing: border-box; cursor: pointer; } .md2-calendar-next-month { right: 0; } .md2-calendar-prev-month.disabled, .md2-calendar-next-month.disabled { opacity: 0.25; cursor: default; pointer-events: none; } .md2-calendar-month { margin: 0 20px; } .md2-calendar-month th { width: 35px; height: 20px; font-weight: 500; line-height: 15px; opacity: 0.5; } .md2-calendar-month td { padding: 0; } .md2-calendar-day { position: relative; display: inline-block; width: 35px; height: 35px; border-radius: 50%; text-align: center; cursor: pointer; line-height: 35px; box-sizing: border-box; } .md2-calendar-day.today { color: #2196f3; } .md2-calendar-day:hover, .md2-calendar-day.focus { background: #e0e0e0; } .md2-calendar-day.selected, .md2-calendar-day.selected:hover { color: #fff; background: #2196f3; } .md2-calendar-day.disabled, .md2-calendar-day.disabled:hover { color: rgba(0, 0, 0, 0.45); background: transparent; pointer-events: none; } .md2-calendar-day.prev-month, .md2-calendar-day.next-month { visibility: hidden; } .md2-clock { position: absolute; left: 100%; display: block; width: 240px; height: 240px; margin: 30px; font-size: 14px; font-weight: 400; text-align: center; background-color: #e0e0e0; border-radius: 50%; transition: 300ms; } .md2-clock.active { left: 0; } .md2-clock-hours, .md2-clock-minutes { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; visibility: hidden; transition: 350ms; transform: scale(1.2); } .md2-clock-minutes { transform: scale(0.8); } .md2-clock-hours.active, .md2-clock-minutes.active { opacity: 1; visibility: visible; transform: scale(1); } .md2-clock-hour, .md2-clock-minute { position: absolute; width: 34px; height: 34px; line-height: 34px; text-align: center; border-radius: 50%; cursor: pointer; } .md2-clock-hour:hover, .md2-clock-minute:hover { background: #5aaced; } .md2-clock-hand { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .md2-clock-hand line { stroke: #2196f3; stroke-width: 1; stroke-linecap: round; } .md2-clock-bg { fill: #5aaced; } .md2-clock-fg { stroke: none; fill: #2196f3; } .md2-clock-center { stroke: none; fill: #2196f3; } /*# sourceMappingURL=datepicker.css.map */ \"],\n            providers: [MD2_DATEPICKER_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'datepicker',\n                '[id]': 'id',\n                '[class]': 'class',\n                '[class.md2-datepicker-disabled]': 'disabled',\n                '[tabindex]': 'disabled ? -1 : tabindex',\n                '[attr.aria-disabled]': 'disabled'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$27('design:paramtypes', [Md2DateUtil, _angular_core.ElementRef])\n    ], Md2Datepicker);\n    return Md2Datepicker;\n}());\nvar MD2_DATEPICKER_DIRECTIVES = [Md2Datepicker];\nvar Md2DatepickerModule = (function () {\n    function Md2DatepickerModule() {\n    }\n    Md2DatepickerModule.forRoot = function () {\n        return {\n            ngModule: Md2DatepickerModule,\n            providers: [Md2DateUtil]\n        };\n    };\n    Md2DatepickerModule = __decorate$27([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule],\n            exports: MD2_DATEPICKER_DIRECTIVES,\n            declarations: MD2_DATEPICKER_DIRECTIVES,\n        }), \n        __metadata$27('design:paramtypes', [])\n    ], Md2DatepickerModule);\n    return Md2DatepickerModule;\n}());\n\n/**\n * Provide an API for animating elements with CSS transitions\n */\nvar Animate = (function () {\n    function Animate() {\n    }\n    Animate.enter = function (el, cssClass) {\n        el.classList.remove(cssClass);\n        return new Promise(function (resolve) {\n            el.classList.add(cssClass + '-add');\n            setTimeout(function () {\n                var duration = Animate.getTransitionDuration(el, true);\n                var removeListener = function () { return done(false); };\n                var callTimeout = setTimeout(function () { return done(true); }, duration);\n                var done = function (timeout) {\n                    if (!removeListener) {\n                        return;\n                    }\n                    el.classList.remove(cssClass + '-add-active');\n                    el.classList.remove(cssClass + '-add');\n                    if (!timeout) {\n                        clearTimeout(callTimeout);\n                    }\n                    el.removeEventListener(Animate.TRANSITION_EVENT, removeListener);\n                    removeListener = null;\n                    resolve();\n                };\n                el.addEventListener(Animate.TRANSITION_EVENT, removeListener);\n                el.classList.add(cssClass + '-add-active');\n                el.classList.add(cssClass);\n            }, 1);\n        });\n    };\n    Animate.leave = function (el, cssClass) {\n        return new Promise(function (resolve) {\n            el.classList.add(cssClass + '-remove');\n            setTimeout(function () {\n                var duration = Animate.getTransitionDuration(el, true);\n                var callTimeout = setTimeout(function () { return done(true); }, duration);\n                var removeListener = function () { return done(false); };\n                var done = function (timeout) {\n                    if (!removeListener) {\n                        return;\n                    }\n                    el.classList.remove(cssClass + '-remove-active');\n                    el.classList.remove(cssClass + '-remove');\n                    if (!timeout) {\n                        clearTimeout(callTimeout);\n                    }\n                    el.removeEventListener(Animate.TRANSITION_EVENT, removeListener);\n                    removeListener = null;\n                    resolve();\n                };\n                el.addEventListener(Animate.TRANSITION_EVENT, removeListener);\n                el.classList.add(cssClass + '-remove-active');\n                el.classList.remove(cssClass);\n            }, 1);\n        });\n    };\n    /**\n     * Get the duration of any transitions being applied to the given element.\n     *\n     * Based on: https://gist.github.com/snorpey/5323028\n     * @param element The element to query\n     * @param includeDelay Include any specified transition-delay value.\n     * @returns {number}\n     */\n    Animate.getTransitionDuration = function (element, includeDelay) {\n        if (includeDelay === void 0) { includeDelay = false; }\n        var prefixes = ['', 'moz', 'webkit', 'ms', 'o', 'khtml'];\n        var style = window.getComputedStyle(element);\n        for (var i = 0; i < prefixes.length; i++) {\n            var durationProperty = (i === 0 ? '' : \"-\" + prefixes[i] + \"-\") + \"transition-duration\";\n            var duration = style[durationProperty];\n            if (!duration) {\n                continue;\n            }\n            duration = (duration.indexOf('ms') > -1) ? parseFloat(duration) : parseFloat(duration) * 1000;\n            if (duration === 0) {\n                continue;\n            }\n            if (includeDelay) {\n                var delayProperty = (i === 0 ? '' : \"-\" + prefixes[i] + \"-\") + \"transition-delay\";\n                var delay = style[delayProperty];\n                if (typeof delay !== 'undefined') {\n                    duration += (delay.indexOf('ms') > -1) ? parseFloat(delay) : parseFloat(delay) * 1000;\n                }\n            }\n            return duration;\n        }\n        return -1;\n    };\n    Animate.setTransitionDuration = function (element, delayMs) {\n        //element.style['transition-duration'] = `${delayMs}ms`;\n    };\n    /* From Modernizr */\n    Animate.whichTransitionEvent = function () {\n        if (typeof document === 'undefined') {\n            return 'transitionend';\n        }\n        var t;\n        var el = document.createElement('fakeelement');\n        var transitions = {\n            'transition': 'transitionend',\n            'OTransition': 'oTransitionEnd',\n            'MozTransition': 'transitionend',\n            'WebkitTransition': 'webkitTransitionEnd'\n        };\n        for (t in transitions) {\n            if (el.style[t] !== undefined) {\n                return transitions[t];\n            }\n        }\n    };\n    /**\n     * Set CSS styles immediately by turning off transition duration and restoring it afterward\n     */\n    Animate.setStyles = function (element, styles) {\n        var saveDuration = Animate.getTransitionDuration(element);\n        Animate.setTransitionDuration(element, 0);\n        return new Promise(function (resolve, reject) {\n            Object.keys(styles).forEach(function (key) {\n                //element.style[key] = `${styles[key]}`;\n            });\n            if (saveDuration !== -1) {\n                Animate.setTransitionDuration(element, saveDuration);\n            }\n            else {\n            }\n            resolve();\n        });\n    };\n    /**\n     * Wait a period of time, then resolve a promise.\n     * @param milliseconds The period to wait before resolving.\n     * @returns {Promise<void>|Promise} A promise that resolves after a period of time.\n     */\n    Animate.wait = function (milliseconds) {\n        if (milliseconds === void 0) { milliseconds = 10; }\n        return new Promise(function (resolve) {\n            setTimeout(function () { return resolve(); }, milliseconds);\n        });\n    };\n    /**\n     * Look up the transition event name for the browser type and cache it.\n     */\n    Animate.TRANSITION_EVENT = Animate.whichTransitionEvent();\n    return Animate;\n}());\n\nvar __extends$5 = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate$29 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$29 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2DialogPortal = (function (_super) {\n    __extends$5(Md2DialogPortal, _super);\n    function Md2DialogPortal(templateRef, viewContainerRef) {\n        _super.call(this, templateRef, viewContainerRef);\n    }\n    Md2DialogPortal = __decorate$29([\n        _angular_core.Directive({ selector: '[md2DialogPortal]' }), \n        __metadata$29('design:paramtypes', [_angular_core.TemplateRef, _angular_core.ViewContainerRef])\n    ], Md2DialogPortal);\n    return Md2DialogPortal;\n}(TemplatePortal));\nvar Md2DialogTitle = (function () {\n    function Md2DialogTitle() {\n    }\n    Md2DialogTitle = __decorate$29([\n        _angular_core.Directive({ selector: 'md2-dialog-title' }), \n        __metadata$29('design:paramtypes', [])\n    ], Md2DialogTitle);\n    return Md2DialogTitle;\n}());\nvar Md2DialogFooter = (function () {\n    function Md2DialogFooter() {\n    }\n    Md2DialogFooter = __decorate$29([\n        _angular_core.Directive({ selector: 'md2-dialog-footer' }), \n        __metadata$29('design:paramtypes', [])\n    ], Md2DialogFooter);\n    return Md2DialogFooter;\n}());\nvar Md2Dialog = (function () {\n    function Md2Dialog(overlay) {\n        this.overlay = overlay;\n        this.onShow = new _angular_core.EventEmitter();\n        this.onClose = new _angular_core.EventEmitter();\n        this.onCancel = new _angular_core.EventEmitter();\n        /** Is the dialog active? */\n        this.isOpened = false;\n        /** Overlay configuration for positioning the dialog */\n        this.config = new OverlayState();\n        /** @internal */\n        this.overlayRef = null;\n    }\n    Md2Dialog.prototype.ngOnDestroy = function () {\n        return this.close();\n    };\n    /** Show the dialog */\n    Md2Dialog.prototype.show = function () {\n        return this.open();\n    };\n    /** Open the dialog */\n    Md2Dialog.prototype.open = function () {\n        var _this = this;\n        return this.close()\n            .then(function () { return _this.overlay.create(_this.config); })\n            .then(function (ref) {\n            _this.overlayRef = ref;\n            return ref.attach(_this.portal);\n        })\n            .then(function () { return Animate.wait(); })\n            .then(function () {\n            _this.isOpened = true;\n            _this.onShow.emit(_this);\n            return _this;\n        });\n    };\n    /** Close the dialog */\n    Md2Dialog.prototype.close = function (result, cancel) {\n        var _this = this;\n        if (result === void 0) { result = true; }\n        if (cancel === void 0) { cancel = false; }\n        if (!this.overlayRef) {\n            return Promise.resolve(this);\n        }\n        this.isOpened = false;\n        // TODO(jd): this is terrible, use animate states\n        return Animate.wait(100)\n            .then(function () { return _this.overlayRef.detach(); })\n            .then(function () {\n            _this.overlayRef.dispose();\n            _this.overlayRef = null;\n            if (cancel) {\n                _this.onCancel.emit(result);\n            }\n            else {\n                _this.onClose.emit(result);\n            }\n            return _this;\n        });\n    };\n    Md2Dialog.prototype.onDocumentKeypress = function (event) {\n        if (event.keyCode == 27) {\n            this.close();\n        }\n    };\n    __decorate$29([\n        _angular_core.Output(), \n        __metadata$29('design:type', _angular_core.EventEmitter)\n    ], Md2Dialog.prototype, \"onShow\", void 0);\n    __decorate$29([\n        _angular_core.Output(), \n        __metadata$29('design:type', _angular_core.EventEmitter)\n    ], Md2Dialog.prototype, \"onClose\", void 0);\n    __decorate$29([\n        _angular_core.Output(), \n        __metadata$29('design:type', _angular_core.EventEmitter)\n    ], Md2Dialog.prototype, \"onCancel\", void 0);\n    __decorate$29([\n        _angular_core.ViewChild(Md2DialogPortal), \n        __metadata$29('design:type', Md2DialogPortal)\n    ], Md2Dialog.prototype, \"portal\", void 0);\n    __decorate$29([\n        _angular_core.Input('title'), \n        __metadata$29('design:type', String)\n    ], Md2Dialog.prototype, \"dialogTitle\", void 0);\n    __decorate$29([\n        _angular_core.Input(), \n        __metadata$29('design:type', Object)\n    ], Md2Dialog.prototype, \"config\", void 0);\n    Md2Dialog = __decorate$29([\n        _angular_core.Component({selector: 'md2-dialog',\n            template: \"\\n    <template md2DialogPortal>\\n      <div class=\\\"md2-dialog\\\" [class.open]=\\\"isOpened\\\">\\n        <div class=\\\"md2-dialog-container\\\">\\n          <div class=\\\"md2-dialog-header\\\">\\n            <button type=\\\"button\\\" class=\\\"close\\\" aria-label=\\\"Close\\\" (click)=\\\"close()\\\">&times;</button>\\n            <h2 *ngIf=\\\"dialogTitle\\\" class=\\\"md2-dialog-title\\\" id=\\\"myDialogLabel\\\" [innerHtml]=\\\"dialogTitle\\\"></h2>\\n            <ng-content select=\\\"md2-dialog-title\\\"></ng-content>\\n          </div>\\n          <div class=\\\"md2-dialog-body\\\">\\n            <ng-content></ng-content>\\n          </div>\\n          <ng-content select=\\\"md2-dialog-footer\\\"></ng-content>\\n        </div>\\n      </div>\\n    </template>\\n  \",\n            styles: [\"\\n    .md2-dialog-open { overflow-y: hidden; }\\n    .md2-dialog { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; background-color: rgba(33, 33, 33, 0.48); display: none; overflow-x: hidden; overflow-y: scroll; -webkit-overflow-scrolling: touch; outline: 0; }\\n    .md2-dialog.open { display: block; }\\n    .md2-dialog .md2-dialog-container { position: relative; width: auto; margin: 15px; background-color: #fff; -webkit-background-clip: padding-box; -moz-background-clip: padding-box; background-clip: padding-box; border-radius: 0 0 4px 4px; outline: 0; -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); box-shadow: 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); -webkit-transition: .3s; -o-transition: .3s; -moz-transition: .3s; transition: .3s; -webkit-transform: scale(0.1); -ms-transform: scale(0.1); -o-transform: scale(0.1); -moz-transform: scale(0.1); transform: scale(0.1); }\\n    .md2-dialog.open .md2-dialog-container { -webkit-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); -moz-transform: scale(1); transform: scale(1); }\\n    @media (min-width: 768px) {\\n      .md2-dialog .md2-dialog-container { width: 600px; margin: 30px auto; }\\n    }\\n    .md2-dialog-header { background: #2196f3; color: #fff; font-size: 25px; line-height: 1.1; font-weight: 500; padding: 0 48px 0 16px; border-bottom: 1px solid #e5e5e5; word-wrap: break-word; }\\n    .md2-dialog-header .close { position: absolute; top: 21px; right: 16px; display: inline-block; width: 18px; height: 18px; overflow: hidden; -webkit-appearance: none; padding: 0; cursor: pointer; background: 0 0; border: 0; outline: 0; opacity: 0.8; font-size: 0; z-index: 1; min-width: initial; box-shadow: none; margin: 0; }\\n    .md2-dialog-header .close::before,\\n    .md2-dialog-header .close::after { content: ''; position: absolute; top: 50%; left: 0; height: 2px; width: 100%; margin-top: -1px;background: #ccc;border-radius: 2px;height: 2px;}\\n    .md2-dialog-header .close::before {-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);-ms-transform: rotate(45deg);-o-transform: rotate(45deg);transform: rotate(45deg);}\\n    .md2-dialog-header .close::after {-webkit-transform: rotate(-45deg);-moz-transform: rotate(-45deg);-ms-transform: rotate(-45deg);-o-transform: rotate(-45deg);transform: rotate(-45deg);}\\n    .md2-dialog-header .close:hover { opacity: 1; }\\n    .md2-dialog-header md2-dialog-title, .md2-dialog-header .md2-dialog-title { display: block; margin: 0; padding: 16px 0; font-size: 25px; font-weight: 500; }\\n    .md2-dialog-header dialog-header { line-height: 33px; }\\n    .md2-dialog-body { position: relative; padding: 16px; }\\n    .md2-dialog-footer, md2-dialog-footer { display: block; padding: 16px; text-align: right; border-top: 1px solid rgba(0,0,0,0.12); }\\n  \"],\n            host: {\n                'tabindex': '0',\n                '(body:keydown)': 'onDocumentKeypress($event)'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$29('design:paramtypes', [Overlay])\n    ], Md2Dialog);\n    return Md2Dialog;\n}());\nvar MD2_DIALOG_DIRECTIVES = [Md2Dialog, Md2DialogTitle, Md2DialogFooter, Md2DialogPortal];\nvar MD2_DIALOG_PROVIDERS = [Overlay, OVERLAY_PROVIDERS];\nvar Md2DialogModule = (function () {\n    function Md2DialogModule() {\n    }\n    Md2DialogModule.forRoot = function () {\n        return {\n            ngModule: Md2DialogModule,\n            providers: MD2_DIALOG_PROVIDERS\n        };\n    };\n    Md2DialogModule = __decorate$29([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_DIALOG_DIRECTIVES,\n            declarations: MD2_DIALOG_DIRECTIVES,\n        }), \n        __metadata$29('design:paramtypes', [])\n    ], Md2DialogModule);\n    return Md2DialogModule;\n}());\n\nvar __decorate$30 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$30 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$3 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar Md2MenuNotClosable = (function () {\n    function Md2MenuNotClosable(elementRef) {\n        this.elementRef = elementRef;\n    }\n    /**\n     * contains\n     * @param element\n     */\n    Md2MenuNotClosable.prototype.contains = function (element) {\n        var thisElement = this.elementRef.nativeElement;\n        return thisElement.contains(element);\n    };\n    Md2MenuNotClosable = __decorate$30([\n        _angular_core.Directive({ selector: '[md2-menu-not-closable]' }), \n        __metadata$30('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2MenuNotClosable);\n    return Md2MenuNotClosable;\n}());\nvar Md2Menu = (function () {\n    function Md2Menu(elementRef) {\n        this.elementRef = elementRef;\n        this.isVisible = false;\n    }\n    /**\n     * open menu\n     */\n    Md2Menu.prototype.open = function () { this.isVisible = true; };\n    /**\n     * close menu\n     */\n    Md2Menu.prototype.close = function () { this.isVisible = false; };\n    /**\n     * check closeble\n     * @param element\n     */\n    Md2Menu.prototype.isInClosableZone = function (element) {\n        if (!this.notClosable) {\n            return false;\n        }\n        return this.notClosable.contains(element);\n    };\n    __decorate$30([\n        _angular_core.ContentChild(Md2MenuNotClosable), \n        __metadata$30('design:type', Md2MenuNotClosable)\n    ], Md2Menu.prototype, \"notClosable\", void 0);\n    Md2Menu = __decorate$30([\n        _angular_core.Directive({\n            selector: '[md2-menu]',\n            host: {\n                'role': 'menu',\n                '[class.md2-menu]': 'true',\n                '[class.open]': 'isVisible'\n            }\n        }), \n        __metadata$30('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Menu);\n    return Md2Menu;\n}());\nvar Md2MenuOpen = (function () {\n    function Md2MenuOpen(menu, elementRef) {\n        var _this = this;\n        this.menu = menu;\n        this.elementRef = elementRef;\n        this.close = function (event) {\n            if (!_this.menu.isInClosableZone(event.target) &&\n                event.target !== _this.elementRef.nativeElement) {\n                _this.menu.close();\n                document.removeEventListener('click', _this.close);\n            }\n        };\n    }\n    Md2MenuOpen.prototype.open = function () {\n        this.menu.open();\n        document.addEventListener('click', this.close, true);\n    };\n    Md2MenuOpen.prototype.ngOnDestroy = function () {\n        document.removeEventListener('click', this.close);\n    };\n    __decorate$30([\n        _angular_core.HostListener('click'), \n        __metadata$30('design:type', Function), \n        __metadata$30('design:paramtypes', []), \n        __metadata$30('design:returntype', void 0)\n    ], Md2MenuOpen.prototype, \"open\", null);\n    Md2MenuOpen = __decorate$30([\n        _angular_core.Directive({ selector: '[md2-menu-open]' }),\n        __param$3(0, _angular_core.Host()), \n        __metadata$30('design:paramtypes', [Md2Menu, _angular_core.ElementRef])\n    ], Md2MenuOpen);\n    return Md2MenuOpen;\n}());\nvar MD2_MENU_DIRECTIVES = [Md2MenuNotClosable, Md2Menu, Md2MenuOpen];\nvar Md2MenuModule = (function () {\n    function Md2MenuModule() {\n    }\n    Md2MenuModule.forRoot = function () {\n        return {\n            ngModule: Md2MenuModule,\n            providers: []\n        };\n    };\n    Md2MenuModule = __decorate$30([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_MENU_DIRECTIVES,\n            declarations: MD2_MENU_DIRECTIVES,\n        }), \n        __metadata$30('design:paramtypes', [])\n    ], Md2MenuModule);\n    return Md2MenuModule;\n}());\n\nvar __decorate$31 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$31 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Option = (function () {\n    function Option(source, textKey, valueKey) {\n        if (typeof source === 'string') {\n            this.text = this.value = source;\n        }\n        if (typeof source === 'object') {\n            this.text = source[textKey];\n            this.value = valueKey ? source[valueKey] : source;\n        }\n    }\n    return Option;\n}());\nvar noop$4 = function () { };\nvar nextId$4 = 0;\nvar MD2_MULTISELECT_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Multiselect; }),\n    multi: true\n};\nvar Md2Multiselect = (function () {\n    function Md2Multiselect(element) {\n        this.element = element;\n        this.change = new _angular_core.EventEmitter();\n        this._value = '';\n        this._onTouchedCallback = noop$4;\n        this._onChangeCallback = noop$4;\n        this._options = [];\n        this.list = [];\n        this.items = [];\n        this.focusedOption = 0;\n        this.isFocused = false;\n        this.id = 'md2-multiselect-' + (++nextId$4);\n        this.tabindex = 0;\n        this.placeholder = '';\n        this.textKey = 'text';\n        this.valueKey = null;\n    }\n    Md2Multiselect.prototype.ngAfterContentInit = function () { this._isInitialized = true; };\n    Object.defineProperty(Md2Multiselect.prototype, \"readonly\", {\n        get: function () { return this._readonly; },\n        set: function (value) { this._readonly = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Multiselect.prototype, \"required\", {\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Multiselect.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Multiselect.prototype, \"options\", {\n        set: function (value) { this._options = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Multiselect.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) { this.setValue(value); },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * set value\n     * @param value\n     */\n    Md2Multiselect.prototype.setValue = function (value) {\n        var _this = this;\n        if (value !== this._value) {\n            this._value = value;\n            this.items = [];\n            if (value && value.length && typeof value === 'object' && Array.isArray(value)) {\n                var _loop_1 = function(i) {\n                    var selItm = this_1._options.find(function (itm) { return _this.equals(_this.valueKey ? itm[_this.valueKey] : itm, value[i]); });\n                    if (selItm) {\n                        this_1.items.push(new Option(selItm, this_1.textKey, this_1.valueKey));\n                    }\n                };\n                var this_1 = this;\n                for (var i = 0; i < value.length; i++) {\n                    _loop_1(i);\n                }\n            }\n            if (this._isInitialized) {\n                this._onChangeCallback(value);\n                this.change.emit(this._value);\n            }\n        }\n    };\n    /**\n     * Compare two vars or objects\n     * @param o1 compare first object\n     * @param o2 compare second object\n     * @return boolean comparation result\n     */\n    Md2Multiselect.prototype.equals = function (o1, o2) {\n        if (o1 === o2) {\n            return true;\n        }\n        if (o1 === null || o2 === null) {\n            return false;\n        }\n        if (o1 !== o1 && o2 !== o2) {\n            return true;\n        }\n        var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n        if (t1 === t2 && t1 === 'object') {\n            keySet = Object.create(null);\n            for (key in o1) {\n                if (!this.equals(o1[key], o2[key])) {\n                    return false;\n                }\n                keySet[key] = true;\n            }\n            for (key in o2) {\n                if (!(key in keySet) && key.charAt(0) !== '$' && o2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    };\n    Object.defineProperty(Md2Multiselect.prototype, \"isMenuVisible\", {\n        get: function () {\n            return (this.isFocused && this.list && this.list.length) && !this.readonly ? true : false;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * to update scroll of options\n     */\n    Md2Multiselect.prototype.updateScroll = function () {\n        if (this.focusedOption < 0) {\n            return;\n        }\n        var menuContainer = this.element.nativeElement.querySelector('.md2-multiselect-menu');\n        if (!menuContainer) {\n            return;\n        }\n        var choices = menuContainer.querySelectorAll('.md2-option');\n        if (choices.length < 1) {\n            return;\n        }\n        var highlighted = choices[this.focusedOption];\n        if (!highlighted) {\n            return;\n        }\n        var top = highlighted.offsetTop + highlighted.clientHeight - menuContainer.scrollTop;\n        var height = menuContainer.offsetHeight;\n        if (top > height) {\n            menuContainer.scrollTop += top - height;\n        }\n        else if (top < highlighted.clientHeight) {\n            menuContainer.scrollTop -= highlighted.clientHeight - top;\n        }\n    };\n    Md2Multiselect.prototype.onClick = function (event) {\n        if (this.disabled) {\n            event.stopPropagation();\n            event.preventDefault();\n            return;\n        }\n        this.updateOptions();\n        this.element.nativeElement.focus();\n    };\n    Md2Multiselect.prototype.onKeyDown = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        if (this.isMenuVisible) {\n            event.preventDefault();\n            event.stopPropagation();\n            switch (event.keyCode) {\n                case exports.KeyCodes.TAB:\n                case exports.KeyCodes.ESCAPE:\n                    this.onBlur();\n                    break;\n                case exports.KeyCodes.ENTER:\n                case exports.KeyCodes.SPACE:\n                    this.toggleOption(event, this.focusedOption);\n                    break;\n                case exports.KeyCodes.DOWN_ARROW:\n                    this.focusedOption = (this.focusedOption === this.list.length - 1) ? 0 : Math.min(this.focusedOption + 1, this.list.length - 1);\n                    this.updateScroll();\n                    break;\n                case exports.KeyCodes.UP_ARROW:\n                    this.focusedOption = (this.focusedOption === 0) ? this.list.length - 1 : Math.max(0, this.focusedOption - 1);\n                    this.updateScroll();\n                    break;\n            }\n        }\n        else {\n            switch (event.keyCode) {\n                case exports.KeyCodes.ENTER:\n                case exports.KeyCodes.SPACE:\n                case exports.KeyCodes.DOWN_ARROW:\n                case exports.KeyCodes.UP_ARROW:\n                    event.preventDefault();\n                    event.stopPropagation();\n                    this.updateOptions();\n                    break;\n            }\n        }\n    };\n    /**\n     * on focus current component\n     */\n    Md2Multiselect.prototype.onFocus = function () {\n        this.isFocused = true;\n        this.focusedOption = 0;\n    };\n    Md2Multiselect.prototype.onBlur = function () { this.isFocused = false; };\n    /**\n     * to check current option is active or not\n     * @param index\n     * @return boolean the item is active or not\n     */\n    Md2Multiselect.prototype.isActive = function (index) {\n        return this.items.map(function (i) { return i.text; }).indexOf(this.list[index].text) < 0 ? false : true;\n    };\n    /**\n     * to toggle option to select/deselect option\n     * @param event\n     * @param index\n     */\n    Md2Multiselect.prototype.toggleOption = function (event, index) {\n        var _this = this;\n        event.preventDefault();\n        event.stopPropagation();\n        var ind = this.items.map(function (i) { return i.text; }).indexOf(this.list[index].text);\n        if (ind < 0) {\n            this.items.push(this.list[index]);\n            this.items = this.items.sort(function (a, b) { return _this.list.findIndex(function (i) { return i.text === a.text; }) - _this.list.findIndex(function (i) { return i.text === b.text; }); });\n        }\n        else {\n            this.items.splice(ind, 1);\n        }\n        this._value = new Array();\n        for (var i = 0; i < this.items.length; i++) {\n            this._value.push(this.items[i].value);\n        }\n        this._onChangeCallback(this._value);\n        this.change.emit(this._value);\n    };\n    /**\n     * update options\n     */\n    Md2Multiselect.prototype.updateOptions = function () {\n        var _this = this;\n        this.list = this._options.map(function (item) { return new Option(item, _this.textKey, _this.valueKey); });\n        if (this.list.length > 0) {\n            this.onFocus();\n        }\n    };\n    /**\n     * Implemented as part of ControlValueAccessor.\n     * TODO: internal\n     */\n    Md2Multiselect.prototype.writeValue = function (value) {\n        var _this = this;\n        if (value !== this._value) {\n            this._value = value;\n            this.items = [];\n            if (value && value.length && typeof value === 'object' && Array.isArray(value)) {\n                var _loop_2 = function(i) {\n                    var selItm = this_2._options.find(function (itm) { return _this.equals(_this.valueKey ? itm[_this.valueKey] : itm, value[i]); });\n                    if (selItm) {\n                        this_2.items.push(new Option(selItm, this_2.textKey, this_2.valueKey));\n                    }\n                };\n                var this_2 = this;\n                for (var i = 0; i < value.length; i++) {\n                    _loop_2(i);\n                }\n            }\n        }\n    };\n    /**\n     * Implemented as part of ControlValueAccessor.\n     * TODO: internal\n     */\n    Md2Multiselect.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };\n    /**\n     * Implemented as part of ControlValueAccessor.\n     * TODO: internal\n     */\n    Md2Multiselect.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };\n    __decorate$31([\n        _angular_core.Output(), \n        __metadata$31('design:type', _angular_core.EventEmitter)\n    ], Md2Multiselect.prototype, \"change\", void 0);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', String)\n    ], Md2Multiselect.prototype, \"id\", void 0);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Number)\n    ], Md2Multiselect.prototype, \"tabindex\", void 0);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', String)\n    ], Md2Multiselect.prototype, \"placeholder\", void 0);\n    __decorate$31([\n        _angular_core.Input('item-text'), \n        __metadata$31('design:type', String)\n    ], Md2Multiselect.prototype, \"textKey\", void 0);\n    __decorate$31([\n        _angular_core.Input('item-value'), \n        __metadata$31('design:type', String)\n    ], Md2Multiselect.prototype, \"valueKey\", void 0);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Boolean)\n    ], Md2Multiselect.prototype, \"readonly\", null);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Boolean)\n    ], Md2Multiselect.prototype, \"required\", null);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Boolean)\n    ], Md2Multiselect.prototype, \"disabled\", null);\n    __decorate$31([\n        _angular_core.Input('items'), \n        __metadata$31('design:type', Array), \n        __metadata$31('design:paramtypes', [Array])\n    ], Md2Multiselect.prototype, \"options\", null);\n    __decorate$31([\n        _angular_core.Input(), \n        __metadata$31('design:type', Object)\n    ], Md2Multiselect.prototype, \"value\", null);\n    __decorate$31([\n        _angular_core.HostListener('click', ['$event']), \n        __metadata$31('design:type', Function), \n        __metadata$31('design:paramtypes', [MouseEvent]), \n        __metadata$31('design:returntype', void 0)\n    ], Md2Multiselect.prototype, \"onClick\", null);\n    __decorate$31([\n        _angular_core.HostListener('keydown', ['$event']), \n        __metadata$31('design:type', Function), \n        __metadata$31('design:paramtypes', [KeyboardEvent]), \n        __metadata$31('design:returntype', void 0)\n    ], Md2Multiselect.prototype, \"onKeyDown\", null);\n    __decorate$31([\n        _angular_core.HostListener('blur'), \n        __metadata$31('design:type', Function), \n        __metadata$31('design:paramtypes', []), \n        __metadata$31('design:returntype', void 0)\n    ], Md2Multiselect.prototype, \"onBlur\", null);\n    Md2Multiselect = __decorate$31([\n        _angular_core.Component({selector: 'md2-multiselect',\n            template: \"\\n    <div class=\\\"md2-multiselect-container\\\">\\n      <span class=\\\"md2-multiselect-placeholder\\\" [class.has-value]=\\\"items.length\\\">\\n        {{placeholder}}\\n        <span class=\\\"md2-placeholder-required\\\" *ngIf=\\\"required\\\">*</span>\\n      </span>\\n      <div class=\\\"md2-multiselect-value\\\">\\n        <div *ngFor=\\\"let v of items; let last = last\\\" class=\\\"md2-multiselect-value-item\\\">\\n          <span class=\\\"md2-multiselect-text\\\">{{v.text}}</span><span *ngIf=\\\"!last\\\">,&nbsp;</span>\\n        </div>\\n      </div>\\n      <svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n        <path d=\\\"M7 10l5 5 5-5z\\\" />\\n      </svg>\\n    </div>\\n    <ul *ngIf=\\\"isMenuVisible\\\" class=\\\"md2-multiselect-menu\\\">\\n      <li class=\\\"md2-option\\\" *ngFor=\\\"let l of list; let i = index;\\\" [class.active]=\\\"isActive(i)\\\" [class.focus]=\\\"focusedOption === i\\\" (click)=\\\"toggleOption($event, i)\\\">\\n        <div class=\\\"md2-option-icon\\\"></div>\\n        <div class=\\\"md2-option-text\\\" [innerHtml]=\\\"l.text\\\"></div>\\n      </li>\\n    </ul>\\n  \",\n            styles: [\"\\n    md2-multiselect { position: relative; display: block; margin: 18px 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -moz-backface-visibility: hidden; -webkit-backface-visibility: hidden; backface-visibility: hidden; }\\n    md2-multiselect:focus { outline: none; }\\n    md2-multiselect.md2-multiselect-disabled { pointer-events: none; cursor: default; }\\n    md2-multiselect .md2-multiselect-container { position: relative; width: 100%; min-width: 64px; min-height: 30px; align-items: center; padding: 2px 2px 1px; border-bottom: 1px solid rgba(0, 0, 0, 0.12); box-sizing: border-box; cursor: pointer; }\\n    md2-multiselect:focus .md2-multiselect-container { padding-bottom: 0; border-bottom: 2px solid #106cc8; }\\n    md2-multiselect.md2-multiselect-disabled .md2-multiselect-container { color: rgba(0,0,0,0.38); border-color: transparent; background-image: linear-gradient(to right, rgba(0,0,0,0.38) 0%, rgba(0,0,0,0.38) 33%, transparent 0%); background-position: bottom -1px left 0; background-size: 4px 1px; background-repeat: repeat-x; cursor: default; }\\n    md2-multiselect.md2-multiselect-disabled:focus .md2-multiselect-container { padding-bottom: 1px; border-bottom: 1px solid transparent; }\\n    md2-multiselect .md2-multiselect-placeholder { color: rgba(0, 0, 0, 0.38); position: absolute; right: 26px; bottom: 100%; left: 0; color: rgba(0,0,0,0.38); max-width: 100%; padding-left: 3px; padding-right: 0; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; z-index: 1; transform: translate3d(0,26px,0) scale(1); transition: transform .4s cubic-bezier(.25,.8,.25,1); transform-origin: left top; color: rgba(0, 0, 0, 0.38); }\\n    md2-multiselect:focus .md2-multiselect-placeholder { color: #2196f3; }\\n    md2-multiselect:focus .md2-multiselect-placeholder .md2-placeholder-required { color: #f00; }\\n    md2-multiselect:focus .md2-multiselect-placeholder,\\n    md2-multiselect .md2-multiselect-placeholder.has-value { transform: translate3d(0,6px,0) scale(.75); }\\n    md2-multiselect.md2-multiselect-disabled:focus .md2-multiselect-placeholder,\\n    md2-multiselect.md2-multiselect-disabled:focus .md2-multiselect-placeholder .md2-placeholder-required { color: rgba(0,0,0,0.38); }\\n    md2-multiselect .md2-multiselect-container .md2-multiselect-value { display: block; max-height: 80px; padding-right: 26px; overflow-y: auto; font-size: 15px; line-height: 26px; }\\n    md2-multiselect .md2-multiselect-container .md2-multiselect-value-item { word-wrap: break-word; }\\n    md2-multiselect .md2-multiselect-container svg { position: absolute; right: 0; top: 0; display: block; height: 100%; background: #fff; fill: currentColor; color: rgba(0,0,0,0.54); }\\n    md2-multiselect .md2-multiselect-menu { position: absolute; left: 0; top: 0; display: block; z-index: 10; width: 100%; margin: 0; padding: 8px 0; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); max-height: 256px; min-height: 48px; overflow-y: auto; -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); -webkit-transform: scale(1); transform: scale(1); background: #fff; }\\n    md2-multiselect .md2-multiselect-menu .md2-option { position: relative; display: block; cursor: pointer; width: auto; -moz-transition: background 0.15s linear; -o-transition: background 0.15s linear; -webkit-transition: background 0.15s linear; transition: background 0.15s linear; padding: 0 16px 0 40px; height: 48px; line-height: 48px; }\\n    md2-multiselect .md2-multiselect-menu .md2-option.active { color: #106cc8; }\\n    md2-multiselect .md2-multiselect-menu .md2-option:hover, .md2-multiselect .md2-multiselect-menu .md2-option.focus { background: #eeeeee; }\\n    md2-multiselect .md2-multiselect-menu .md2-option .md2-option-text { width: auto; white-space: nowrap; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; font-size: 16px; }\\n    md2-multiselect .md2-option .md2-option-icon { position: absolute; top: 14px; left: 12px; width: 16px; height: 16px; border: 2px solid rgba(0,0,0,0.54); border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; -moz-transition: 240ms; -o-transition: 240ms; -webkit-transition: 240ms; transition: 240ms; }\\n    md2-multiselect .md2-option.active .md2-option-icon { -moz-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); -webkit-transform: rotate(-45deg); transform: rotate(-45deg); height: 8px; top: 17px; border-color: #106cc8; border-top-style: none; border-right-style: none; }\\n  \"],\n            providers: [MD2_MULTISELECT_CONTROL_VALUE_ACCESSOR],\n            host: {\n                'role': 'select',\n                '[id]': 'id',\n                '[class.md2-multiselect-disabled]': 'disabled',\n                '[tabindex]': 'disabled ? -1 : tabindex',\n                '[attr.aria-disabled]': 'disabled'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$31('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Multiselect);\n    return Md2Multiselect;\n}());\nvar MD2_MULTISELECT_DIRECTIVES = [Md2Multiselect];\nvar Md2MultiselectModule = (function () {\n    function Md2MultiselectModule() {\n    }\n    Md2MultiselectModule.forRoot = function () {\n        return {\n            ngModule: Md2MultiselectModule,\n            providers: []\n        };\n    };\n    Md2MultiselectModule = __decorate$31([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule],\n            exports: MD2_MULTISELECT_DIRECTIVES,\n            declarations: MD2_MULTISELECT_DIRECTIVES,\n        }), \n        __metadata$31('design:paramtypes', [])\n    ], Md2MultiselectModule);\n    return Md2MultiselectModule;\n}());\n\nvar __decorate$32 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$32 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param$4 = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar _uniqueIdCounter = 0;\nvar Md2SelectDispatcher = (function () {\n    function Md2SelectDispatcher() {\n        this._listeners = [];\n    }\n    Md2SelectDispatcher.prototype.notify = function (id, name) {\n        for (var _i = 0, _a = this._listeners; _i < _a.length; _i++) {\n            var listener = _a[_i];\n            listener(id, name);\n        }\n    };\n    Md2SelectDispatcher.prototype.listen = function (listener) {\n        this._listeners.push(listener);\n    };\n    Md2SelectDispatcher = __decorate$32([\n        _angular_core.Injectable(), \n        __metadata$32('design:paramtypes', [])\n    ], Md2SelectDispatcher);\n    return Md2SelectDispatcher;\n}());\nvar Md2SelectChange = (function () {\n    function Md2SelectChange() {\n    }\n    return Md2SelectChange;\n}());\nvar Md2Select = (function () {\n    function Md2Select(element, _control) {\n        this.element = element;\n        this._control = _control;\n        this._value = null;\n        this._name = 'md2-select-' + _uniqueIdCounter++;\n        this._readonly = false;\n        this._required = false;\n        this._disabled = false;\n        //private _multiple: boolean;\n        this._selected = null;\n        this._isInitialized = false;\n        this.isOpenable = true;\n        this.isMenuVisible = false;\n        this.selectedValue = '';\n        this.focusIndex = 0;\n        this._onTouched = function () { };\n        this.change = new _angular_core.EventEmitter();\n        this.options = null;\n        this.tabindex = 0;\n        this.placeholder = '';\n        if (this._control) {\n            this._control.valueAccessor = this;\n        }\n    }\n    Object.defineProperty(Md2Select.prototype, \"name\", {\n        get: function () { return this._name; },\n        set: function (value) {\n            this._name = value;\n            this._updateOptions();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Select.prototype, \"readonly\", {\n        get: function () { return this._readonly; },\n        set: function (value) { this._readonly = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Select.prototype, \"required\", {\n        get: function () { return this._required; },\n        set: function (value) { this._required = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Select.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Select.prototype, \"value\", {\n        //@Input()\n        //get multiple(): boolean { return this._multiple; }\n        //set multiple(value) { this._multiple = coerceBooleanProperty(value); }\n        get: function () { return this._value; },\n        set: function (value) {\n            if (this._value !== value) {\n                this._value = value;\n                this._updateSelectedOptionValue();\n                if (this._isInitialized) {\n                    this._emitChangeEvent();\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Select.prototype, \"selected\", {\n        get: function () { return this._selected; },\n        set: function (selected) {\n            this._selected = selected;\n            if (selected) {\n                this.value = selected.value;\n                if (!selected.selected) {\n                    selected.selected = true;\n                }\n                this.selectedValue = selected.text;\n            }\n            else {\n                this.selectedValue = '';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Md2Select.prototype.ngAfterContentInit = function () { this._isInitialized = true; };\n    Md2Select.prototype.ngAfterContentChecked = function () {\n        var _this = this;\n        var opt = this.options.filter(function (o) { return _this.equals(o.value, _this.value); })[0];\n        if (opt && !this.equals(this.selected, opt)) {\n            this.selectedValue = opt.text;\n        }\n        if (this.selected && this.selectedValue !== this.selected.text) {\n            this.selectedValue = this.selected.text;\n        }\n    };\n    /**\n     * Compare two vars or objects\n     * @param o1 compare first object\n     * @param o2 compare second object\n     * @return boolean comparation result\n     */\n    Md2Select.prototype.equals = function (o1, o2) {\n        if (o1 === o2) {\n            return true;\n        }\n        if (o1 === null || o2 === null) {\n            return false;\n        }\n        if (o1 !== o1 && o2 !== o2) {\n            return true;\n        }\n        var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n        if (t1 === t2 && t1 === 'object') {\n            keySet = Object.create(null);\n            for (key in o1) {\n                if (!this.equals(o1[key], o2[key])) {\n                    return false;\n                }\n                keySet[key] = true;\n            }\n            for (key in o2) {\n                if (!(key in keySet) && key.charAt(0) !== '$' && o2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    };\n    /**\n     * To update scroll to position of focused option\n     */\n    Md2Select.prototype.updateScroll = function () {\n        if (this.focusIndex < 0) {\n            return;\n        }\n        var menuContainer = this.element.nativeElement.querySelector('.md2-select-menu');\n        if (!menuContainer) {\n            return;\n        }\n        var choices = menuContainer.querySelectorAll('md2-option');\n        if (choices.length < 1) {\n            return;\n        }\n        var highlighted = choices[this.focusIndex];\n        if (!highlighted) {\n            return;\n        }\n        var top = highlighted.offsetTop + highlighted.clientHeight - menuContainer.scrollTop;\n        var height = menuContainer.offsetHeight;\n        if (top > height) {\n            menuContainer.scrollTop += top - height;\n        }\n        else if (top < highlighted.clientHeight) {\n            menuContainer.scrollTop -= highlighted.clientHeight - top;\n        }\n    };\n    /**\n     * get index of focused option\n     */\n    Md2Select.prototype.getFocusIndex = function () { return this.options.toArray().findIndex(function (o) { return o.focused; }); };\n    /**\n     * update focused option\n     * @param inc\n     */\n    Md2Select.prototype.updateFocus = function (inc) {\n        var options = this.options.toArray();\n        var index = this.focusIndex;\n        options.forEach(function (o) { if (o.focused) {\n            o.focused = false;\n        } });\n        var option;\n        do {\n            index += inc;\n            if (index < 0) {\n                index = options.length - 1;\n            }\n            if (index > options.length - 1) {\n                index = 0;\n            }\n            option = options[index];\n            this.focusIndex = index;\n            if (option.disabled) {\n                option = undefined;\n            }\n        } while (!option);\n        if (option) {\n            option.focused = true;\n        }\n        this.updateScroll();\n    };\n    Md2Select.prototype.onClick = function (e) {\n        var _this = this;\n        if (this.disabled || this.readonly) {\n            e.stopPropagation();\n            e.preventDefault();\n            return;\n        }\n        if (this.isOpenable) {\n            if (!this.isMenuVisible) {\n                this.options.forEach(function (o) {\n                    o.focused = false;\n                    if (o.selected) {\n                        o.focused = true;\n                    }\n                });\n                this.focusIndex = this.getFocusIndex();\n                this.isMenuVisible = true;\n                setTimeout(function () {\n                    _this.updateScroll();\n                }, 0);\n                this.element.nativeElement.focus();\n            }\n        }\n        this.isOpenable = true;\n    };\n    Md2Select.prototype.onKeyDown = function (event) {\n        if (this.disabled) {\n            return;\n        }\n        if (this.isMenuVisible) {\n            event.preventDefault();\n            event.stopPropagation();\n            switch (event.keyCode) {\n                case exports.KeyCodes.TAB:\n                case exports.KeyCodes.ESCAPE:\n                    this._onBlur();\n                    break;\n                case exports.KeyCodes.ENTER:\n                case exports.KeyCodes.SPACE:\n                    this.options.toArray()[this.focusIndex].onOptionClick(event);\n                    break;\n                case exports.KeyCodes.DOWN_ARROW:\n                    this.updateFocus(1);\n                    break;\n                case exports.KeyCodes.UP_ARROW:\n                    this.updateFocus(-1);\n                    break;\n            }\n        }\n        else {\n            switch (event.keyCode) {\n                case exports.KeyCodes.ENTER:\n                case exports.KeyCodes.SPACE:\n                case exports.KeyCodes.DOWN_ARROW:\n                case exports.KeyCodes.UP_ARROW:\n                    event.preventDefault();\n                    event.stopPropagation();\n                    this.onClick(event);\n                    break;\n            }\n        }\n    };\n    Md2Select.prototype._onBlur = function () {\n        var _this = this;\n        if (this.isMenuVisible) {\n            this.isMenuVisible = false;\n            this.isOpenable = false;\n            setTimeout(function () {\n                _this.isOpenable = true;\n            }, 200);\n        }\n        else {\n            this._onTouched();\n        }\n    };\n    Md2Select.prototype.touch = function () {\n        if (this._onTouched) {\n            this._onTouched();\n        }\n    };\n    Md2Select.prototype._updateOptions = function () {\n        var _this = this;\n        if (this.options) {\n            this.options.forEach(function (option) {\n                option.name = _this.name;\n            });\n        }\n    };\n    Md2Select.prototype._updateSelectedOptionValue = function () {\n        var _this = this;\n        var isAlreadySelected = this.selected !== null && this.selected.value === this.value;\n        if (this.options !== null && !isAlreadySelected) {\n            var matchingOption = this.options.filter(function (option) { return option.value === _this.value; })[0];\n            if (matchingOption) {\n                this.selected = matchingOption;\n            }\n            else {\n                this.selected = null;\n                this.options.forEach(function (option) { option.selected = false; });\n            }\n        }\n    };\n    Md2Select.prototype._emitChangeEvent = function () {\n        var event = new Md2SelectChange();\n        event.source = this;\n        event.value = this.value;\n        if (this._control) {\n            this._onChange(event.value);\n        }\n        this.change.emit(event);\n    };\n    Md2Select.prototype.writeValue = function (value) {\n        if (!this.options) {\n            return;\n        }\n        //this.options.forEach((option: Md2Option) => {\n        //  if (option.value === value) {\n        //  }\n        //});\n        if (this._value !== value) {\n            this._value = value;\n            this._updateSelectedOptionValue();\n        }\n    };\n    Md2Select.prototype.registerOnChange = function (fn) { this._onChange = fn; };\n    Md2Select.prototype.registerOnTouched = function (fn) { this._onTouched = fn; };\n    __decorate$32([\n        _angular_core.Output(), \n        __metadata$32('design:type', _angular_core.EventEmitter)\n    ], Md2Select.prototype, \"change\", void 0);\n    __decorate$32([\n        _angular_core.ContentChildren(_angular_core.forwardRef(function () { return Md2Option; })), \n        __metadata$32('design:type', _angular_core.QueryList)\n    ], Md2Select.prototype, \"options\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], Md2Select.prototype, \"name\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Number)\n    ], Md2Select.prototype, \"tabindex\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], Md2Select.prototype, \"placeholder\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Select.prototype, \"readonly\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Select.prototype, \"required\", null);\n    __decorate$32([\n        _angular_core.HostBinding('class.md2-select-disabled'),\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Select.prototype, \"disabled\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Select.prototype, \"value\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Select.prototype, \"selected\", null);\n    __decorate$32([\n        _angular_core.HostListener('click', ['$event']), \n        __metadata$32('design:type', Function), \n        __metadata$32('design:paramtypes', [Object]), \n        __metadata$32('design:returntype', void 0)\n    ], Md2Select.prototype, \"onClick\", null);\n    __decorate$32([\n        _angular_core.HostListener('keydown', ['$event']), \n        __metadata$32('design:type', Function), \n        __metadata$32('design:paramtypes', [Object]), \n        __metadata$32('design:returntype', void 0)\n    ], Md2Select.prototype, \"onKeyDown\", null);\n    __decorate$32([\n        _angular_core.HostListener('blur'), \n        __metadata$32('design:type', Function), \n        __metadata$32('design:paramtypes', []), \n        __metadata$32('design:returntype', void 0)\n    ], Md2Select.prototype, \"_onBlur\", null);\n    Md2Select = __decorate$32([\n        _angular_core.Component({selector: 'md2-select',\n            template: \"<div class=\\\"md2-select-container\\\"> <span class=\\\"md2-select-placeholder\\\" [class.has-value]=\\\"selectedValue\\\">    {{placeholder}}  </span> <span *ngIf=\\\"selectedValue\\\" class=\\\"md2-select-value\\\" [innerHtml]=\\\"selectedValue\\\"></span> <svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"> <path d=\\\"M7 10l5 5 5-5z\\\" /> </svg> </div> <div class=\\\"md2-select-menu\\\" [class.open]=\\\"isMenuVisible\\\"> <ng-content></ng-content> </div>\",\n            styles: [\"md2-select { position: relative; display: block; margin: 18px 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } md2-select:focus { outline: none; } md2-select.md2-select-disabled { pointer-events: none; cursor: default; } md2-select .md2-select-container { position: relative; width: 100%; min-width: 64px; min-height: 30px; align-items: center; padding: 2px 26px 1px 2px; border-bottom: 1px solid rgba(0, 0, 0, 0.12); box-sizing: border-box; cursor: pointer; } md2-select:focus .md2-select-container { padding-bottom: 0; border-bottom: 2px solid #106cc8; } md2-select.md2-select-disabled .md2-select-container { color: rgba(0, 0, 0, 0.38); border-color: transparent; background-image: linear-gradient(to right, rgba(0, 0, 0, 0.38) 0%, rgba(0, 0, 0, 0.38) 33%, transparent 0%); background-position: bottom -1px left 0; background-size: 4px 1px; background-repeat: repeat-x; cursor: default; } md2-select.md2-select-disabled:focus .md2-select-container { padding-bottom: 1px; border-bottom: 1px solid transparent; } md2-select .md2-select-container .md2-select-placeholder { position: absolute; right: 26px; bottom: 100%; left: 0; color: rgba(0, 0, 0, 0.38); max-width: 100%; padding-left: 3px; padding-right: 0; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; z-index: 1; transform: translate3d(0, 26px, 0) scale(1); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); transform-origin: left top; color: rgba(0, 0, 0, 0.38); } [aria-required=true] .md2-select-placeholder::after { content: '*'; } /*md2-select:focus:not(.md-select-disabled) { color: $primary; border-bottom: 1px solid $primary; } .ng-invalid.ng-touched:not(.md2-select-disabled) { color: $warn; border-bottom: 1px solid $warn; }*/ md2-select:focus .md2-select-placeholder { color: #2196f3; } md2-select:focus .md2-select-placeholder, md2-select .md2-select-placeholder.has-value { transform: translate3d(0, 6px, 0) scale(0.75); } md2-select.md2-select-disabled:focus .md2-select-placeholder, md2-select .md2-select-container .md2-select-value { display: block; font-size: 15px; line-height: 26px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } md2-select .md2-select-container svg { position: absolute; right: 0; top: 2px; display: block; fill: currentColor; color: rgba(0, 0, 0, 0.54); } md2-select .md2-select-menu { position: absolute; left: 0; top: 0; display: none; z-index: 10; flex-direction: column; width: 100%; margin: 0; padding: 8px 0; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); max-height: 256px; min-height: 48px; overflow-y: auto; transform: scale(1); background: #fff; } md2-select .md2-select-menu.open { display: block; } /*# sourceMappingURL=select.css.map */ \"],\n            host: {\n                'role': 'select',\n                '[tabindex]': 'disabled ? -1 : tabindex',\n                '[attr.aria-label]': 'placeholder',\n                '[attr.aria-required]': 'required.toString()',\n                '[attr.aria-disabled]': 'disabled.toString()',\n                '[attr.aria-invalid]': '_control?.invalid || \"false\"',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }),\n        __param$4(1, _angular_core.Optional()), \n        __metadata$32('design:paramtypes', [_angular_core.ElementRef, _angular_forms.NgControl])\n    ], Md2Select);\n    return Md2Select;\n}());\nvar Md2Option = (function () {\n    function Md2Option(select, selectDispatcher, _elementRef) {\n        var _this = this;\n        this.selectDispatcher = selectDispatcher;\n        this._elementRef = _elementRef;\n        this._value = null;\n        this.focused = false;\n        this.id = 'md2-option-' + _uniqueIdCounter++;\n        this.select = select;\n        selectDispatcher.listen(function (id, name) {\n            if (id !== _this.id && name === _this.name) {\n                _this.selected = false;\n            }\n        });\n    }\n    Object.defineProperty(Md2Option.prototype, \"selected\", {\n        get: function () { return this._selected; },\n        set: function (selected) {\n            if (selected) {\n                this.selectDispatcher.notify(this.id, this.name);\n            }\n            this._selected = selected;\n            if (selected && this.select.value !== this.value) {\n                this.select.selected = this;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Option.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) {\n            if (this._value !== value) {\n                if (this.selected) {\n                    this.select.value = value;\n                }\n                this._value = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Option.prototype, \"disabled\", {\n        get: function () { return this._disabled || this.select.disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Md2Option.prototype.ngOnInit = function () {\n        this.selected = this.value ? this.select.value === this.value : false;\n        this.name = this.select.name;\n    };\n    Md2Option.prototype.ngAfterViewChecked = function () {\n        this.text = !!this.label ? this.label : this._elementRef.nativeElement.textContent.trim();\n        if (this.value === null) {\n            this.value = this.text;\n        }\n    };\n    /**\n     * on click to select option\n     * @param event\n     */\n    Md2Option.prototype.onOptionClick = function (event) {\n        if (this.disabled) {\n            event.preventDefault();\n            event.stopPropagation();\n            return;\n        }\n        //if (this.select.multiple) {\n        //} else {\n        this.select.selected = this;\n        this.select.touch();\n        this.select._onBlur();\n        //}\n    };\n    __decorate$32([\n        _angular_core.HostBinding('class.md2-option-focused'), \n        __metadata$32('design:type', Boolean)\n    ], Md2Option.prototype, \"focused\", void 0);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Boolean)\n    ], Md2Option.prototype, \"label\", void 0);\n    __decorate$32([\n        _angular_core.HostBinding(),\n        _angular_core.Input(), \n        __metadata$32('design:type', String)\n    ], Md2Option.prototype, \"id\", void 0);\n    __decorate$32([\n        _angular_core.HostBinding('class.md2-option-selected'),\n        _angular_core.Input(), \n        __metadata$32('design:type', Boolean)\n    ], Md2Option.prototype, \"selected\", null);\n    __decorate$32([\n        _angular_core.Input(), \n        __metadata$32('design:type', Object)\n    ], Md2Option.prototype, \"value\", null);\n    __decorate$32([\n        _angular_core.HostBinding('class.md2-option-disabled'),\n        _angular_core.Input(), \n        __metadata$32('design:type', Boolean)\n    ], Md2Option.prototype, \"disabled\", null);\n    Md2Option = __decorate$32([\n        _angular_core.Component({selector: 'md2-option',\n            template: '<ng-content></ng-content>',\n            styles: [\"\\n    md2-option { position: relative; display: block; width: 100%; padding: 12px 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 16px; cursor: pointer; box-sizing: border-box; transition: background 400ms linear; }\\n    md2-option.md2-option-selected { color: #106cc8; }\\n    md2-option:hover,\\n    md2-option.md2-option-focused { background: #eeeeee; }\\n    md2-option.md2-option-disabled,\\n    md2-option.md2-option-disabled:hover { color: rgba(189,189,189,0.87); cursor: default; background: transparent; }\\n    /*md2-select[multiple] md2-option { padding-left: 40px; }\\n    md2-select[multiple] md2-option:after { content: ''; position: absolute; top: 50%; left: 12px; display: block; width: 16px; height: 16px; margin-top: -8px; border: 2px solid rgba(0,0,0,0.54); border-radius: 2px; box-sizing: border-box; transition: 240ms; }\\n    md2-select[multiple] md2-option.md2-option-selected:after { transform: rotate(-45deg); height: 8px; border-width: 0 0 2px 2px; border-color: #106cc8; }\\n    md2-select[multiple] md2-option.md2-option-disabled:after { border-color: rgba(187,187,187,0.54); }*/\\n  \"],\n            host: {\n                'role': 'option',\n                '(click)': 'onOptionClick($event)'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$32('design:paramtypes', [Md2Select, Md2SelectDispatcher, _angular_core.ElementRef])\n    ], Md2Option);\n    return Md2Option;\n}());\nvar MD2_SELECT_DIRECTIVES = [Md2Select, Md2Option];\nvar Md2SelectModule = (function () {\n    function Md2SelectModule() {\n    }\n    Md2SelectModule.forRoot = function () {\n        return {\n            ngModule: Md2SelectModule,\n            providers: [Md2SelectDispatcher]\n        };\n    };\n    Md2SelectModule = __decorate$32([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_SELECT_DIRECTIVES,\n            declarations: MD2_SELECT_DIRECTIVES,\n        }), \n        __metadata$32('design:paramtypes', [])\n    ], Md2SelectModule);\n    return Md2SelectModule;\n}());\n\nvar __decorate$33 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$33 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2TabChangeEvent = (function () {\n    function Md2TabChangeEvent() {\n    }\n    return Md2TabChangeEvent;\n}());\nvar Md2Transclude = (function () {\n    function Md2Transclude(viewRef) {\n        this.viewRef = viewRef;\n    }\n    Object.defineProperty(Md2Transclude.prototype, \"md2Transclude\", {\n        get: function () {\n            return this._md2Transclude;\n        },\n        set: function (templateRef) {\n            this._md2Transclude = templateRef;\n            if (templateRef) {\n                this.viewRef.createEmbeddedView(templateRef);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', _angular_core.TemplateRef), \n        __metadata$33('design:paramtypes', [_angular_core.TemplateRef])\n    ], Md2Transclude.prototype, \"md2Transclude\", null);\n    Md2Transclude = __decorate$33([\n        _angular_core.Directive({ selector: '[md2Transclude]' }), \n        __metadata$33('design:paramtypes', [_angular_core.ViewContainerRef])\n    ], Md2Transclude);\n    return Md2Transclude;\n}());\nvar Md2Tab = (function () {\n    function Md2Tab() {\n    }\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', String)\n    ], Md2Tab.prototype, \"label\", void 0);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Boolean)\n    ], Md2Tab.prototype, \"active\", void 0);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Boolean)\n    ], Md2Tab.prototype, \"disabled\", void 0);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', String)\n    ], Md2Tab.prototype, \"class\", void 0);\n    Md2Tab = __decorate$33([\n        _angular_core.Component({selector: 'md2-tab',\n            template: \"<ng-content></ng-content>\",\n            host: {\n                '[class]': 'class',\n                '[class.active]': 'active'\n            }\n        }), \n        __metadata$33('design:paramtypes', [])\n    ], Md2Tab);\n    return Md2Tab;\n}());\nvar Md2TabLabel = (function () {\n    function Md2TabLabel(templateRef, tab) {\n        this.templateRef = templateRef;\n        tab.labelRef = templateRef;\n    }\n    Md2TabLabel = __decorate$33([\n        _angular_core.Directive({ selector: '[md2-tab-label]' }), \n        __metadata$33('design:paramtypes', [_angular_core.TemplateRef, Md2Tab])\n    ], Md2TabLabel);\n    return Md2TabLabel;\n}());\nvar Md2Tabs = (function () {\n    function Md2Tabs(elementRef) {\n        this.elementRef = elementRef;\n        this._isInitialized = false;\n        this._focusIndex = 0;\n        this._selectedIndex = 0;\n        this.shouldPaginate = false;\n        this.offsetLeft = 0;\n        this.inkBarLeft = '0';\n        this.inkBarWidth = '0';\n        this.change = new _angular_core.EventEmitter();\n    }\n    Object.defineProperty(Md2Tabs.prototype, \"selectedIndex\", {\n        get: function () { return this._selectedIndex; },\n        set: function (value) {\n            if (typeof value === 'string') {\n                value = parseInt(value);\n            }\n            if (value != this._selectedIndex) {\n                this._selectedIndex = value;\n                this.adjustOffset(value);\n                this._updateInkBar();\n                if (this.tabs) {\n                    var tabs = this.tabs.toArray();\n                    if (!tabs[value].disabled) {\n                        tabs.forEach(function (tab) { return tab.active = false; });\n                        tabs[value].active = true;\n                    }\n                }\n                if (this._isInitialized) {\n                    this.change.emit(this._createChangeEvent(value));\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Tabs.prototype, \"focusIndex\", {\n        get: function () { return this._focusIndex; },\n        set: function (value) {\n            this._focusIndex = value;\n            this.adjustOffset(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Tabs.prototype, \"element\", {\n        get: function () {\n            var elements = { root: this.elementRef.nativeElement, wrapper: null, canvas: null, paging: null, tabs: null };\n            elements.wrapper = elements.root.querySelector('.md2-tabs-header-wrapper');\n            elements.canvas = elements.wrapper.querySelector('.md2-tabs-canvas');\n            elements.paging = elements.canvas.querySelector('.md2-tabs-header');\n            elements.tabs = elements.paging.querySelectorAll('.md2-tab-label');\n            return elements;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * After Content Init\n     */\n    Md2Tabs.prototype.ngAfterContentInit = function () {\n        var _this = this;\n        setTimeout(function () {\n            _this.updatePagination();\n        }, 0);\n        setTimeout(function () {\n            var tabs = _this.tabs.toArray();\n            if (_this.selectedIndex) {\n                tabs.forEach(function (tab) { return tab.active = false; });\n                tabs[_this.selectedIndex].active = true;\n                _this.adjustOffset(_this.selectedIndex);\n            }\n            else {\n                var index = tabs.findIndex(function (t) { return t.active; });\n                if (index < 0) {\n                    tabs[0].active = true;\n                }\n                else {\n                    _this.selectedIndex = index;\n                }\n            }\n            _this._updateInkBar();\n        }, 0);\n        this._isInitialized = true;\n    };\n    /**\n     * Calculates the styles from the selected tab for the ink-bar.\n     */\n    Md2Tabs.prototype._updateInkBar = function () {\n        var elements = this.element;\n        if (!elements.tabs[this.selectedIndex]) {\n            return;\n        }\n        var tab = elements.tabs[this.selectedIndex];\n        this.inkBarLeft = tab.offsetLeft + 'px';\n        this.inkBarWidth = tab.offsetWidth + 'px';\n    };\n    /**\n     * Create Change Event\n     * @param index\n     * @return event of Md2TabChangeEvent\n     */\n    Md2Tabs.prototype._createChangeEvent = function (index) {\n        var event = new Md2TabChangeEvent;\n        event.index = index;\n        if (this.tabs && this.tabs.length) {\n            event.tab = this.tabs.toArray()[index];\n        }\n        return event;\n    };\n    /**\n     * Focus next Tab\n     */\n    Md2Tabs.prototype.focusNextTab = function () { this.incrementIndex(1); };\n    /**\n     * Focus previous Tab\n     */\n    Md2Tabs.prototype.focusPreviousTab = function () { this.incrementIndex(-1); };\n    /**\n     * Mouse Wheel scroll\n     * @param event\n     */\n    Md2Tabs.prototype.scroll = function (event) {\n        if (!this.shouldPaginate) {\n            return;\n        }\n        event.preventDefault();\n        this.offsetLeft = this.fixOffset(this.offsetLeft - event.wheelDelta);\n    };\n    /**\n     * Next Page\n     */\n    Md2Tabs.prototype.nextPage = function () {\n        var elements = this.element;\n        var viewportWidth = elements.canvas.clientWidth, totalWidth = viewportWidth + this.offsetLeft, i, tab;\n        for (i = 0; i < elements.tabs.length; i++) {\n            tab = elements.tabs[i];\n            if (tab.offsetLeft + tab.offsetWidth > totalWidth) {\n                break;\n            }\n        }\n        this.offsetLeft = this.fixOffset(tab.offsetLeft);\n    };\n    /**\n     * Previous Page\n     */\n    Md2Tabs.prototype.previousPage = function () {\n        var i, tab, elements = this.element;\n        for (i = 0; i < elements.tabs.length; i++) {\n            tab = elements.tabs[i];\n            if (tab.offsetLeft + tab.offsetWidth >= this.offsetLeft) {\n                break;\n            }\n        }\n        this.offsetLeft = this.fixOffset(tab.offsetLeft + tab.offsetWidth - elements.canvas.clientWidth);\n    };\n    /**\n     * On Window Resize\n     * @param event\n     */\n    Md2Tabs.prototype.onWindowResize = function (event) {\n        this.offsetLeft = this.fixOffset(this.offsetLeft);\n        this.updatePagination();\n    };\n    /**\n     * Can page Back\n     */\n    Md2Tabs.prototype.canPageBack = function () { return this.offsetLeft > 0; };\n    /**\n     * Can page Previous\n     */\n    Md2Tabs.prototype.canPageForward = function () {\n        var elements = this.element;\n        var lastTab = elements.tabs[elements.tabs.length - 1];\n        return lastTab && lastTab.offsetLeft + lastTab.offsetWidth > elements.canvas.clientWidth +\n            this.offsetLeft;\n    };\n    /**\n     * Update Pagination\n     */\n    Md2Tabs.prototype.updatePagination = function () {\n        var canvasWidth = this.element.root.clientWidth;\n        this.element.tabs.forEach(function (tab) {\n            canvasWidth -= tab.offsetWidth;\n        });\n        this.shouldPaginate = canvasWidth < 0;\n    };\n    /**\n     * Increment Focus Tab\n     * @param inc\n     */\n    Md2Tabs.prototype.incrementIndex = function (inc) {\n        var newIndex, index = this.focusIndex;\n        for (newIndex = index + inc; this.tabs.toArray()[newIndex] && this.tabs.toArray()[newIndex].disabled; newIndex += inc) { }\n        if (this.tabs.toArray()[newIndex]) {\n            this.focusIndex = newIndex;\n        }\n    };\n    /**\n     * Adjust Offset of Tab\n     * @param index\n     */\n    Md2Tabs.prototype.adjustOffset = function (index) {\n        var elements = this.element;\n        if (!elements.tabs[index]) {\n            return;\n        }\n        var tab = elements.tabs[index], left = tab.offsetLeft, right = tab.offsetWidth + left;\n        this.offsetLeft = Math.max(this.offsetLeft, this.fixOffset(right - elements.canvas.clientWidth + 32 * 2));\n        this.offsetLeft = Math.min(this.offsetLeft, this.fixOffset(left));\n    };\n    /**\n     * Fix Offset of Tab\n     * @param value\n     * @return value\n     */\n    Md2Tabs.prototype.fixOffset = function (value) {\n        var elements = this.element;\n        if (!elements.tabs.length || !this.shouldPaginate) {\n            return 0;\n        }\n        var lastTab = elements.tabs[elements.tabs.length - 1], totalWidth = lastTab.offsetLeft + lastTab.offsetWidth;\n        value = Math.max(0, value);\n        value = Math.min(totalWidth - elements.canvas.clientWidth, value);\n        return value;\n    };\n    __decorate$33([\n        _angular_core.ContentChildren(Md2Tab), \n        __metadata$33('design:type', _angular_core.QueryList)\n    ], Md2Tabs.prototype, \"tabs\", void 0);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', String)\n    ], Md2Tabs.prototype, \"class\", void 0);\n    __decorate$33([\n        _angular_core.Input(), \n        __metadata$33('design:type', Object), \n        __metadata$33('design:paramtypes', [Object])\n    ], Md2Tabs.prototype, \"selectedIndex\", null);\n    __decorate$33([\n        _angular_core.Output(), \n        __metadata$33('design:type', _angular_core.EventEmitter)\n    ], Md2Tabs.prototype, \"change\", void 0);\n    Md2Tabs = __decorate$33([\n        _angular_core.Component({selector: 'md2-tabs',\n            template: \"\\n    <div class=\\\"md2-tabs-header-wrapper\\\">\\n      <div role=\\\"button\\\" class=\\\"md2-prev-button\\\" [class.disabled]=\\\"!canPageBack()\\\" *ngIf=\\\"shouldPaginate\\\" (click)=\\\"previousPage()\\\">\\n        <em class=\\\"prev-icon\\\">Prev</em>\\n      </div>\\n      <div role=\\\"button\\\" class=\\\"md2-next-button\\\" [class.disabled]=\\\"!canPageForward()\\\" *ngIf=\\\"shouldPaginate\\\" (click)=\\\"nextPage()\\\">\\n        <em class=\\\"next-icon\\\">Next</em>\\n      </div>\\n      <div class=\\\"md2-tabs-canvas\\\" [class.md2-paginated]=\\\"shouldPaginate\\\" role=\\\"tablist\\\" tabindex=\\\"0\\\" (keydown.arrowRight)=\\\"focusNextTab()\\\" (keydown.arrowLeft)=\\\"focusPreviousTab()\\\" (keydown.enter)=\\\"selectedIndex = focusIndex\\\" (mousewheel)=\\\"scroll($event)\\\">\\n        <div class=\\\"md2-tabs-header\\\" [style.marginLeft]=\\\"-offsetLeft + 'px'\\\">\\n          <div class=\\\"md2-tab-label\\\" role=\\\"tab\\\" *ngFor=\\\"let tab of tabs; let i = index\\\" [class.focus]=\\\"focusIndex === i\\\" [class.active]=\\\"selectedIndex === i\\\" [class.disabled]=\\\"tab.disabled\\\" (click)=\\\"focusIndex = selectedIndex = i\\\">\\n            <span [md2Transclude]=\\\"tab.labelRef\\\">{{tab.label}}</span>\\n          </div>\\n          <div class=\\\"md2-tab-ink-bar\\\" [style.left]=\\\"inkBarLeft\\\" [style.width]=\\\"inkBarWidth\\\"></div>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"md2-tabs-body-wrapper\\\">\\n      <ng-content></ng-content>\\n    </div>\\n  \",\n            styles: [\"\\n    md2-tabs { position: relative; overflow: hidden; display: block; margin: 0; border: 1px solid #e1e1e1; border-radius: 2px; }\\n    .md2-tabs-header-wrapper { position: relative; display: block; height: 48px; background: white; border-width: 0 0 1px; border-style: solid; border-color: rgba(0,0,0,0.12); display: block; margin: 0; padding: 0; list-style: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }\\n    .md2-tabs-header-wrapper:after { content: ''; display: table; clear: both; }\\n    .md2-prev-button,\\n    .md2-next-button { position: absolute; top: 0; height: 100%; width: 32px; padding: 8px 0; z-index: 2; cursor: pointer; }\\n    .md2-prev-button { left: 0; }\\n    .md2-next-button { right: 0; }\\n    .md2-prev-button.disabled,\\n    .md2-next-button.disabled { opacity: .25; cursor: default; }\\n    .md2-prev-button .prev-icon,\\n    .md2-next-button .next-icon { display: block; width: 12px; height: 12px; font-size: 0; border-width: 0 0 2px 2px; border-style: solid; border-color: #757575; border-radius: 1px; transform: rotate(45deg); margin: 10px; }\\n    .md2-next-button .next-icon { border-width: 2px 2px 0 0; }\\n    .md2-tabs-canvas { position: relative; height: 100%; overflow: hidden; display: block; outline: none; }\\n    .md2-tabs-canvas.md2-paginated { margin: 0 32px; }\\n    .md2-tabs-header { position: relative; display: inline-block; height: 100%; white-space: nowrap; -moz-transition: 0.5s cubic-bezier(0.35,0,0.25,1); -o-transition: 0.5s cubic-bezier(0.35,0,0.25,1); -webkit-transition: 0.5s cubic-bezier(0.35,0,0.25,1); transition: 0.5s cubic-bezier(0.35,0,0.25,1); }\\n    .md2-tab-label { position: relative; height: 100%; color: rgba(0,0,0,0.54); font-size: 14px; text-align: center; line-height: 24px; padding: 12px 24px; -moz-transition: background-color .35s cubic-bezier(.35,0,.25,1); -o-transition: background-color .35s cubic-bezier(.35,0,.25,1); -webkit-transition: background-color .35s cubic-bezier(.35,0,.25,1); transition: background-color .35s cubic-bezier(.35,0,.25,1); cursor: pointer; white-space: nowrap; text-transform: uppercase; display: inline-block; font-weight: 500; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; }\\n    .md2-tab-label.active { color: rgb(16,108,200); }\\n    .md2-tabs-canvas:focus .md2-tab-label.focus { background: rgba(0,0,0,0.05); }\\n    .md2-tab-label.disabled { color: rgba(0,0,0,0.26); pointer-events: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-drag: none; opacity: 0.5; cursor: default; }\\n    .md2-tab-ink-bar { position: absolute; bottom: 0; height: 2px; background: rgb(255,82,82); transition: .25s cubic-bezier(.35,0,.25,1); }\\n    .md2-tabs-body-wrapper { position: relative; min-height: 0; display: block; clear: both; }\\n    md2-tab { padding: 16px; display: none; position: relative; }\\n    md2-tab.active { display: block; position: relative; }\\n  \"],\n            host: {\n                '[class]': 'class',\n                '(window:resize)': 'onWindowResize($event)'\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$33('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Tabs);\n    return Md2Tabs;\n}());\nvar MD2_TABS_DIRECTIVES = [Md2TabLabel, Md2Tabs, Md2Tab];\nvar Md2TabsModule = (function () {\n    function Md2TabsModule() {\n    }\n    Md2TabsModule.forRoot = function () {\n        return {\n            ngModule: Md2TabsModule,\n            providers: []\n        };\n    };\n    Md2TabsModule = __decorate$33([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_TABS_DIRECTIVES,\n            declarations: [Md2Transclude, Md2TabLabel, Md2Tabs, Md2Tab],\n        }), \n        __metadata$33('design:paramtypes', [])\n    ], Md2TabsModule);\n    return Md2TabsModule;\n}());\n\nvar __decorate$34 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$34 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar noop$5 = function () { };\nvar nextId$5 = 0;\nvar Tag = (function () {\n    function Tag(source, textKey, valueKey) {\n        if (typeof source === 'string') {\n            this.text = this.value = source;\n        }\n        if (typeof source === 'object') {\n            this.text = source[textKey];\n            this.value = valueKey ? source[valueKey] : source;\n        }\n    }\n    return Tag;\n}());\nvar MD2_TAGS_CONTROL_VALUE_ACCESSOR = {\n    provide: _angular_forms.NG_VALUE_ACCESSOR,\n    useExisting: _angular_core.forwardRef(function () { return Md2Tags; }),\n    multi: true\n};\nvar Md2Tags = (function () {\n    function Md2Tags(element) {\n        this.element = element;\n        this.change = new _angular_core.EventEmitter();\n        this._value = '';\n        this._disabled = false;\n        this._isInitialized = false;\n        this._onTouchedCallback = noop$5;\n        this._onChangeCallback = noop$5;\n        this._tags = [];\n        this.list = [];\n        this.items = [];\n        this.focusedTag = 0;\n        this.selectedTag = -1;\n        this.tagBuffer = '';\n        this.inputFocused = false;\n        this.noBlur = true;\n        this.id = 'md2-tags-' + (++nextId$5);\n        this.tabindex = 0;\n        this.placeholder = '';\n        this.textKey = 'text';\n        this.valueKey = null;\n        this.selectAndFocusTagSafe = function (index) {\n            if (!this.items.length) {\n                this.selectTag(-1);\n                this.onFocus();\n                return;\n            }\n            if (index === this.items.length) {\n                return this.onFocus();\n            }\n            index = Math.max(index, 0);\n            index = Math.min(index, this.items.length - 1);\n            this.selectTag(index);\n        };\n    }\n    Md2Tags.prototype.ngAfterContentInit = function () { this._isInitialized = true; };\n    Object.defineProperty(Md2Tags.prototype, \"disabled\", {\n        get: function () { return this._disabled; },\n        set: function (value) { this._disabled = coerceBooleanProperty(value); },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Tags.prototype, \"tags\", {\n        set: function (value) { this._tags = value; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2Tags.prototype, \"value\", {\n        get: function () { return this._value; },\n        set: function (value) { this.setValue(value); },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * setup value\n     * @param value\n     */\n    Md2Tags.prototype.setValue = function (value) {\n        var _this = this;\n        if (value !== this._value) {\n            this._value = value;\n            this.items = [];\n            if (value && value.length && typeof value === 'object' && Array.isArray(value)) {\n                var _loop_1 = function(i) {\n                    var selItm = this_1._tags.find(function (t) { return _this.equals(_this.valueKey ? t[_this.valueKey] : t, value[i]); });\n                    if (selItm) {\n                        this_1.items.push(new Tag(selItm, this_1.textKey, this_1.valueKey));\n                    }\n                };\n                var this_1 = this;\n                for (var i = 0; i < value.length; i++) {\n                    _loop_1(i);\n                }\n            }\n            if (this._isInitialized) {\n                this._onChangeCallback(value);\n                this.change.emit(this._value);\n            }\n        }\n    };\n    /**\n     * Compare two vars or objects\n     * @param o1 compare first object\n     * @param o2 compare second object\n     * @return boolean comparation result\n     */\n    Md2Tags.prototype.equals = function (o1, o2) {\n        if (o1 === o2) {\n            return true;\n        }\n        if (o1 === null || o2 === null) {\n            return false;\n        }\n        if (o1 !== o1 && o2 !== o2) {\n            return true;\n        }\n        var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n        if (t1 === t2 && t1 === 'object') {\n            keySet = Object.create(null);\n            for (key in o1) {\n                if (!this.equals(o1[key], o2[key])) {\n                    return false;\n                }\n                keySet[key] = true;\n            }\n            for (key in o2) {\n                if (!(key in keySet) && key.charAt(0) !== '$' && o2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    };\n    Object.defineProperty(Md2Tags.prototype, \"isMenuVisible\", {\n        get: function () {\n            return ((this.inputFocused || this.noBlur) && this.tagBuffer && this.list && this.list.length) ? true : false;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * update scroll of tags suggestion menu\n     */\n    Md2Tags.prototype.updateScroll = function () {\n        if (this.focusedTag < 0) {\n            return;\n        }\n        var menuContainer = this.element.nativeElement.querySelector('.md2-tags-menu');\n        if (!menuContainer) {\n            return;\n        }\n        var choices = menuContainer.querySelectorAll('.md2-option');\n        if (choices.length < 1) {\n            return;\n        }\n        var highlighted = choices[this.focusedTag];\n        if (!highlighted) {\n            return;\n        }\n        var top = highlighted.offsetTop + highlighted.clientHeight - menuContainer.scrollTop;\n        var height = menuContainer.offsetHeight;\n        if (top > height) {\n            menuContainer.scrollTop += top - height;\n        }\n        else if (top < highlighted.clientHeight) {\n            menuContainer.scrollTop -= highlighted.clientHeight - top;\n        }\n    };\n    /**\n     * input key listener\n     * @param event\n     */\n    Md2Tags.prototype.inputKeydown = function (event) {\n        var _this = this;\n        // Backspace\n        if (event.keyCode === 8 && !this.tagBuffer) {\n            event.preventDefault();\n            event.stopPropagation();\n            if (this.items.length && this.selectedTag < 0) {\n                this.selectAndFocusTagSafe(this.items.length - 1);\n            }\n            if (this.items.length && this.selectedTag > -1) {\n                this.removeAndSelectAdjacentTag(this.selectedTag);\n            }\n            return;\n        }\n        // Del Key\n        if (event.keyCode === 46 && !this.tagBuffer) {\n            return;\n        }\n        // Left / Right Arrow\n        if ((event.keyCode === 37 || event.keyCode === 39) && !this.tagBuffer) {\n            return;\n        }\n        // Down Arrow\n        if (event.keyCode === 40) {\n            if (!this.isMenuVisible) {\n                return;\n            }\n            event.stopPropagation();\n            event.preventDefault();\n            this.focusedTag = (this.focusedTag === this.list.length - 1) ? 0 : Math.min(this.focusedTag + 1, this.list.length - 1);\n            this.updateScroll();\n            return;\n        }\n        // Up Arrow\n        if (event.keyCode === 38) {\n            if (!this.isMenuVisible) {\n                return;\n            }\n            event.stopPropagation();\n            event.preventDefault();\n            this.focusedTag = (this.focusedTag === 0) ? this.list.length - 1 : Math.max(0, this.focusedTag - 1);\n            this.updateScroll();\n            return;\n        }\n        // Tab Key\n        if (event.keyCode === 9) {\n            return;\n        }\n        // Enter / Space\n        if (event.keyCode === 13 || event.keyCode === 32) {\n            if (!this.tagBuffer || !this.isMenuVisible) {\n                event.preventDefault();\n                return;\n            }\n            event.preventDefault();\n            this.addTag(event, this.focusedTag);\n            return;\n        }\n        // Escape Key\n        if (event.keyCode === 27) {\n            event.stopPropagation();\n            event.preventDefault();\n            if (this.tagBuffer) {\n                this.tagBuffer = '';\n            }\n            if (this.selectedTag >= 0) {\n                this.onFocus();\n            }\n            return;\n        }\n        // reset selected tag\n        if (this.selectedTag >= 0) {\n            this.resetselectedTag();\n        }\n        // filter\n        setTimeout(function () {\n            _this.filterMatches(new RegExp(_this.tagBuffer, 'ig'));\n        }, 10);\n    };\n    Md2Tags.prototype.onKeydown = function (event) {\n        if (this.disabled || this.tagBuffer) {\n            return;\n        }\n        switch (event.keyCode) {\n            case exports.KeyCodes.BACKSPACE:\n            case exports.KeyCodes.DELETE:\n                if (this.selectedTag < 0) {\n                    return;\n                }\n                event.preventDefault();\n                this.removeAndSelectAdjacentTag(this.selectedTag);\n                break;\n            case exports.KeyCodes.TAB:\n            case exports.KeyCodes.ESCAPE:\n                if (this.selectedTag < 0) {\n                    return;\n                }\n                event.preventDefault();\n                this.onFocus();\n                break;\n            case exports.KeyCodes.LEFT_ARROW:\n                event.preventDefault();\n                if (this.selectedTag < 0) {\n                    this.selectedTag = this.items.length;\n                }\n                if (this.items.length) {\n                    this.selectAndFocusTagSafe(this.selectedTag - 1);\n                }\n                break;\n            case exports.KeyCodes.RIGHT_ARROW:\n                event.preventDefault();\n                if (this.selectedTag >= this.items.length) {\n                    this.selectedTag = -1;\n                }\n                this.selectAndFocusTagSafe(this.selectedTag + 1);\n                break;\n        }\n    };\n    Md2Tags.prototype.removeAndSelectAdjacentTag = function (index) {\n        var selIndex = this.getAdjacentTagIndex(index);\n        this.removeTag(index);\n        this.selectAndFocusTagSafe(selIndex);\n    };\n    Md2Tags.prototype.resetselectedTag = function () {\n        this.selectedTag = -1;\n    };\n    Md2Tags.prototype.getAdjacentTagIndex = function (index) {\n        var len = this.items.length - 1;\n        return (len === 0) ? -1 :\n            (index === len) ? index - 1 : index;\n    };\n    /**\n     * add tag\n     * @param event\n     * @param index index of the specific tag\n     */\n    Md2Tags.prototype.addTag = function (event, index) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.items.push(this.list[index]);\n        this.tagBuffer = '';\n        this.updateValue();\n    };\n    Md2Tags.prototype.removeTagAndFocusInput = function (index) {\n        this.removeTag(index);\n        this.onFocus();\n    };\n    /**\n     * remove tag\n     * @param index\n     */\n    Md2Tags.prototype.removeTag = function (index) {\n        this.items.splice(index, 1);\n        this.updateValue();\n    };\n    /**\n     * update value\n     */\n    Md2Tags.prototype.updateValue = function () {\n        this._value = new Array();\n        for (var i = 0; i < this.items.length; i++) {\n            this._value.push(this.items[i].value);\n        }\n        this._onChangeCallback(this._value);\n        this.change.emit(this._value);\n    };\n    /**\n     * select tag\n     * @param index of select tag\n     */\n    Md2Tags.prototype.selectTag = function (index) {\n        if (index >= -1 && index <= this.items.length) {\n            this.selectedTag = index;\n        }\n    };\n    Md2Tags.prototype.onFocus = function () {\n        this.element.nativeElement.querySelector('input').focus();\n        this.resetselectedTag();\n    };\n    Md2Tags.prototype.onInputFocus = function () {\n        this.inputFocused = true;\n        this.resetselectedTag();\n    };\n    Md2Tags.prototype.onInputBlur = function () {\n        this.inputFocused = false;\n    };\n    Md2Tags.prototype.listEnter = function () { this.noBlur = true; };\n    Md2Tags.prototype.listLeave = function () { this.noBlur = false; };\n    /**\n     * update suggestion menu with filter\n     * @param query\n     */\n    Md2Tags.prototype.filterMatches = function (query) {\n        var _this = this;\n        var tempList = this._tags.map(function (tag) { return new Tag(tag, _this.textKey, _this.valueKey); });\n        this.list = tempList.filter(function (t) { return (query.test(t.text) && !_this.items.find(function (i) { return t.text === i.text; })); });\n        if (this.list.length > 0) {\n            this.focusedTag = 0;\n        }\n    };\n    Md2Tags.prototype.writeValue = function (value) {\n        var _this = this;\n        if (value !== this._value) {\n            this._value = value;\n            this.items = [];\n            if (value && value.length && typeof value === 'object' && Array.isArray(value)) {\n                var _loop_2 = function(i) {\n                    var selItm = this_2._tags.find(function (t) { return _this.equals(_this.valueKey ? t[_this.valueKey] : t, value[i]); });\n                    if (selItm) {\n                        this_2.items.push(new Tag(selItm, this_2.textKey, this_2.valueKey));\n                    }\n                };\n                var this_2 = this;\n                for (var i = 0; i < value.length; i++) {\n                    _loop_2(i);\n                }\n            }\n        }\n    };\n    Md2Tags.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };\n    Md2Tags.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };\n    __decorate$34([\n        _angular_core.Output(), \n        __metadata$34('design:type', _angular_core.EventEmitter)\n    ], Md2Tags.prototype, \"change\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', String)\n    ], Md2Tags.prototype, \"id\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Number)\n    ], Md2Tags.prototype, \"tabindex\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', String)\n    ], Md2Tags.prototype, \"placeholder\", void 0);\n    __decorate$34([\n        _angular_core.Input('md2-tag-text'), \n        __metadata$34('design:type', String)\n    ], Md2Tags.prototype, \"textKey\", void 0);\n    __decorate$34([\n        _angular_core.Input('md2-tag-value'), \n        __metadata$34('design:type', String)\n    ], Md2Tags.prototype, \"valueKey\", void 0);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Boolean)\n    ], Md2Tags.prototype, \"disabled\", null);\n    __decorate$34([\n        _angular_core.Input('md2-tags'), \n        __metadata$34('design:type', Array), \n        __metadata$34('design:paramtypes', [Array])\n    ], Md2Tags.prototype, \"tags\", null);\n    __decorate$34([\n        _angular_core.Input(), \n        __metadata$34('design:type', Object)\n    ], Md2Tags.prototype, \"value\", null);\n    __decorate$34([\n        _angular_core.HostListener('keydown', ['$event']), \n        __metadata$34('design:type', Function), \n        __metadata$34('design:paramtypes', [KeyboardEvent]), \n        __metadata$34('design:returntype', void 0)\n    ], Md2Tags.prototype, \"onKeydown\", null);\n    __decorate$34([\n        _angular_core.HostListener('focus'), \n        __metadata$34('design:type', Function), \n        __metadata$34('design:paramtypes', []), \n        __metadata$34('design:returntype', void 0)\n    ], Md2Tags.prototype, \"onFocus\", null);\n    Md2Tags = __decorate$34([\n        _angular_core.Component({selector: 'md2-tags',\n            template: \"\\n    <div class=\\\"md2-tags-container\\\">\\n      <span *ngFor=\\\"let t of items; let i = index;\\\" class=\\\"md2-tag\\\" [class.active]=\\\"selectedTag === i\\\" (click)=\\\"selectTag(i)\\\">\\n        <span class=\\\"md2-tag-text\\\">{{t.text}}</span>\\n        <svg (click)=\\\"removeTagAndFocusInput(i)\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n          <path d=\\\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\\\" />\\n        </svg>\\n      </span>\\n      <span class=\\\"md2-tag-add\\\">\\n        <input [(ngModel)]=\\\"tagBuffer\\\" type=\\\"text\\\" tabs=\\\"false\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" [disabled]=\\\"disabled\\\" class=\\\"md2-tags-input\\\" [placeholder]=\\\"placeholder\\\" (focus)=\\\"onInputFocus()\\\" (blur)=\\\"onInputBlur()\\\" (keydown)=\\\"inputKeydown($event)\\\" (change)=\\\"$event.stopPropagation()\\\" />\\n        <ul *ngIf=\\\"isMenuVisible\\\" class=\\\"md2-tags-menu\\\" (mouseenter)=\\\"listEnter()\\\" (mouseleave)=\\\"listLeave()\\\">\\n          <li class=\\\"md2-option\\\" *ngFor=\\\"let l of list; let i = index;\\\" [class.focused]=\\\"focusedTag === i\\\" (click)=\\\"addTag($event, i)\\\">\\n            <span class=\\\"md2-option-text\\\" [innerHtml]=\\\"l.text | highlight:tagBuffer\\\"></span>\\n          </li>\\n        </ul>\\n      </span>\\n    </div>\\n  \",\n            styles: [\"\\n    md2-tags { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -moz-backface-visibility: hidden; -webkit-backface-visibility: hidden; backface-visibility: hidden; }\\n    md2-tags:focus { outline: none; }\\n    md2-tags .md2-tags-container { position: relative; display: block; max-width: 100%; padding: 2px 3px 8px; border-bottom: 1px solid rgba(0, 0, 0, 0.38); -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; min-width: 64px; min-height: 26px; cursor: text; }\\n    md2-tags .md2-tags-container:before, md2-tags .md2-tags-container:after { display: table; content: \\\" \\\"; }\\n    md2-tags .md2-tags-container:after { clear: both; }\\n    md2-tags.focus .md2-tags-container { padding-bottom: 7px; border-bottom: 2px solid #106cc8; }\\n    md2-tags.md2-tags-disabled .md2-tags-container { color: rgba(0,0,0,0.38); cursor: default; }\\n    md2-tags.md2-tags-disabled.focus .md2-tags-container { padding-bottom: 8px; border-bottom: 1px solid rgba(0, 0, 0, 0.38); }\\n    md2-tags .md2-tags-container .md2-tag { position: relative; cursor: default; border-radius: 16px; display: block; height: 32px; line-height: 32px; margin: 8px 8px 0 0; padding: 0 26px 0 12px; float: left; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; max-width: 100%; background: rgb(224,224,224); color: rgb(66,66,66); white-space: nowrap; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; }\\n    md2-tags .md2-tags-container .md2-tag.active { background: #106cc8; color: rgba(255,255,255,0.87); }\\n    md2-tags .md2-tags-container .md2-tag svg { position: absolute; top: 4px; right: 2px; cursor: pointer; display: inline-block; overflow: hidden;fill: currentColor; color: rgba(0,0,0,0.54); }\\n    md2-tags .md2-tag.active svg { color: rgba(255,255,255,0.87); }\\n    md2-tags .md2-tag-add { position: relative; display: inline-block; }\\n    md2-tags input { border: 0; outline: 0; margin-top: 8px; height: 32px; line-height: 32px; padding: 0; color: rgba(0,0,0,0.87); background: 0 0; }\\n    md2-tags .md2-tags-container .md2-tags-placeholder { color: rgba(0, 0, 0, 0.38); }\\n    md2-tags .md2-tags-menu { position: absolute; left: 0; top: 100%; display: block; z-index: 10; -ms-flex-direction: column; -webkit-flex-direction: column; flex-direction: column; width: 100%; margin: 6px 0 0; padding: 8px 0; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); max-height: 256px; min-height: 48px; overflow-y: auto; -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); -webkit-transform: scale(1); transform: scale(1); background: #fff; }\\n    md2-tags .md2-tags-menu .md2-option { cursor: pointer; position: relative; display: block; color: #212121; align-items: center; width: auto; -moz-transition: background 0.15s linear; -o-transition: background 0.15s linear; -webkit-transition: background 0.15s linear; transition: background 0.15s linear; padding: 0 16px; height: 48px; line-height: 48px; }\\n    md2-tags .md2-tags-menu .md2-option:hover, md2-tags .md2-tags-menu .md2-option.focused { background: #eeeeee; }\\n    md2-tags .md2-tags-menu .md2-option .md2-option-text { width: auto; white-space: nowrap; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; font-size: 16px; }\\n    md2-tags .highlight { color: #757575; }\\n  \"],\n            host: {\n                'role': 'tags',\n                '[id]': 'id',\n                '[class.focus]': 'inputFocused || selectedTag >= 0',\n                '[class.md2-tags-disabled]': 'disabled',\n                '[tabindex]': 'disabled ? -1 : tabindex',\n                '[attr.aria-disabled]': 'disabled'\n            },\n            providers: [MD2_TAGS_CONTROL_VALUE_ACCESSOR],\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$34('design:paramtypes', [_angular_core.ElementRef])\n    ], Md2Tags);\n    return Md2Tags;\n}());\nvar MD2_TAGS_DIRECTIVES = [Md2Tags];\nvar Md2TagsModule = (function () {\n    function Md2TagsModule() {\n    }\n    Md2TagsModule.forRoot = function () {\n        return {\n            ngModule: Md2TagsModule,\n            providers: []\n        };\n    };\n    Md2TagsModule = __decorate$34([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule, _angular_forms.FormsModule, Md2AutocompleteModule],\n            exports: MD2_TAGS_DIRECTIVES,\n            declarations: MD2_TAGS_DIRECTIVES,\n        }), \n        __metadata$34('design:paramtypes', [])\n    ], Md2TagsModule);\n    return Md2TagsModule;\n}());\n\nvar __decorate$36 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$36 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2ToastComponent = (function () {\n    function Md2ToastComponent() {\n        this.toasts = [];\n        this.maxShown = 5;\n    }\n    /**\n     * add toast\n     * @param toast toast object with all parameters\n     */\n    Md2ToastComponent.prototype.add = function (toast) {\n        var _this = this;\n        setTimeout(function () {\n            toast.isVisible = true;\n        }, 1);\n        this.toasts.push(toast);\n        if (this.toasts.length > this.maxShown) {\n            this.toasts[0].isVisible = false;\n            setTimeout(function () {\n                _this.toasts.splice(0, (_this.toasts.length - _this.maxShown));\n            }, 250);\n        }\n    };\n    /**\n     * remove toast\n     * @param toastId number of toast id\n     */\n    Md2ToastComponent.prototype.remove = function (toastId) {\n        var _this = this;\n        this.toasts.forEach(function (t) { if (t.id === toastId) {\n            t.isVisible = false;\n        } });\n        setTimeout(function () {\n            _this.toasts = _this.toasts.filter(function (toast) { return toast.id !== toastId; });\n        }, 250);\n    };\n    /**\n     * remove all toasts\n     * @param toastId number of toast id\n     */\n    Md2ToastComponent.prototype.removeAll = function () {\n        var _this = this;\n        this.toasts.forEach(function (t) { t.isVisible = false; });\n        setTimeout(function () {\n            _this.toasts = [];\n        }, 250);\n    };\n    /**\n     * check has any toast\n     * @return boolean\n     */\n    Md2ToastComponent.prototype.hasToast = function () { return this.toasts.length > 0; };\n    Md2ToastComponent = __decorate$36([\n        _angular_core.Component({\n            selector: 'md2-toast',\n            template: \"\\n    <div class=\\\"md2-toast-wrapper\\\">\\n      <div *ngFor=\\\"let toast of toasts\\\" class=\\\"md2-toast\\\" [class.in]=\\\"toast.isVisible\\\" (click)=\\\"remove(toast.id)\\\">{{toast.message}}</div>\\n    </div>\\n  \",\n            styles: [\"\\n    .md2-toast-wrapper { position: fixed; top: 0; right: 0; z-index: 1060; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; cursor: default; overflow: hidden; min-width: 304px; max-width: 100%; padding: 8px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }\\n    .md2-toast { position: relative; padding: 14px 24px; margin-bottom: 5px; display: block; margin-top: -53px; opacity: 0; background-color: #323232; color: #fafafa; box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); border-radius: 2px; font-size: 14px; overflow: hidden; -ms-word-wrap: break-word; word-wrap: break-word; transition: all .25s linear; }\\n    .md2-toast.in { margin-top: 0; opacity: 1; }\\n  \"],\n            encapsulation: _angular_core.ViewEncapsulation.None,\n        }), \n        __metadata$36('design:paramtypes', [])\n    ], Md2ToastComponent);\n    return Md2ToastComponent;\n}());\n\nvar __decorate$35 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$35 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Toast = (function () {\n    function Toast(message) {\n        this.message = message;\n    }\n    return Toast;\n}());\nvar Md2Toast = (function () {\n    function Md2Toast(_componentFactory, _appRef) {\n        this._componentFactory = _componentFactory;\n        this._appRef = _appRef;\n        this.delay = 3000;\n        this.index = 0;\n    }\n    /**\n     * toast message\n     * @param toast string or object with message and other properties of toast\n     */\n    Md2Toast.prototype.toast = function (toast) {\n        this.show(toast);\n    };\n    /**\n     * show toast\n     * @param toastObj string or object with message and other properties of toast\n     */\n    Md2Toast.prototype.show = function (toastObj) {\n        var toast;\n        if (typeof toastObj === 'string') {\n            toast = new Toast(toastObj);\n        }\n        else if (typeof toastObj === 'object') {\n            toast = new Toast(toastObj.message);\n            this.delay = toastObj.hideDelay;\n        }\n        if (toast) {\n            if (!this.container) {\n                var app = this._appRef;\n                var appContainer = app['_rootComponents'][0]['_hostElement'].vcRef;\n                var providers = _angular_core.ReflectiveInjector.resolve([]);\n                var toastFactory = this._componentFactory.resolveComponentFactory(Md2ToastComponent);\n                var childInjector = _angular_core.ReflectiveInjector.fromResolvedProviders(providers, appContainer.parentInjector);\n                this.container = appContainer.createComponent(toastFactory, appContainer.length, childInjector);\n                this.setupToast(toast);\n            }\n            else {\n                this.setupToast(toast);\n            }\n        }\n    };\n    /**\n     * toast timeout\n     * @param toastId\n     */\n    Md2Toast.prototype.startTimeout = function (toastId) {\n        var _this = this;\n        setTimeout(function () {\n            _this.clear(toastId);\n        }, this.delay);\n    };\n    /**\n     * setup toast\n     * @param toast\n     */\n    Md2Toast.prototype.setupToast = function (toast) {\n        toast.id = ++this.index;\n        this.container.instance.add(toast);\n        this.startTimeout(toast.id);\n    };\n    /**\n     * clear specific toast\n     * @param toastId\n     */\n    Md2Toast.prototype.clear = function (toastId) {\n        var _this = this;\n        if (this.container) {\n            var instance_1 = this.container.instance;\n            instance_1.remove(toastId);\n            setTimeout(function () {\n                if (!instance_1.hasToast()) {\n                    _this.dispose();\n                }\n            }, 250);\n        }\n    };\n    /**\n     * clear all toasts\n     */\n    Md2Toast.prototype.clearAll = function () {\n        var _this = this;\n        if (this.container) {\n            var instance_2 = this.container.instance;\n            instance_2.removeAll();\n            setTimeout(function () {\n                if (!instance_2.hasToast()) {\n                    _this.dispose();\n                }\n            }, 250);\n        }\n    };\n    /**\n     * dispose all toasts\n     */\n    Md2Toast.prototype.dispose = function () {\n        this.container.destroy();\n        this.container = null;\n    };\n    Md2Toast = __decorate$35([\n        _angular_core.Injectable(), \n        __metadata$35('design:paramtypes', [_angular_core.ComponentFactoryResolver, _angular_core.ApplicationRef])\n    ], Md2Toast);\n    return Md2Toast;\n}());\nvar MD2_TOAST_DIRECTIVES = [Md2ToastComponent];\nvar Md2ToastModule = (function () {\n    function Md2ToastModule() {\n    }\n    Md2ToastModule.forRoot = function () {\n        return {\n            ngModule: Md2ToastModule,\n            providers: []\n        };\n    };\n    Md2ToastModule = __decorate$35([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_TOAST_DIRECTIVES,\n            declarations: MD2_TOAST_DIRECTIVES,\n            providers: [Md2Toast],\n            entryComponents: MD2_TOAST_DIRECTIVES\n        }), \n        __metadata$35('design:paramtypes', [])\n    ], Md2ToastModule);\n    return Md2ToastModule;\n}());\n\nvar __decorate$37 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$37 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar Md2Tooltip = (function () {\n    function Md2Tooltip(_componentFactory, _appRef, _viewContainer) {\n        this._componentFactory = _componentFactory;\n        this._appRef = _appRef;\n        this._viewContainer = _viewContainer;\n        this.visible = false;\n        this.position = 'below';\n        this.delay = 0;\n    }\n    /**\n     * show tooltip while mouse enter or focus of element\n     * @param event\n     */\n    Md2Tooltip.prototype.show = function (event) {\n        var _this = this;\n        if (this.visible) {\n            return;\n        }\n        this.visible = true;\n        clearTimeout(this.timer);\n        this.timer = setTimeout(function () {\n            _this.timer = 0;\n            var app = _this._appRef;\n            var appContainer = app['_rootComponents'][0]['_hostElement'].vcRef;\n            var toastFactory = _this._componentFactory.resolveComponentFactory(Md2TooltipComponent);\n            var childInjector = _angular_core.ReflectiveInjector.fromResolvedProviders([], appContainer.parentInjector);\n            _this.tooltip = appContainer.createComponent(toastFactory, appContainer.length, childInjector);\n            _this.tooltip.instance.message = _this.message;\n            _this.tooltip.instance.position = _this.position;\n            _this.tooltip.instance.hostEl = _this._viewContainer.element;\n        }, this.delay);\n    };\n    /**\n     * hide tooltip while mouse our/leave or blur of element\n     * @param event\n     */\n    Md2Tooltip.prototype.hide = function (event) {\n        clearTimeout(this.timer);\n        if (!this.visible) {\n            return;\n        }\n        this.visible = false;\n        if (this.tooltip) {\n            this.tooltip.destroy();\n            this.tooltip = null;\n        }\n    };\n    __decorate$37([\n        _angular_core.Input('tooltip'), \n        __metadata$37('design:type', String)\n    ], Md2Tooltip.prototype, \"message\", void 0);\n    __decorate$37([\n        _angular_core.Input('tooltip-position'), \n        __metadata$37('design:type', String)\n    ], Md2Tooltip.prototype, \"position\", void 0);\n    __decorate$37([\n        _angular_core.Input('tooltip-delay'), \n        __metadata$37('design:type', Number)\n    ], Md2Tooltip.prototype, \"delay\", void 0);\n    __decorate$37([\n        _angular_core.HostListener('focusin', ['$event']),\n        _angular_core.HostListener('mouseenter', ['$event']), \n        __metadata$37('design:type', Function), \n        __metadata$37('design:paramtypes', [Event]), \n        __metadata$37('design:returntype', void 0)\n    ], Md2Tooltip.prototype, \"show\", null);\n    __decorate$37([\n        _angular_core.HostListener('focusout', ['$event']),\n        _angular_core.HostListener('mouseleave', ['$event']), \n        __metadata$37('design:type', Function), \n        __metadata$37('design:paramtypes', [Event]), \n        __metadata$37('design:returntype', void 0)\n    ], Md2Tooltip.prototype, \"hide\", null);\n    Md2Tooltip = __decorate$37([\n        _angular_core.Directive({\n            selector: '[tooltip]'\n        }), \n        __metadata$37('design:paramtypes', [_angular_core.ComponentFactoryResolver, _angular_core.ApplicationRef, _angular_core.ViewContainerRef])\n    ], Md2Tooltip);\n    return Md2Tooltip;\n}());\nvar Md2TooltipComponent = (function () {\n    function Md2TooltipComponent(_element, _changeDetector) {\n        this._element = _element;\n        this._changeDetector = _changeDetector;\n        this.top = '-1000px';\n        this.left = '-1000px';\n        this._isVisible = false;\n    }\n    Md2TooltipComponent.prototype.ngAfterViewInit = function () {\n        var _position = this.positionElements(this.hostEl.nativeElement, this._element.nativeElement.children[0], this.position);\n        this.top = _position.top + 'px';\n        this.left = _position.left + 'px';\n        this._isVisible = true;\n        this._changeDetector.detectChanges();\n    };\n    /**\n     * calculate position of target element\n     * @param hostEl host element\n     * @param targetEl targer element\n     * @param position position\n     * @return {top: number, left: number} object of top, left properties\n     */\n    Md2TooltipComponent.prototype.positionElements = function (hostEl, targetEl, position) {\n        var positionStrParts = position.split('-');\n        var pos0 = positionStrParts[0];\n        var pos1 = positionStrParts[1] || 'center';\n        var hostElPos = this.offset(hostEl);\n        var targetElWidth = targetEl.offsetWidth;\n        var targetElHeight = targetEl.offsetHeight;\n        var shiftWidth = {\n            center: hostElPos.left + hostElPos.width / 2 - targetElWidth / 2,\n            before: hostElPos.left,\n            after: hostElPos.left + hostElPos.width\n        };\n        var shiftHeight = {\n            center: hostElPos.top + hostElPos.height / 2 - targetElHeight / 2,\n            above: hostElPos.top,\n            below: hostElPos.top + hostElPos.height\n        };\n        var targetElPos;\n        switch (pos0) {\n            case 'before':\n                targetElPos = {\n                    top: shiftHeight[pos1],\n                    left: (hostElPos.left - targetElWidth) // > 0 ? (hostElPos.left - targetElWidth) : (hostElPos.width + hostElPos.left)\n                };\n                break;\n            case 'after':\n                targetElPos = {\n                    top: shiftHeight[pos1],\n                    left: shiftWidth[pos0]\n                };\n                break;\n            case 'above':\n                targetElPos = {\n                    top: hostElPos.top - targetElHeight,\n                    left: shiftWidth[pos1]\n                };\n                break;\n            default:\n                targetElPos = {\n                    top: shiftHeight[pos0],\n                    left: shiftWidth[pos1]\n                };\n                break;\n        }\n        return targetElPos;\n    };\n    /**\n     * calculate offset of target element\n     * @param nativeEl element\n     * @return {width: number, height: number,top: number, left: number} object of with, height, top, left properties\n     */\n    Md2TooltipComponent.prototype.offset = function (nativeEl) {\n        var boundingClientRect = nativeEl.getBoundingClientRect();\n        return {\n            width: boundingClientRect.width || nativeEl.offsetWidth,\n            height: boundingClientRect.height || nativeEl.offsetHeight,\n            top: boundingClientRect.top,\n            left: boundingClientRect.left\n        };\n    };\n    Object.defineProperty(Md2TooltipComponent.prototype, \"window\", {\n        get: function () { return window; },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Md2TooltipComponent.prototype, \"document\", {\n        get: function () { return window.document; },\n        enumerable: true,\n        configurable: true\n    });\n    Md2TooltipComponent = __decorate$37([\n        _angular_core.Component({selector: 'md2-tooltip',\n            template: \"\\n    <div class=\\\"md2-tooltip-container\\\" [ngStyle]=\\\"{top: top, left: left}\\\">\\n      <div class=\\\"md2-tooltip {{position}}\\\" [class.visible]=\\\"_isVisible\\\">{{message}}</div>\\n    </div>\\n  \",\n            styles: [\"md2-tooltip { pointer-events: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } md2-tooltip .md2-tooltip-container { position: fixed; display: block; overflow: hidden; z-index: 1070; } md2-tooltip .md2-tooltip { max-width: 200px; margin: 14px; padding: 4px 12px; font-family: \\\"\\\"; color: white; font-size: 10px; word-wrap: break-word; background-color: rgba(97, 97, 97, 0.9); border-radius: 2px; line-height: 1.5; opacity: 0; transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); transform-origin: center top; transform: scale(0); } md2-tooltip .md2-tooltip.before { transform-origin: center right; } md2-tooltip .md2-tooltip.after { transform-origin: center left; } md2-tooltip .md2-tooltip.above { transform-origin: center bottom; } md2-tooltip .md2-tooltip.visible { opacity: 1; transform: scale(1); } /*# sourceMappingURL=tooltip.css.map */ \"],\n            host: {\n                'role': 'tooltip',\n            },\n            encapsulation: _angular_core.ViewEncapsulation.None\n        }), \n        __metadata$37('design:paramtypes', [_angular_core.ElementRef, _angular_core.ChangeDetectorRef])\n    ], Md2TooltipComponent);\n    return Md2TooltipComponent;\n}());\nvar MD2_TOOLTIP_DIRECTIVES = [Md2Tooltip, Md2TooltipComponent];\nvar Md2TooltipModule = (function () {\n    function Md2TooltipModule() {\n    }\n    Md2TooltipModule.forRoot = function () {\n        return {\n            ngModule: Md2TooltipModule,\n            providers: []\n        };\n    };\n    Md2TooltipModule = __decorate$37([\n        _angular_core.NgModule({\n            imports: [_angular_common.CommonModule],\n            exports: MD2_TOOLTIP_DIRECTIVES,\n            declarations: MD2_TOOLTIP_DIRECTIVES,\n            entryComponents: [Md2TooltipComponent]\n        }), \n        __metadata$37('design:paramtypes', [])\n    ], Md2TooltipModule);\n    return Md2TooltipModule;\n}());\n\nvar __decorate$16 = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata$16 = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar MD2_MODULES = [\n    Md2AccordionModule,\n    Md2AutocompleteModule,\n    Md2ChipsModule,\n    Md2CollapseModule,\n    Md2ColorpickerModule,\n    Md2DataTableModule,\n    Md2DatepickerModule,\n    Md2DialogModule,\n    Md2MenuModule,\n    Md2MultiselectModule,\n    Md2SelectModule,\n    Md2TabsModule,\n    Md2TagsModule,\n    Md2ToastModule,\n    Md2TooltipModule,\n    OverlayModule,\n    PortalModule,\n    RtlModule,\n    A11yModule,\n    ProjectionModule,\n    StyleCompatibilityModule,\n];\nvar Md2RootModule = (function () {\n    function Md2RootModule() {\n    }\n    Md2RootModule = __decorate$16([\n        _angular_core.NgModule({\n            imports: [\n                Md2AccordionModule.forRoot(),\n                Md2AutocompleteModule.forRoot(),\n                Md2ChipsModule.forRoot(),\n                Md2CollapseModule.forRoot(),\n                Md2ColorpickerModule.forRoot(),\n                Md2DataTableModule.forRoot(),\n                Md2DatepickerModule.forRoot(),\n                Md2DialogModule.forRoot(),\n                Md2MenuModule.forRoot(),\n                Md2MultiselectModule.forRoot(),\n                Md2SelectModule.forRoot(),\n                Md2TabsModule.forRoot(),\n                Md2TagsModule.forRoot(),\n                Md2ToastModule.forRoot(),\n                Md2TooltipModule.forRoot(),\n                PortalModule.forRoot(),\n                ProjectionModule.forRoot(),\n                RtlModule.forRoot(),\n                A11yModule.forRoot(),\n                OverlayModule.forRoot(),\n                StyleCompatibilityModule.forRoot(),\n            ],\n            exports: MD2_MODULES,\n        }), \n        __metadata$16('design:paramtypes', [])\n    ], Md2RootModule);\n    return Md2RootModule;\n}());\nvar Md2Module = (function () {\n    function Md2Module() {\n    }\n    Md2Module.forRoot = function () {\n        return { ngModule: Md2RootModule };\n    };\n    Md2Module = __decorate$16([\n        _angular_core.NgModule({\n            imports: MD2_MODULES,\n            exports: MD2_MODULES,\n        }), \n        __metadata$16('design:paramtypes', [])\n    ], Md2Module);\n    return Md2Module;\n}());\n\nexports.MdCoreModule = MdCoreModule;\nexports.Dir = Dir;\nexports.RtlModule = RtlModule;\nexports.Portal = Portal;\nexports.BasePortalHost = BasePortalHost;\nexports.ComponentPortal = ComponentPortal;\nexports.TemplatePortal = TemplatePortal;\nexports.PortalHostDirective = PortalHostDirective;\nexports.TemplatePortalDirective = TemplatePortalDirective;\nexports.PortalModule = PortalModule;\nexports.DomPortalHost = DomPortalHost;\nexports.Overlay = Overlay;\nexports.OVERLAY_PROVIDERS = OVERLAY_PROVIDERS;\nexports.OverlayContainer = OverlayContainer;\nexports.OverlayRef = OverlayRef;\nexports.OverlayState = OverlayState;\nexports.ConnectedOverlayDirective = ConnectedOverlayDirective;\nexports.OverlayOrigin = OverlayOrigin;\nexports.OverlayModule = OverlayModule;\nexports.MdRipple = MdRipple;\nexports.MdRippleModule = MdRippleModule;\nexports.MdLiveAnnouncer = MdLiveAnnouncer;\nexports.LIVE_ANNOUNCER_ELEMENT_TOKEN = LIVE_ANNOUNCER_ELEMENT_TOKEN;\nexports.FocusTrap = FocusTrap;\nexports.InteractivityChecker = InteractivityChecker;\nexports.isFakeMousedownFromScreenReader = isFakeMousedownFromScreenReader;\nexports.A11yModule = A11yModule;\nexports.MdUniqueSelectionDispatcher = MdUniqueSelectionDispatcher;\nexports.MdLineModule = MdLineModule;\nexports.MdLine = MdLine;\nexports.MdLineSetter = MdLineSetter;\nexports.applyCssTransform = applyCssTransform;\nexports.MdError = MdError;\nexports.coerceBooleanProperty = coerceBooleanProperty;\nexports.coerceNumberProperty = coerceNumberProperty;\nexports.DomProjectionHost = DomProjectionHost;\nexports.DomProjection = DomProjection;\nexports.ProjectionModule = ProjectionModule;\nexports.ConnectedPositionStrategy = ConnectedPositionStrategy;\nexports.ConnectionPositionPair = ConnectionPositionPair;\nexports.ConnectedOverlayPositionChange = ConnectedOverlayPositionChange;\nexports.UP_ARROW = UP_ARROW;\nexports.DOWN_ARROW = DOWN_ARROW;\nexports.RIGHT_ARROW = RIGHT_ARROW;\nexports.LEFT_ARROW = LEFT_ARROW;\nexports.PAGE_UP = PAGE_UP;\nexports.PAGE_DOWN = PAGE_DOWN;\nexports.HOME = HOME;\nexports.END = END;\nexports.ENTER = ENTER;\nexports.SPACE = SPACE;\nexports.TAB = TAB;\nexports.ESCAPE = ESCAPE;\nexports.ELEMENTS_SELECTOR = ELEMENTS_SELECTOR;\nexports.StyleCompatibility = StyleCompatibility;\nexports.StyleCompatibilityModule = StyleCompatibilityModule;\nexports.AnimationCurves = AnimationCurves;\nexports.AnimationDurations = AnimationDurations;\nexports.Md2RootModule = Md2RootModule;\nexports.Md2Module = Md2Module;\nexports.MD2_ACCORDION_DIRECTIVES = MD2_ACCORDION_DIRECTIVES;\nexports.Md2AccordionModule = Md2AccordionModule;\nexports.Md2Accordion = Md2Accordion;\nexports.Md2AccordionHeader = Md2AccordionHeader;\nexports.Md2AccordionTab = Md2AccordionTab;\nexports.MD2_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR = MD2_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR;\nexports.Md2Autocomplete = Md2Autocomplete;\nexports.MD2_AUTOCOMPLETE_DIRECTIVES = MD2_AUTOCOMPLETE_DIRECTIVES;\nexports.Md2AutocompleteModule = Md2AutocompleteModule;\nexports.MD2_CHIPS_CONTROL_VALUE_ACCESSOR = MD2_CHIPS_CONTROL_VALUE_ACCESSOR;\nexports.Md2Chips = Md2Chips;\nexports.MD2_CHIPS_DIRECTIVES = MD2_CHIPS_DIRECTIVES;\nexports.Md2ChipsModule = Md2ChipsModule;\nexports.Md2Collapse = Md2Collapse;\nexports.MD2_COLLAPSE_DIRECTIVES = MD2_COLLAPSE_DIRECTIVES;\nexports.Md2CollapseModule = Md2CollapseModule;\nexports.MD2_COLORPICKER_CONTROL_VALUE_ACCESSOR = MD2_COLORPICKER_CONTROL_VALUE_ACCESSOR;\nexports.TextDirective = TextDirective;\nexports.ColorpickerSliderDirective = ColorpickerSliderDirective;\nexports.Md2Colorpicker = Md2Colorpicker;\nexports.Hsva = Hsva;\nexports.Hsla = Hsla;\nexports.Rgba = Rgba;\nexports.SliderPosition = SliderPosition;\nexports.SliderDimension = SliderDimension;\nexports.MD2_COLORPICKER_DIRECTIVES = MD2_COLORPICKER_DIRECTIVES;\nexports.Md2ColorpickerModule = Md2ColorpickerModule;\nexports.Md2DataTable = Md2DataTable;\nexports.Md2DataTableSortField = Md2DataTableSortField;\nexports.Md2Pagination = Md2Pagination;\nexports.MD2_DATA_TABLE_DIRECTIVES = MD2_DATA_TABLE_DIRECTIVES;\nexports.Md2DataTableModule = Md2DataTableModule;\nexports.MD2_DATEPICKER_CONTROL_VALUE_ACCESSOR = MD2_DATEPICKER_CONTROL_VALUE_ACCESSOR;\nexports.Md2Datepicker = Md2Datepicker;\nexports.MD2_DATEPICKER_DIRECTIVES = MD2_DATEPICKER_DIRECTIVES;\nexports.Md2DatepickerModule = Md2DatepickerModule;\nexports.Md2DialogPortal = Md2DialogPortal;\nexports.Md2DialogTitle = Md2DialogTitle;\nexports.Md2DialogFooter = Md2DialogFooter;\nexports.Md2Dialog = Md2Dialog;\nexports.MD2_DIALOG_DIRECTIVES = MD2_DIALOG_DIRECTIVES;\nexports.MD2_DIALOG_PROVIDERS = MD2_DIALOG_PROVIDERS;\nexports.Md2DialogModule = Md2DialogModule;\nexports.Md2MenuNotClosable = Md2MenuNotClosable;\nexports.Md2Menu = Md2Menu;\nexports.Md2MenuOpen = Md2MenuOpen;\nexports.MD2_MENU_DIRECTIVES = MD2_MENU_DIRECTIVES;\nexports.Md2MenuModule = Md2MenuModule;\nexports.MD2_MULTISELECT_CONTROL_VALUE_ACCESSOR = MD2_MULTISELECT_CONTROL_VALUE_ACCESSOR;\nexports.Md2Multiselect = Md2Multiselect;\nexports.MD2_MULTISELECT_DIRECTIVES = MD2_MULTISELECT_DIRECTIVES;\nexports.Md2MultiselectModule = Md2MultiselectModule;\nexports.Md2SelectDispatcher = Md2SelectDispatcher;\nexports.Md2SelectChange = Md2SelectChange;\nexports.Md2Select = Md2Select;\nexports.Md2Option = Md2Option;\nexports.MD2_SELECT_DIRECTIVES = MD2_SELECT_DIRECTIVES;\nexports.Md2SelectModule = Md2SelectModule;\nexports.Md2TabChangeEvent = Md2TabChangeEvent;\nexports.Md2Transclude = Md2Transclude;\nexports.Md2Tab = Md2Tab;\nexports.Md2TabLabel = Md2TabLabel;\nexports.Md2Tabs = Md2Tabs;\nexports.MD2_TABS_DIRECTIVES = MD2_TABS_DIRECTIVES;\nexports.Md2TabsModule = Md2TabsModule;\nexports.MD2_TAGS_CONTROL_VALUE_ACCESSOR = MD2_TAGS_CONTROL_VALUE_ACCESSOR;\nexports.Md2Tags = Md2Tags;\nexports.MD2_TAGS_DIRECTIVES = MD2_TAGS_DIRECTIVES;\nexports.Md2TagsModule = Md2TagsModule;\nexports.Toast = Toast;\nexports.Md2Toast = Md2Toast;\nexports.MD2_TOAST_DIRECTIVES = MD2_TOAST_DIRECTIVES;\nexports.Md2ToastModule = Md2ToastModule;\nexports.Md2Tooltip = Md2Tooltip;\nexports.Md2TooltipComponent = Md2TooltipComponent;\nexports.MD2_TOOLTIP_DIRECTIVES = MD2_TOOLTIP_DIRECTIVES;\nexports.Md2TooltipModule = Md2TooltipModule;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n//# sourceMappingURL=./md2.umd.js.map\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/md2/md2.umd.js\n ** module id = 768\n ** module chunks = 2\n **/","\"use strict\";\nvar core_1 = require('@angular/core');\n/* tslint:disable-next-line */\nvar BaseChartDirective = (function () {\n    function BaseChartDirective(element) {\n        this.labels = [];\n        this.options = {};\n        this.chartClick = new core_1.EventEmitter();\n        this.chartHover = new core_1.EventEmitter();\n        this.initFlag = false;\n        this.element = element;\n    }\n    BaseChartDirective.prototype.ngOnInit = function () {\n        this.ctx = this.element.nativeElement.getContext('2d');\n        this.cvs = this.element.nativeElement;\n        this.initFlag = true;\n        if (this.data || this.datasets) {\n            this.refresh();\n        }\n    };\n    BaseChartDirective.prototype.ngOnChanges = function (changes) {\n        if (this.initFlag) {\n            // Check if the changes are in the data or datasets\n            if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) {\n                this.chart.data.datasets = this.getDatasets();\n                if (changes.hasOwnProperty('labels')) {\n                    this.chart.data.labels = this.labels;\n                }\n                this.chart.update();\n            }\n            else {\n                this.refresh();\n            }\n        }\n    };\n    BaseChartDirective.prototype.ngOnDestroy = function () {\n        if (this.chart) {\n            this.chart.destroy();\n            this.chart = void 0;\n        }\n    };\n    BaseChartDirective.prototype.getChartBuilder = function (ctx /*, data:Array<any>, options:any*/) {\n        var _this = this;\n        var datasets = this.getDatasets();\n        var options = Object.assign({}, this.options);\n        if (this.legend === false) {\n            options.legend = { display: false };\n        }\n        // hock for onHover and onClick events\n        options.hover = options.hover || {};\n        if (!options.hover.onHover) {\n            options.hover.onHover = function (active) {\n                if (active && !active.length) {\n                    return;\n                }\n                _this.chartHover.emit({ active: active });\n            };\n        }\n        if (!options.onClick) {\n            options.onClick = function (event, active) {\n                _this.chartClick.emit({ event: event, active: active });\n            };\n        }\n        var opts = {\n            type: this.chartType,\n            data: {\n                labels: this.labels,\n                datasets: datasets\n            },\n            options: options\n        };\n        if (typeof Chart === 'undefined') {\n            throw new Error('ng2-charts configuration issue: Embedding Chart.js lib is mandatory');\n        }\n        return new Chart(ctx, opts);\n    };\n    BaseChartDirective.prototype.getDatasets = function () {\n        var _this = this;\n        var datasets = void 0;\n        // in case if datasets is not provided, but data is present\n        if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) {\n            if (Array.isArray(this.data[0])) {\n                datasets = this.data.map(function (data, index) {\n                    return { data: data, label: _this.labels[index] || \"Label \" + index };\n                });\n            }\n            else {\n                datasets = [{ data: this.data, label: \"Label 0\" }];\n            }\n        }\n        if (this.datasets && this.datasets.length ||\n            (datasets && datasets.length)) {\n            datasets = (this.datasets || datasets)\n                .map(function (elm, index) {\n                var newElm = Object.assign({}, elm);\n                if (_this.colors && _this.colors.length) {\n                    Object.assign(newElm, _this.colors[index]);\n                }\n                else {\n                    Object.assign(newElm, getColors(_this.chartType, index, newElm.data.length));\n                }\n                return newElm;\n            });\n        }\n        if (!datasets) {\n            throw new Error(\"ng-charts configuration error, \\n      data or datasets field are required to render char \" + this.chartType);\n        }\n        return datasets;\n    };\n    BaseChartDirective.prototype.refresh = function () {\n        // if (this.options && this.options.responsive) {\n        //   setTimeout(() => this.refresh(), 50);\n        // }\n        // todo: remove this line, it is producing flickering\n        this.ngOnDestroy();\n        this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);\n    };\n    BaseChartDirective.defaultColors = [\n        [255, 99, 132],\n        [54, 162, 235],\n        [255, 206, 86],\n        [231, 233, 237],\n        [75, 192, 192],\n        [151, 187, 205],\n        [220, 220, 220],\n        [247, 70, 74],\n        [70, 191, 189],\n        [253, 180, 92],\n        [148, 159, 177],\n        [77, 83, 96]\n    ];\n    BaseChartDirective.decorators = [\n        { type: core_1.Directive, args: [{ selector: 'canvas[baseChart]' },] },\n    ];\n    /** @nocollapse */\n    BaseChartDirective.ctorParameters = [\n        { type: core_1.ElementRef, },\n    ];\n    BaseChartDirective.propDecorators = {\n        'data': [{ type: core_1.Input },],\n        'datasets': [{ type: core_1.Input },],\n        'labels': [{ type: core_1.Input },],\n        'options': [{ type: core_1.Input },],\n        'chartType': [{ type: core_1.Input },],\n        'colors': [{ type: core_1.Input },],\n        'legend': [{ type: core_1.Input },],\n        'chartClick': [{ type: core_1.Output },],\n        'chartHover': [{ type: core_1.Output },],\n    };\n    return BaseChartDirective;\n}());\nexports.BaseChartDirective = BaseChartDirective;\nfunction rgba(colour, alpha) {\n    return 'rgba(' + colour.concat(alpha).join(',') + ')';\n}\nfunction getRandomInt(min, max) {\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n}\nfunction formatLineColor(colors) {\n    return {\n        backgroundColor: rgba(colors, 0.4),\n        borderColor: rgba(colors, 1),\n        pointBackgroundColor: rgba(colors, 1),\n        pointBorderColor: '#fff',\n        pointHoverBackgroundColor: '#fff',\n        pointHoverBorderColor: rgba(colors, 0.8)\n    };\n}\nfunction formatBarColor(colors) {\n    return {\n        backgroundColor: rgba(colors, 0.6),\n        borderColor: rgba(colors, 1),\n        hoverBackgroundColor: rgba(colors, 0.8),\n        hoverBorderColor: rgba(colors, 1)\n    };\n}\nfunction formatPieColors(colors) {\n    return {\n        backgroundColor: colors.map(function (color) { return rgba(color, 0.6); }),\n        borderColor: colors.map(function () { return '#fff'; }),\n        pointBackgroundColor: colors.map(function (color) { return rgba(color, 1); }),\n        pointBorderColor: colors.map(function () { return '#fff'; }),\n        pointHoverBackgroundColor: colors.map(function (color) { return rgba(color, 1); }),\n        pointHoverBorderColor: colors.map(function (color) { return rgba(color, 1); })\n    };\n}\nfunction formatPolarAreaColors(colors) {\n    return {\n        backgroundColor: colors.map(function (color) { return rgba(color, 0.6); }),\n        borderColor: colors.map(function (color) { return rgba(color, 1); }),\n        hoverBackgroundColor: colors.map(function (color) { return rgba(color, 0.8); }),\n        hoverBorderColor: colors.map(function (color) { return rgba(color, 1); })\n    };\n}\nfunction getRandomColor() {\n    return [getRandomInt(0, 255), getRandomInt(0, 255), getRandomInt(0, 255)];\n}\n/**\n * Generate colors for line|bar charts\n * @param index\n * @returns {number[]|Color}\n */\nfunction generateColor(index) {\n    return BaseChartDirective.defaultColors[index] || getRandomColor();\n}\n/**\n * Generate colors for pie|doughnut charts\n * @param count\n * @returns {Colors}\n */\nfunction generateColors(count) {\n    var colorsArr = new Array(count);\n    for (var i = 0; i < count; i++) {\n        colorsArr[i] = BaseChartDirective.defaultColors[i] || getRandomColor();\n    }\n    return colorsArr;\n}\n/**\n * Generate colors by chart type\n * @param chartType\n * @param index\n * @param count\n * @returns {Color}\n */\nfunction getColors(chartType, index, count) {\n    if (chartType === 'pie' || chartType === 'doughnut') {\n        return formatPieColors(generateColors(count));\n    }\n    if (chartType === 'polarArea') {\n        return formatPolarAreaColors(generateColors(count));\n    }\n    if (chartType === 'line' || chartType === 'radar') {\n        return formatLineColor(generateColor(index));\n    }\n    if (chartType === 'bar' || chartType === 'horizontalBar') {\n        return formatBarColor(generateColor(index));\n    }\n    return generateColor(index);\n}\nvar ChartsModule = (function () {\n    function ChartsModule() {\n    }\n    ChartsModule.decorators = [\n        { type: core_1.NgModule, args: [{\n                    declarations: [\n                        BaseChartDirective\n                    ],\n                    exports: [\n                        BaseChartDirective\n                    ],\n                    imports: []\n                },] },\n    ];\n    /** @nocollapse */\n    ChartsModule.ctorParameters = [];\n    return ChartsModule;\n}());\nexports.ChartsModule = ChartsModule;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-charts/components/charts/charts.js\n ** module id = 770\n ** module chunks = 2\n **/","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports,require(\"@angular/core\"),require(\"@angular/forms\"),require(\"@angular/http\"),require(\"rxjs/add/operator/catch\"),require(\"rxjs/Observable\"),require(\"rxjs/Subject\"),require(\"rxjs/add/operator/map\"),require(\"rxjs/Rx\"),require(\"@angular/common\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"@angular/core\",\"@angular/forms\",\"@angular/http\",\"rxjs/add/operator/catch\",\"rxjs/Observable\",\"rxjs/Subject\",\"rxjs/add/operator/map\",\"rxjs/Rx\",\"@angular/common\"],e):e(t.ng2Completer=t.ng2Completer||{},t.ng.core,t._angular_forms,t._angular_http,t.rxjs_add_operator_catch,t.Rx,t.Rx,t.rxjs_add_operator_map,t.Rx,t.ng.common)}(this,function(t,e,r,i,o,n,s,c,a,h){\"use strict\";function l(){return function(){return new H}}function p(t){return function(){return new R(t)}}var u=function(){function t(){this.selected=new e.EventEmitter,this.highlighted=new e.EventEmitter,this._hasHighlited=!1,this.hasSelected=!1}return t.prototype.ngOnInit=function(){},t.prototype.registerList=function(t){this.list=t},t.prototype.registerDropdown=function(t){this.dropdown=t},t.prototype.onHighlighted=function(t){this.highlighted.emit(t),this._hasHighlited=!0},t.prototype.onSelected=function(t){this.selected.emit(t),this.hasSelected=!0,this.clear()},t.prototype.search=function(t){this.hasSelected&&(this.selected.emit(null),this.hasSelected=!1),this.list&&this.list.search(t)},t.prototype.clear=function(){this.dropdown&&this.dropdown.clear(),this.list&&this.list.clear(),this._hasHighlited=!1},t.prototype.selectCurrent=function(){this.dropdown&&this.dropdown.selectCurrent()},t.prototype.nextRow=function(){this.dropdown&&this.dropdown.nextRow()},t.prototype.prevRow=function(){this.dropdown&&this.dropdown.prevRow()},t.prototype.hasHighlited=function(){return this._hasHighlited},t.decorators=[{type:e.Directive,args:[{selector:\"[ctrCompleter]\"}]}],t.ctorParameters=function(){return[]},t.propDecorators={selected:[{type:e.Output}],highlighted:[{type:e.Output}]},t}(),d=524288,m=3,g=250,f=\"Searching...\",y=\"No results found\",v=100,w=function(){},S={provide:r.NG_VALUE_ACCESSOR,useExisting:e.forwardRef(function(){return x}),multi:!0},x=function(){function t(){this.inputName=\"\",this.pause=g,this.minSearchLength=m,this.maxChars=d,this.overrideSuggested=!1,this.clearSelected=!1,this.placeholder=\"\",this.textSearching=f,this.textNoResults=y,this.autoMatch=!1,this.disableInput=!1,this.selected=new e.EventEmitter,this.highlighted=new e.EventEmitter,this.blur=new e.EventEmitter,this.searchStr=\"\",this.displaySearching=!0,this._onTouchedCallback=w,this._onChangeCallback=w}return Object.defineProperty(t.prototype,\"value\",{get:function(){return this.searchStr},set:function(t){t!==this.searchStr&&(this.searchStr=t,this._onChangeCallback(t))},enumerable:!0,configurable:!0}),t.prototype.onTouched=function(){this._onTouchedCallback()},t.prototype.writeValue=function(t){this.searchStr=t},t.prototype.registerOnChange=function(t){this._onChangeCallback=t},t.prototype.registerOnTouched=function(t){this._onTouchedCallback=t},t.prototype.ngOnInit=function(){var t=this;this.completer.selected.subscribe(function(e){var r=e?e.title:\"\";t.selected.emit(e),t._onChangeCallback(r)}),this.completer.highlighted.subscribe(function(e){t.highlighted.emit(e)}),\"false\"===this.textSearching&&(this.displaySearching=!1)},t.prototype.onBlur=function(){this.blur.emit(),this.onTouched()},t.prototype.open=function(t){void 0===t&&(t=\"\"),this.completer.search(t)},t.prototype.close=function(){this.completer.clear()},t.decorators=[{type:e.Component,args:[{selector:\"ng2-completer\",template:'\\n        <div class=\"completer-holder\" ctrCompleter>\\n            <input class=\"completer-input\" ctrInput [ngClass]=\"inputClass\" [(ngModel)]=\"searchStr\" [attr.name]=\"inputName\" [placeholder]=\"placeholder\" [attr.maxlength]=\"maxChars\"\\n                [tabindex]=\"fieldTabindex\" [disabled]=\"disableInput\" [clearSelected]=\"clearSelected\" [overrideSuggested]=\"overrideSuggested\" (blur)=\"onBlur()\"\\n                autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" />\\n\\n            <div class=\"completer-dropdown-holder\" *ctrList=\"dataService; minSearchLength: minSearchLength; pause: pause; autoMatch: autoMatch; let items = results; let searchActive = searching; let isInitialized = searchInitialized;\">\\n                <div class=\"completer-dropdown\" ctrDropdown *ngIf=\"isInitialized\">\\n                    <div *ngIf=\"searchActive && displaySearching\" class=\"completer-searching\">{{textSearching}}</div>\\n                    <div *ngIf=\"!searchActive && (!items || items.length === 0)\" class=\"completer-no-results\">{{textNoResults}}</div>\\n                    <div class=\"completer-row-wrapper\" *ngFor=\"let item of items; let rowIndex=index\">\\n                        <div class=\"completer-row\" [ctrRow]=\"rowIndex\" [dataItem]=\"item\">\\n                            <div *ngIf=\"item.image || item.image === \\'\\'\" class=\"completer-image-holder\">\\n                                <img *ngIf=\"item.image != \\'\\'\" src=\"{{item.image}}\" class=\"completer-image\" />\\n                                <div *ngIf=\"item.image === \\'\\'\" class=\"completer-image-default\"></div>\\n                            </div>\\n                            <div class=\"completer-item-text\" [ngClass]=\"{\\'completer-item-text-image\\': item.image || item.image === \\'\\' }\">\\n                                <completer-list-item class=\"completer-title\" [text]=\"item.title\" [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"\\'title\\'\"></completer-list-item>\\n                                <completer-list-item *ngIf=\"item.description && item.description != \\'\\'\" class=\"completer-description\" [text]=\"item.description\"\\n                                    [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"\\'description\\'\">\\n                                </completer-list-item>\\n                            </div>\\n                        </div>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n    ',styles:['\\n    .completer-dropdown {\\n        border-color: #ececec;\\n        border-width: 1px;\\n        border-style: solid;\\n        border-radius: 2px;\\n        width: 250px;\\n        padding: 6px;\\n        cursor: pointer;\\n        z-index: 9999;\\n        position: absolute;\\n        margin-top: -6px;\\n        background-color: #ffffff;\\n    }\\n\\n    .completer-row {\\n        padding: 5px;\\n        color: #000000;\\n        margin-bottom: 4px;\\n        clear: both;\\n        display: inline-block;\\n        width: 103%;\\n    }\\n\\n    .completer-selected-row {\\n        background-color: lightblue;\\n        color: #ffffff;\\n    }\\n\\n    .completer-description {\\n        font-size: 14px;\\n    }\\n\\n    .completer-image-default {\\n        width: 16px; \\n        height: 16px;\\n        background-image: url(\"demo/res/img/default.png\");\\n    }\\n\\n    .completer-image-holder {\\n        float: left;\\n        width: 10%;\\n    }\\n    .completer-item-text-image {\\n        float: right;\\n        width: 90%;\\n    }\\n    '],providers:[S]}]}],t.ctorParameters=function(){return[]},t.propDecorators={dataService:[{type:e.Input}],inputName:[{type:e.Input}],pause:[{type:e.Input}],minSearchLength:[{type:e.Input}],maxChars:[{type:e.Input}],overrideSuggested:[{type:e.Input}],clearSelected:[{type:e.Input}],placeholder:[{type:e.Input}],matchClass:[{type:e.Input}],textSearching:[{type:e.Input}],textNoResults:[{type:e.Input}],fieldTabindex:[{type:e.Input}],autoMatch:[{type:e.Input}],disableInput:[{type:e.Input}],inputClass:[{type:e.Input}],selected:[{type:e.Output}],highlighted:[{type:e.Output}],blur:[{type:e.Output}],completer:[{type:e.ViewChild,args:[u]}]},t}(),b=function(){function t(){this.parts=[]}return t.prototype.ngOnInit=function(){if(!this.searchStr)return void this.parts.push({isMatch:!1,text:this.text});for(var t=this.text.toLowerCase(),e=t.indexOf(this.searchStr.toLowerCase()),r=0;e>=0;){var i=this.text.slice(e,e+this.searchStr.length);if(0===e)this.parts.push({isMatch:!0,text:i}),r+=this.searchStr.length;else if(e>0){var o=this.text.slice(r,e);this.parts.push({isMatch:!1,text:o}),this.parts.push({isMatch:!0,text:i}),r+=this.searchStr.length+o.length}e=t.indexOf(this.searchStr.toLowerCase(),r)}r<this.text.length&&this.parts.push({isMatch:!1,text:this.text.slice(r,this.text.length)})},t.decorators=[{type:e.Component,args:[{selector:\"completer-list-item\",template:'\\n    <span class=\"completer-list-item-holder\" [ngClass]=\"{\\'completer-title\\': type === \\'title\\', \\'completer-description\\': type === \\'description\\'}\" >\\n        <span class=\"completer-list-item\" *ngFor=\"let part of parts\" [ngClass]=\"part.isMatch ? matchClass : null\">{{part.text}}</span>\\n    </span>\\n    '}]}],t.ctorParameters=function(){return[]},t.propDecorators={text:[{type:e.Input}],searchStr:[{type:e.Input}],matchClass:[{type:e.Input}],type:[{type:e.Input}]},t}(),C=function(t,e){function r(){this.constructor=t}for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)},I=function(t){function e(){t.call(this)}return C(e,t),e.prototype.cancel=function(){},e.prototype.searchFieldss=function(t){return this._searchFields=t,this},e.prototype.titleField=function(t){return this._titleField=t,this},e.prototype.descriptionField=function(t){return this._descriptionField=t,this},e.prototype.imageField=function(t){return this._imageField=t,this},e.prototype.extractMatches=function(t,e){var r=[];if(this._searchFields&&\"\"!=this._searchFields&&\"\"!=e)for(var i=this._searchFields.split(\",\"),o=0;o<t.length;o++){for(var n=!1,s=0;s<i.length&&!n;s++){var c=this.extractValue(t[o],i[s])||\"\";n=c.toString().toLowerCase().indexOf(e.toString().toLowerCase())>=0}n&&r.push(t[o])}else r=t;return r},e.prototype.extractTitle=function(t){var e=this;return this._titleField.split(\",\").map(function(r){return e.extractValue(t,r)}).join(\" \")},e.prototype.extractValue=function(t,e){var r,i;if(e){r=e.split(\".\"),i=t;for(var o=0;o<r.length;o++)i&&(i=i[r[o]])}else i=t;return i},e.prototype.processResults=function(t){var e,r,i,o,n,s,c=[];if(t&&t.length>0)for(e=0;e<t.length;e++)this.titleField&&\"\"!==this._titleField&&(o=n=this.extractTitle(t[e])),r=\"\",this._descriptionField&&(r=s=this.extractValue(t[e],this._descriptionField)),i=null,this._imageField&&(i=this.extractValue(t[e],this._imageField)),c.push({title:n,description:s,image:i,originalObject:t[e]});return c},e}(s.Subject),_=function(t,e){function r(){this.constructor=t}for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)},H=function(t){function r(){t.call(this)}return _(r,t),r.prototype.data=function(t){var e=this;return t instanceof n.Observable?t.subscribe(function(t){e._data=t,e.savedTerm&&e.search(e.savedTerm)}):this._data=t,this},r.prototype.search=function(t){if(this._data){this.savedTerm=null;var e=this.extractMatches(this._data,t);this.next(this.processResults(e))}else this.savedTerm=t},r.decorators=[{type:e.Injectable}],r.ctorParameters=function(){return[]},r}(I),T=function(t,e){function r(){this.constructor=t}for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)},R=function(t){function e(e){t.call(this),this.http=e,this._urlFormater=null,this._dataField=null}return T(e,t),e.prototype.remoteUrl=function(t){return this._remoteUrl=t,this},e.prototype.urlFormater=function(t){this._urlFormater=t},e.prototype.dataField=function(t){this._dataField=t},e.prototype.headers=function(t){this._headers=t},e.prototype.search=function(t){var e=this;this.cancel();var r=\"\";r=this._urlFormater?this._urlFormater(t):this._remoteUrl+encodeURIComponent(t),this.remoteSearch=this.http.get(r,{headers:this._headers||new i.Headers}).map(function(t){return t.json()}).map(function(r){var i=e.extractValue(r,e._dataField);return e.extractMatches(i,t)}).map(function(t){var r=e.processResults(t);return e.next(r),r}).catch(function(t){return e.error(t),null}).subscribe()},e.prototype.cancel=function(){this.remoteSearch&&this.remoteSearch.unsubscribe()},e}(I),O=function(){function t(t,e){this.localDataFactory=t,this.remoteDataFactory=e}return t.prototype.local=function(t,e,r){var i=this.localDataFactory();return i.data(t).searchFieldss(e).titleField(r)},t.prototype.remote=function(t,e,r){var i=this.remoteDataFactory();return i.remoteUrl(t).searchFieldss(e).titleField(r)},t.decorators=[{type:e.Injectable}],t.ctorParameters=function(){return[{type:void 0,decorators:[{type:e.Inject,args:[H]}]},{type:void 0,decorators:[{type:e.Inject,args:[R]}]}]},t}(),F={provide:H,useFactory:l},L={provide:R,useFactory:p,deps:[i.Http]},D=function(){function t(t,e){this.row=t,this.index=e}return t}(),E=function(){function t(t,e){this.completer=t,this.el=e,this.rows=[],this.completer.registerDropdown(this)}return t.prototype.ngOnInit=function(){var t=getComputedStyle(this.el.nativeElement);this.isScrollOn=t.maxHeight&&\"auto\"===t.overflowY},t.prototype.ngOnDestroy=function(){this.completer.registerDropdown(null)},t.prototype.registerRow=function(t){this.rows.push(t)},t.prototype.highlightRow=function(t){var e=this.rows.find(function(e){return e.index===t});return t<0?(this.currHighlited&&this.currHighlited.row.setHighlited(!1),void(this.currHighlited=void 0)):void(e&&(this.currHighlited&&this.currHighlited.row.setHighlited(!1),this.currHighlited=e,this.currHighlited.row.setHighlited(!0),this.completer.onHighlighted(this.currHighlited.row.getDataItem())))},t.prototype.clear=function(){this.rows=[]},t.prototype.onSelected=function(t){this.completer.onSelected(t)},t.prototype.selectCurrent=function(){this.currHighlited?this.onSelected(this.currHighlited.row.getDataItem()):this.rows.length>0&&this.onSelected(this.rows[0].row.getDataItem())},t.prototype.nextRow=function(){var t=0;if(this.currHighlited&&(t=this.currHighlited.index+1),this.highlightRow(t),this.isScrollOn&&this.currHighlited){var e=this.currHighlited.row.getNativeElement();this.dropdownHeight()<e.getBoundingClientRect().bottom&&this.dropdownScrollTopTo(this.dropdownRowOffsetHeight(e))}},t.prototype.prevRow=function(){var t=-1;if(this.currHighlited&&(t=this.currHighlited.index-1),this.highlightRow(t),this.isScrollOn&&this.currHighlited){var e=this.dropdownRowTop();e<0&&this.dropdownScrollTopTo(e-1)}},t.prototype.dropdownScrollTopTo=function(t){this.el.nativeElement.scrollTop=this.el.nativeElement.scrollTop+t},t.prototype.dropdownRowTop=function(){return this.currHighlited.row.getNativeElement().getBoundingClientRect().top-(this.el.nativeElement.getBoundingClientRect().top+parseInt(getComputedStyle(this.el.nativeElement).paddingTop,10))},t.prototype.dropdownHeight=function(){return this.el.nativeElement.getBoundingClientRect().top+parseInt(getComputedStyle(this.el.nativeElement).maxHeight,10)},t.prototype.dropdownRowOffsetHeight=function(t){var e=getComputedStyle(t);return t.offsetHeight+parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)},t.decorators=[{type:e.Directive,args:[{selector:\"[ctrDropdown]\"}]}],t.ctorParameters=function(){return[{type:u,decorators:[{type:e.Host}]},{type:e.ElementRef}]},t}(),j=40,k=39,M=38,P=37,N=27,V=13,z=9,B=function(){function t(t){var r=this;this.completer=t,this.clearSelected=!1,this.overrideSuggested=!1,this.ngModelChange=new e.EventEmitter,this._searchStr=\"\",this._displayStr=\"\",this._selectedItem=null,this.completer.selected.subscribe(function(t){r._selectedItem=t,t&&(r.clearSelected?r.searchStr=\"\":r.searchStr=t.title,r.ngModelChange.emit(r.searchStr))}),this.completer.highlighted.subscribe(function(t){r._displayStr=t.title,r.ngModelChange.emit(t.title)})}return t.prototype.onInputChange=function(t){this.searchStr=t.target.value},t.prototype.keyupHandler=function(t){if(t.keyCode!==P&&t.keyCode!==k&&t.keyCode!==z)if(t.keyCode===M||t.keyCode===V)t.preventDefault();else if(t.keyCode===j)t.preventDefault(),this.completer.search(this.searchStr);else if(t.keyCode===N)this._searchStr=this._displayStr,this.completer.clear();else{if(!this.searchStr)return void this.completer.clear();this.completer.search(this.searchStr)}},t.prototype.keydownHandler=function(t){t.keyCode===V?(this.completer.hasHighlited()&&t.preventDefault(),this.completer.selectCurrent()):t.keyCode===j?(t.preventDefault(),this.completer.nextRow()):t.keyCode===M?(t.preventDefault(),this.completer.prevRow()):t.keyCode===z?this.overrideSuggested&&this._selectedItem?this.completer.onSelected({title:this.searchStr,originalObject:null}):this.completer.selectCurrent():t.keyCode===N&&t.preventDefault()},t.prototype.onBlur=function(t){var e=this;setTimeout(function(){e.overrideSuggested&&e.completer.onSelected({title:e.searchStr,originalObject:null}),e.completer.clear()},200)},Object.defineProperty(t.prototype,\"searchStr\",{get:function(){return this._searchStr},set:function(t){this._searchStr=t,this._displayStr=t},enumerable:!0,configurable:!0}),t.decorators=[{type:e.Directive,args:[{selector:\"[ctrInput]\"}]}],t.ctorParameters=function(){return[{type:u,decorators:[{type:e.Host}]}]},t.propDecorators={clearSelected:[{type:e.Input,args:[\"clearSelected\"]}],overrideSuggested:[{type:e.Input,args:[\"overrideSuggested\"]}],ngModelChange:[{type:e.Output}],onInputChange:[{type:e.HostListener,args:[\"input\",[\"$event\"]]}],keyupHandler:[{type:e.HostListener,args:[\"keyup\",[\"$event\"]]}],keydownHandler:[{type:e.HostListener,args:[\"keydown\",[\"$event\"]]}],onBlur:[{type:e.HostListener,args:[\"blur\",[\"$event\"]]}]},t}(),q=function(){function t(t,e,r){this.results=t,this.searching=e,this.searchInitialized=r}return t}(),A=function(){function t(t,e,r,i){this.completer=t,this.templateRef=e,this.viewContainer=r,this.cd=i,this.ctrListMinSearchLength=m,this.ctrListPause=g,this.ctrListAutoMatch=!1,this.term=null,this.searchTimer=null,this.clearTimer=null,this.ctx=new q([],!1,!1)}return t.hasTerm=function(t){return t||\"\"===t},t.prototype.ngOnInit=function(){this.completer.registerList(this),this.viewContainer.createEmbeddedView(this.templateRef,new q([],!1,!1))},Object.defineProperty(t.prototype,\"dataService\",{set:function(e){var r=this;this._dataService=e,this._dataService&&this._dataService.catch(function(t){return r.handleError(t)}).subscribe(function(e){r.ctx.searchInitialized=!0,r.ctx.searching=!1,r.ctx.results=e,r.ctrListAutoMatch&&1===e.length&&e[0].title&&t.hasTerm(r.term)&&e[0].title.toLocaleLowerCase()===r.term.toLocaleLowerCase()&&r.completer.onSelected(e[0]),r.refreshTemplate()})},enumerable:!0,configurable:!0}),t.prototype.search=function(e){var r=this;this.term!=e&&this.completer.clear(),t.hasTerm(e)&&e.length>=this.ctrListMinSearchLength&&this.term!==e&&(this.searchTimer&&(this.searchTimer.unsubscribe(),this.searchTimer=null),this.ctx.searching||(this.ctx.results=[],this.ctx.searching=!0,this.ctx.searchInitialized=!0,this.refreshTemplate()),this.clearTimer&&this.clearTimer.unsubscribe(),this.searchTimer=a.Observable.timer(this.ctrListPause).subscribe(function(){r.searchTimerComplete(e)}))},t.prototype.clear=function(){var t=this;this.searchTimer&&this.searchTimer.unsubscribe(),this.clearTimer=a.Observable.timer(v).subscribe(function(){t._clear()})},t.prototype._clear=function(){this.searchTimer&&(this.searchTimer.unsubscribe(),this.searchTimer=null),this.dataService&&this.dataService.cancel(),this.ctx.results=[],this.ctx.searchInitialized=!1,this.term=null,this.viewContainer.clear()},t.prototype.searchTimerComplete=function(e){return!t.hasTerm(e)||e.length<this.ctrListMinSearchLength?void(this.ctx.searching=!1):(this.term=e,void this._dataService.search(e))},t.prototype.handleError=function(t){this.ctx.searching=!1;var e=\"search error\";return t&&(e=t.message?t.message:t.status?t.status+\" - \"+t.statusText:\"Server error\"),console&&console.error&&console.error(e),this.refreshTemplate(),a.Observable.throw(e)},t.prototype.refreshTemplate=function(){this.viewContainer.clear(),this.viewContainer.createEmbeddedView(this.templateRef,this.ctx),this.cd.markForCheck()},t.decorators=[{type:e.Directive,args:[{selector:\"[ctrList]\"}]}],t.ctorParameters=function(){return[{type:u,decorators:[{type:e.Host}]},{type:e.TemplateRef},{type:e.ViewContainerRef},{type:e.ChangeDetectorRef}]},t.propDecorators={ctrListMinSearchLength:[{type:e.Input}],ctrListPause:[{type:e.Input}],ctrListAutoMatch:[{type:e.Input}],dataService:[{type:e.Input,args:[\"ctrList\"]}]},t}(),U=function(){function t(t,e,r){this.el=t,this.renderer=e,this.dropdown=r,this.selected=!1}return t.prototype.ngOnInit=function(){this.dropdown.registerRow(new D(this,this._rowIndex))},Object.defineProperty(t.prototype,\"ctrRow\",{set:function(t){this._rowIndex=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"dataItem\",{set:function(t){this._item=t},enumerable:!0,configurable:!0}),t.prototype.onClick=function(t){this.dropdown.onSelected(this._item)},t.prototype.onMouseEnter=function(t){this.dropdown.highlightRow(this._rowIndex)},t.prototype.setHighlited=function(t){this.selected=t,this.renderer.setElementClass(this.el.nativeElement,\"completer-selected-row\",this.selected)},t.prototype.getNativeElement=function(){return this.el.nativeElement},t.prototype.getDataItem=function(){return this._item},t.decorators=[{type:e.Directive,args:[{selector:\"[ctrRow]\"}]}],t.ctorParameters=function(){return[{type:e.ElementRef},{type:e.Renderer},{type:E,decorators:[{type:e.Host}]}]},t.propDecorators={ctrRow:[{type:e.Input}],dataItem:[{type:e.Input}],onClick:[{type:e.HostListener,args:[\"click\",[\"$event\"]]}],onMouseEnter:[{type:e.HostListener,args:[\"mouseenter\",[\"$event\"]]}]},t}(),$=function(){function t(){}return t.decorators=[{type:e.NgModule,args:[{imports:[h.CommonModule,r.FormsModule,i.HttpModule],declarations:[b,u,E,B,A,U,x],exports:[x,b,u,E,B,A,U],providers:[O,F,L]}]}],t.ctorParameters=function(){return[]},t}();t.Ng2CompleterModule=$,t.CompleterCmp=x,t.CompleterService=O,t.LocalData=H,t.RemoteData=R,t.CompleterBaseData=I,t.CtrCompleter=u,t.CtrDropdown=E,t.CtrInput=B,t.CtrList=A,t.CtrRow=U,Object.defineProperty(t,\"__esModule\",{value:!0})});\n//# sourceMappingURL=ng2-completer.umd.js.map\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-completer/ng2-completer.umd.js\n ** module id = 771\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar dialog_1 = require('./dialog');\nvar dialog_portal_1 = require('./dialog-portal');\nvar dialog_actions_1 = require('./dialog-actions');\nvar dialog_title_1 = require('./dialog-title');\nvar material_1 = require('@angular/material');\nvar core_1 = require('@angular/core');\nvar common_1 = require('@angular/common');\nvar DIALOG_DIRECTIVES = [\n    dialog_1.MdDialog, dialog_title_1.MdDialogTitle, dialog_actions_1.MdDialogActions, dialog_portal_1.MdDialogPortal\n];\nvar MdDialogModule = (function () {\n    function MdDialogModule() {\n    }\n    MdDialogModule = __decorate([\n        core_1.NgModule({\n            declarations: DIALOG_DIRECTIVES,\n            exports: DIALOG_DIRECTIVES,\n            imports: [\n                common_1.CommonModule,\n                material_1.MdCoreModule\n            ]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdDialogModule);\n    return MdDialogModule;\n}());\nexports.MdDialogModule = MdDialogModule;\n//# sourceMappingURL=dialog.module.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/dialog.module.js\n ** module id = 772\n ** module chunks = 2\n **/","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\n__export(require('./dialog'));\n__export(require('./dialog-actions'));\n__export(require('./dialog-portal'));\n__export(require('./dialog-title'));\n//# sourceMappingURL=index.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/dialog/index.js\n ** module id = 773\n ** module chunks = 2\n **/","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar core_1 = require('@angular/core');\nvar common_1 = require('@angular/common');\nvar forms_1 = require('@angular/forms');\nvar platform_browser_1 = require('@angular/platform-browser');\nrequire('rxjs/add/operator/filter');\nvar pagination_service_1 = require('./pagination_service');\nfunction isPresent(obj) {\n    return obj !== undefined && obj !== null;\n}\nvar AbstractPaginationSubComponent = (function () {\n    function AbstractPaginationSubComponent(service) {\n        this.service = service;\n        this.name = 'default';\n        this.model = {\n            currentPage: 0,\n            itemsPerPage: 0,\n            totalItems: 0\n        };\n    }\n    AbstractPaginationSubComponent.prototype.ngOnInit = function () {\n        var _this = this;\n        if (!this.name) {\n            this.name = 'default';\n        }\n        this.service.onChange\n            .filter(function (event) { return isPresent(event) && isPresent(event.name); })\n            .filter(function (event) { return event.target === _this.name; })\n            .subscribe(function (event) {\n            _this.model = event.pagination;\n        });\n    };\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], AbstractPaginationSubComponent.prototype, \"name\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], AbstractPaginationSubComponent.prototype, \"model\", void 0);\n    return AbstractPaginationSubComponent;\n}());\nexports.AbstractPaginationSubComponent = AbstractPaginationSubComponent;\nvar MdPaginationRange = (function (_super) {\n    __extends(MdPaginationRange, _super);\n    function MdPaginationRange(service, sanitizationService) {\n        _super.call(this, service);\n        this.service = service;\n        this.sanitizationService = sanitizationService;\n        this.mdPaginationRange = true;\n        this.name = 'default';\n        this.model = {\n            currentPage: 0,\n            itemsPerPage: 0,\n            totalItems: 0\n        };\n        this.value = '';\n    }\n    Object.defineProperty(MdPaginationRange.prototype, \"html\", {\n        get: function () {\n            return this.getRange();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ;\n    Object.defineProperty(MdPaginationRange.prototype, \"computedRangeFormat\", {\n        get: function () {\n            if (this.rangeFormat)\n                return this.rangeFormat;\n            return '{start}-{end} of {total}';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MdPaginationRange.prototype.getFormattedValue = function (rangeStart, rangeStop, totalItems) {\n        var result = this.computedRangeFormat;\n        result = result.replace(/\\{start\\}/gi, rangeStart.toString());\n        result = result.replace(/\\{end\\}/gi, rangeStop.toString());\n        result = result.replace(/\\{total\\}/gi, totalItems.toString());\n        return result;\n    };\n    MdPaginationRange.prototype.getRange = function () {\n        if (isPresent(this.model)) {\n            var rangeStart = (this.model.currentPage - 1) * this.model.itemsPerPage + 1;\n            var rest = this.model.totalItems - rangeStart, rangeStop = rest < this.model.itemsPerPage ? this.model.totalItems : rangeStart + this.model.itemsPerPage - 1;\n            return this.sanitizationService.bypassSecurityTrustHtml(this.getFormattedValue(rangeStart, rangeStop, this.model.totalItems));\n        }\n        return;\n    };\n    __decorate([\n        core_1.HostBinding('class.md-pagination-range'), \n        __metadata('design:type', Boolean)\n    ], MdPaginationRange.prototype, \"mdPaginationRange\", void 0);\n    __decorate([\n        core_1.HostBinding('innerHTML'), \n        __metadata('design:type', Object)\n    ], MdPaginationRange.prototype, \"html\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdPaginationRange.prototype, \"name\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdPaginationRange.prototype, \"model\", void 0);\n    __decorate([\n        core_1.Input('range-format'), \n        __metadata('design:type', String)\n    ], MdPaginationRange.prototype, \"rangeFormat\", void 0);\n    MdPaginationRange = __decorate([\n        core_1.Component({\n            selector: 'md-pagination-range',\n            template: '',\n        }), \n        __metadata('design:paramtypes', [pagination_service_1.PaginationService, platform_browser_1.DomSanitizer])\n    ], MdPaginationRange);\n    return MdPaginationRange;\n}(AbstractPaginationSubComponent));\nexports.MdPaginationRange = MdPaginationRange;\nvar MdPaginationControls = (function (_super) {\n    __extends(MdPaginationControls, _super);\n    function MdPaginationControls(service) {\n        _super.call(this, service);\n        this.service = service;\n        this.mdPaginationControls = true;\n        this.name = 'default';\n        this.model = {\n            currentPage: 0,\n            itemsPerPage: 0,\n            totalItems: 0\n        };\n    }\n    MdPaginationControls.prototype.isFirstPage = function () {\n        return isPresent(this.model) && this.model.currentPage == 1;\n    };\n    MdPaginationControls.prototype.isLastPage = function () {\n        return isPresent(this.model) && this.model.totalItems <= this.model.currentPage * this.model.itemsPerPage;\n    };\n    MdPaginationControls.prototype.previousPage = function () {\n        if (isPresent(this.model)) {\n            this.changePage(this.model.currentPage - 1);\n        }\n    };\n    MdPaginationControls.prototype.nextPage = function () {\n        if (isPresent(this.model)) {\n            this.changePage(this.model.currentPage + 1);\n        }\n    };\n    MdPaginationControls.prototype.changePage = function (newPage) {\n        var model = JSON.parse(JSON.stringify(this.model));\n        model.currentPage = newPage;\n        this.service.change(this.name, model);\n    };\n    __decorate([\n        core_1.HostBinding('class.md-pagination-controls'), \n        __metadata('design:type', Boolean)\n    ], MdPaginationControls.prototype, \"mdPaginationControls\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdPaginationControls.prototype, \"name\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdPaginationControls.prototype, \"model\", void 0);\n    MdPaginationControls = __decorate([\n        core_1.Component({\n            selector: 'md-pagination-controls',\n            template: \"\\n      <span [class.md-pagination-control-active]=\\\"!isFirstPage()\\\" class=\\\"md-pagination-control md-pagination-control-previous\\\">\\n        <button (click)=\\\"previousPage()\\\" class=\\\"material-icons\\\">keyboard_arrow_left</button>\\n      </span>\\n      <span [class.md-pagination-control-active]=\\\"!isLastPage()\\\" class=\\\"md-pagination-control md-pagination-control-next\\\">\\n        <button (click)=\\\"nextPage()\\\" class=\\\"material-icons\\\">keyboard_arrow_right</button>\\n      </span>\\n    \"\n        }), \n        __metadata('design:paramtypes', [pagination_service_1.PaginationService])\n    ], MdPaginationControls);\n    return MdPaginationControls;\n}(AbstractPaginationSubComponent));\nexports.MdPaginationControls = MdPaginationControls;\nvar MdPaginationItemsPerPage = (function (_super) {\n    __extends(MdPaginationItemsPerPage, _super);\n    function MdPaginationItemsPerPage(service) {\n        _super.call(this, service);\n        this.service = service;\n        this.mdPaginationItemsPerPage = true;\n        this.name = 'default';\n        this.model = {\n            currentPage: 0,\n            itemsPerPage: 0,\n            totalItems: 0\n        };\n        this.itemsPerPageBefore = 'Rows per page:';\n        this.itemsPerPageOptions = [];\n    }\n    Object.defineProperty(MdPaginationItemsPerPage.prototype, \"hidden\", {\n        get: function () {\n            return !this.itemsPerPageOptions || !this.itemsPerPageOptions.length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ;\n    MdPaginationItemsPerPage.prototype.changePaginationLength = function (value) {\n        var model = JSON.parse(JSON.stringify(this.model));\n        model.currentPage = 1;\n        model.itemsPerPage = parseInt(value);\n        this.service.change(this.name, model);\n    };\n    __decorate([\n        core_1.HostBinding('class.md-pagination-items-per-page'), \n        __metadata('design:type', Boolean)\n    ], MdPaginationItemsPerPage.prototype, \"mdPaginationItemsPerPage\", void 0);\n    __decorate([\n        core_1.HostBinding(), \n        __metadata('design:type', Object)\n    ], MdPaginationItemsPerPage.prototype, \"hidden\", null);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdPaginationItemsPerPage.prototype, \"name\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdPaginationItemsPerPage.prototype, \"model\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-before'), \n        __metadata('design:type', String)\n    ], MdPaginationItemsPerPage.prototype, \"itemsPerPageBefore\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-after'), \n        __metadata('design:type', String)\n    ], MdPaginationItemsPerPage.prototype, \"itemsPerPageAfter\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-options'), \n        __metadata('design:type', Array)\n    ], MdPaginationItemsPerPage.prototype, \"itemsPerPageOptions\", void 0);\n    MdPaginationItemsPerPage = __decorate([\n        core_1.Component({\n            selector: 'md-pagination-items-per-page',\n            template: \"\\n   <span *ngIf=\\\"itemsPerPageBefore\\\" class=\\\"md-pagination-items-per-page-label md-pagination-items-per-page-before\\\">{{itemsPerPageBefore}}</span>\\n   <select [(ngModel)]=\\\"model.itemsPerPage\\\" (ngModelChange)=\\\"changePaginationLength($event)\\\" class=\\\"md-pagination-length-select\\\">\\n      <option *ngFor=\\\"let length of itemsPerPageOptions\\\" [value]=\\\"length\\\">\\n        {{length}}\\n      </option>\\n    </select>\\n    <span *ngIf=\\\"itemsPerPageAfter\\\" class=\\\"md-pagination-items-per-page-label md-pagination-items-per-page-after\\\">{{itemsPerPageAfter}}</span>\\n  \"\n        }), \n        __metadata('design:paramtypes', [pagination_service_1.PaginationService])\n    ], MdPaginationItemsPerPage);\n    return MdPaginationItemsPerPage;\n}(AbstractPaginationSubComponent));\nexports.MdPaginationItemsPerPage = MdPaginationItemsPerPage;\nvar MdPagination = (function () {\n    function MdPagination(service, element) {\n        var _this = this;\n        this.service = service;\n        this.element = element;\n        this.mdPagination = true;\n        this.name = 'default';\n        this.model = {\n            currentPage: 0,\n            itemsPerPage: 0,\n            totalItems: 0\n        };\n        this.range = true;\n        this.controls = true;\n        this.itemsPerPage = true;\n        this.onPaginationChange = new core_1.EventEmitter(false);\n        this.defaultDisplay = true;\n        this.service.onChange\n            .filter(function (event) { return isPresent(event) && isPresent(event.name); })\n            .filter(function (event) {\n            return event.target === _this.name;\n        })\n            .subscribe(function (event) { return _this.onPaginationChange.emit(event); });\n    }\n    MdPagination.prototype.ngAfterContentInit = function () {\n        this.defaultDisplay = this.element.nativeElement.childElementCount === 0;\n    };\n    MdPagination.prototype.ngAfterViewInit = function () {\n        this.service.change(this.name, this.model);\n    };\n    __decorate([\n        core_1.HostBinding('class.md-pagination'), \n        __metadata('design:type', Boolean)\n    ], MdPagination.prototype, \"mdPagination\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', String)\n    ], MdPagination.prototype, \"name\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Object)\n    ], MdPagination.prototype, \"model\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdPagination.prototype, \"range\", void 0);\n    __decorate([\n        core_1.Input('range-format'), \n        __metadata('design:type', String)\n    ], MdPagination.prototype, \"rangeFormat\", void 0);\n    __decorate([\n        core_1.Input(), \n        __metadata('design:type', Boolean)\n    ], MdPagination.prototype, \"controls\", void 0);\n    __decorate([\n        core_1.Input('items-per-page'), \n        __metadata('design:type', Boolean)\n    ], MdPagination.prototype, \"itemsPerPage\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-before'), \n        __metadata('design:type', String)\n    ], MdPagination.prototype, \"itemsPerPageBefore\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-after'), \n        __metadata('design:type', String)\n    ], MdPagination.prototype, \"itemsPerPageAfter\", void 0);\n    __decorate([\n        core_1.Input('items-per-page-options'), \n        __metadata('design:type', Array)\n    ], MdPagination.prototype, \"itemsPerPageOptions\", void 0);\n    __decorate([\n        core_1.Output('on-pagination-change'), \n        __metadata('design:type', core_1.EventEmitter)\n    ], MdPagination.prototype, \"onPaginationChange\", void 0);\n    MdPagination = __decorate([\n        core_1.Component({\n            selector: 'md-pagination',\n            template: \"\\n    <ng-content></ng-content>\\n    <md-pagination-items-per-page\\n      *ngIf=\\\"defaultDisplay && itemsPerPage\\\"\\n      [name]=\\\"name\\\"\\n      [model]=\\\"model\\\"\\n      [items-per-page-before]=\\\"itemsPerPageBefore\\\"\\n      [items-per-page-after]=\\\"itemsPerPageAfter\\\"\\n      [items-per-page-options]=\\\"itemsPerPageOptions\\\"></md-pagination-items-per-page>\\n    <md-pagination-range\\n      *ngIf=\\\"defaultDisplay && range\\\"\\n      [name]=\\\"name\\\"\\n      [model]=\\\"model\\\"\\n      [range-format]=\\\"rangeFormat\\\"></md-pagination-range>\\n    <md-pagination-controls\\n      *ngIf=\\\"defaultDisplay && controls\\\"\\n      [name]=\\\"name\\\"\\n      [model]=\\\"model\\\"></md-pagination-controls>\\n  \"\n        }), \n        __metadata('design:paramtypes', [pagination_service_1.PaginationService, core_1.ElementRef])\n    ], MdPagination);\n    return MdPagination;\n}());\nexports.MdPagination = MdPagination;\nvar PAGINATION_DIRECTIVES = [\n    MdPagination,\n    MdPaginationControls,\n    MdPaginationItemsPerPage,\n    MdPaginationRange\n];\nvar MdPaginationModule = (function () {\n    function MdPaginationModule() {\n    }\n    MdPaginationModule = __decorate([\n        core_1.NgModule({\n            declarations: PAGINATION_DIRECTIVES,\n            exports: PAGINATION_DIRECTIVES,\n            imports: [\n                common_1.CommonModule,\n                forms_1.FormsModule\n            ],\n            providers: [pagination_service_1.PaginationService]\n        }), \n        __metadata('design:paramtypes', [])\n    ], MdPaginationModule);\n    return MdPaginationModule;\n}());\nexports.MdPaginationModule = MdPaginationModule;\n//# sourceMappingURL=pagination.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/components/pagination/pagination.js\n ** module id = 774\n ** module chunks = 2\n **/","\"use strict\";\n(function (KeyCodes) {\n    KeyCodes[KeyCodes[\"ESCAPE\"] = 27] = \"ESCAPE\";\n    KeyCodes[KeyCodes[\"SPACE\"] = 32] = \"SPACE\";\n    KeyCodes[KeyCodes[\"UP\"] = 38] = \"UP\";\n    KeyCodes[KeyCodes[\"DOWN\"] = 40] = \"DOWN\";\n})(exports.KeyCodes || (exports.KeyCodes = {}));\nvar KeyCodes = exports.KeyCodes;\n//# sourceMappingURL=key_codes.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/core/key_codes.js\n ** module id = 775\n ** module chunks = 2\n **/","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nvar core_1 = require('@angular/core');\nvar content_1 = require('./components/content/content');\nvar index_1 = require('./components/data-table/index');\nvar divider_1 = require('./components/divider/divider');\nvar index_2 = require('./components/pagination/index');\nvar peekaboo_1 = require('./components/peekaboo/peekaboo');\nvar subheader_1 = require('./components/subheader/subheader');\nvar media_1 = require('./core/util/media');\nvar viewport_1 = require('./core/util/viewport');\nvar dialog_module_1 = require('./components/dialog/dialog.module');\nvar backdrop_1 = require('./components/backdrop/backdrop');\nvar util_module_1 = require('./core/util/util.module');\n__export(require('./components/backdrop/backdrop'));\n__export(require('./components/content/content'));\n__export(require('./components/data-table/index'));\n__export(require('./components/dialog/index'));\n__export(require('./components/divider/divider'));\n__export(require('./components/pagination/index'));\n__export(require('./components/peekaboo/peekaboo'));\n__export(require('./components/subheader/subheader'));\n__export(require('./core/util/media'));\n__export(require('./core/util/viewport'));\n__export(require('./core/util/animate'));\nexports.MATERIAL_NODE_PROVIDERS = [\n    { provide: viewport_1.ViewportHelper, useClass: viewport_1.NodeViewportHelper },\n    media_1.Media\n];\nexports.MATERIAL_BROWSER_PROVIDERS = exports.MATERIAL_NODE_PROVIDERS.concat([\n    { provide: viewport_1.ViewportHelper, useClass: viewport_1.BrowserViewportHelper },\n]);\nvar MATERIAL_MODULES = [\n    backdrop_1.MdBackdropModule,\n    content_1.MdContentModule,\n    index_1.MdDataTableModule,\n    dialog_module_1.MdDialogModule,\n    divider_1.MdDividerModule,\n    index_2.MdPaginationModule,\n    peekaboo_1.MdPeekabooModule,\n    subheader_1.MdSubheaderModule,\n    util_module_1.MdServicesModule\n];\nvar Ng2MaterialNodeModule = (function () {\n    function Ng2MaterialNodeModule() {\n    }\n    Ng2MaterialNodeModule.forRoot = function () {\n        return {\n            ngModule: Ng2MaterialNodeModule,\n            providers: exports.MATERIAL_NODE_PROVIDERS\n        };\n    };\n    Ng2MaterialNodeModule = __decorate([\n        core_1.NgModule({\n            exports: MATERIAL_MODULES,\n            imports: MATERIAL_MODULES\n        }), \n        __metadata('design:paramtypes', [])\n    ], Ng2MaterialNodeModule);\n    return Ng2MaterialNodeModule;\n}());\nexports.Ng2MaterialNodeModule = Ng2MaterialNodeModule;\nvar Ng2MaterialModule = (function () {\n    function Ng2MaterialModule() {\n    }\n    Ng2MaterialModule.forRoot = function () {\n        return {\n            ngModule: Ng2MaterialModule,\n            providers: exports.MATERIAL_BROWSER_PROVIDERS\n        };\n    };\n    Ng2MaterialModule = __decorate([\n        core_1.NgModule({\n            exports: MATERIAL_MODULES,\n            imports: MATERIAL_MODULES\n        }), \n        __metadata('design:paramtypes', [])\n    ], Ng2MaterialModule);\n    return Ng2MaterialModule;\n}());\nexports.Ng2MaterialModule = Ng2MaterialModule;\n//# sourceMappingURL=index.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/ng2-material/index.js\n ** module id = 776\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n  <mdl-spinner class=\\\"loading\\\" [active]=\\\"true\\\"></mdl-spinner>\\n</div>\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/auth-callback/auth-callback.component.html\n ** module id = 781\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-6 col-lg-offset-3 text-center\\\">\\n        <h3>Log In</h3>\\n        <form [formGroup]=\\\"loginform\\\">\\n            <mdl-textfield #firstElement type=\\\"text\\\" label=\\\"Username\\\" formControlName=\\\"username\\\" floating-label autofocus></mdl-textfield>\\n            <br/>\\n            <mdl-textfield type=\\\"password\\\" label=\\\"Password\\\" formControlName=\\\"password\\\" floating-label></mdl-textfield>\\n            <br/>\\n            <button mdl-button (click)=\\\"login()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Login</button>\\n        </form>        \\n    </div>\\n</div>\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/auth/login.component.html\n ** module id = 782\n ** module chunks = 2\n **/","module.exports = \"<div mdl-shadow=\\\"2\\\" style=\\\"padding:20px;\\\">\\n    <div class=\\\"chart-wrapper\\\" style=\\\"height:500px;margin:20px;\\\">\\n        <canvas baseChart #thechart\\n            class=\\\"chart\\\" \\n            [datasets]=\\\"chartData\\\" \\n            [labels]=\\\"chartLabels\\\" \\n            [options]=\\\"chartOptions\\\" \\n            [legend]=\\\"chartLegend\\\" \\n            [chartType]=\\\"chartType\\\" \\n            (chartHover)=\\\"chartHovered($event)\\\" \\n            (chartClick)=\\\"chartClicked($event)\\\">\\n        </canvas>\\n    </div>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/chartjs/by-day/by-day.html\n ** module id = 783\n ** module chunks = 2\n **/","module.exports = \"<div mdl-shadow=\\\"2\\\" style=\\\"padding:20px;\\\">\\n    <div class=\\\"chart-wrapper\\\" style=\\\"height:500px;margin:20px;\\\">\\n        <canvas baseChart #thechart\\n            class=\\\"chart\\\" \\n            [datasets]=\\\"chartData\\\" \\n            [labels]=\\\"chartLabels\\\" \\n            [options]=\\\"chartOptions\\\" \\n            [legend]=\\\"chartLegend\\\" \\n            [chartType]=\\\"chartType\\\" \\n            (chartHover)=\\\"chartHovered($event)\\\" \\n            (chartClick)=\\\"chartClicked($event)\\\">\\n        </canvas>\\n    </div>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/chartjs/by-month/by-month.html\n ** module id = 784\n ** module chunks = 2\n **/","module.exports = \"<div>\\n  <div mdl-shadow=\\\"2\\\" style=\\\"display: block\\\">\\n    <canvas baseChart #thechart\\n            [datasets]=\\\"chartData\\\"\\n            [labels]=\\\"chartLabels\\\"\\n            [options]=\\\"chartOptions\\\"\\n            [colors]=\\\"chartColours\\\" \\n            [legend]=\\\"chartLegend\\\"\\n            [chartType]=\\\"chartType\\\"\\n            (chartHover)=\\\"chartHovered($event)\\\"\\n            (chartClick)=\\\"chartClicked($event)\\\"></canvas>\\n  </div>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/chartjs/by-network/by-network.html\n ** module id = 785\n ** module chunks = 2\n **/","module.exports = \"<div mdl-shadow=\\\"2\\\" style=\\\"padding:20px;\\\">\\n    <div class=\\\"chart-wrapper\\\" style=\\\"height:500px;margin:20px;\\\">\\n        <canvas baseChart #thechart\\n            class=\\\"chart\\\" \\n            [datasets]=\\\"chartData\\\" \\n            [labels]=\\\"chartLabels\\\" \\n            [options]=\\\"chartOptions\\\" \\n            [legend]=\\\"chartLegend\\\" \\n            [chartType]=\\\"chartType\\\" \\n            (chartHover)=\\\"chartHovered($event)\\\" \\n            (chartClick)=\\\"chartClicked($event)\\\">\\n        </canvas>\\n    </div>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/chartjs/type-by-day/by-day.html\n ** module id = 786\n ** module chunks = 2\n **/","module.exports = \"<div>\\n  <h6>Pwd</h6>\\n  <mdl-textfield type=\\\"password\\\" autocomplete=\\\"off\\\" label=\\\"Value\\\" [(ngModel)]=\\\"passwordInput\\\" (change)=\\\"onChangeInput()\\\" floating-label autofocus></mdl-textfield>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/editors/remap-confirmation-pwd/dashboard.component.html\n ** module id = 787\n ** module chunks = 2\n **/","module.exports = \"<div *ngIf=\\\"_revSplitValue\\\">\\n  <h6>Network</h6>\\n  <mdl-textfield type=\\\"text\\\" [(ngModel)]=\\\"_revSplitValue.network_name\\\" floating-label autofocus disabled></mdl-textfield>\\n  <h6>Class</h6>\\n    <mdl-textfield type=\\\"text\\\" [(ngModel)]=\\\"_revSplitValue.name\\\" floating-label autofocus disabled></mdl-textfield>\\n  <h6>Date</h6>\\n  <mdl-textfield type=\\\"text\\\" [(ngModel)]=\\\"_revSplitValue.date\\\" floating-label autofocus disabled></mdl-textfield>  \\n  <h6>Coefficient</h6>\\n    <mdl-textfield type=\\\"number\\\" step=\\\"any\\\" [(ngModel)]=\\\"_revSplitValue.coefficient\\\" floating-label autofocus></mdl-textfield>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/editors/rev-split-values/dashboard.component.html\n ** module id = 788\n ** module chunks = 2\n **/","module.exports = \"<div *ngIf=\\\"_subid\\\">\\n\\n  <div class=\\\"mdl-grid\\\">\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Status</h6>\\n      <mdl-switch [(ngModel)]=\\\"_subid.active\\\" ></mdl-switch>\\n    </div>\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <mdl-textfield type=\\\"text\\\" label=\\\"Name\\\" [(ngModel)]=\\\"_subid.name\\\" floating-label autofocus disabled></mdl-textfield>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"mdl-grid\\\">\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Domain</h6>\\n      <mdl-select [(ngModel)]=\\\"_subid.domain\\\" ><mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.name\\\">{{domain.name}}</mdl-option></mdl-select>\\n    </div>\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Channel</h6>\\n      <mdl-select [(ngModel)]=\\\"_subid.channel\\\" ><mdl-option *ngFor=\\\"let channel of channels\\\" [value]=\\\"channel.name\\\">{{channel.name}}</mdl-option></mdl-select>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"mdl-grid\\\">\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Sub-channel</h6>\\n      <mdl-select [(ngModel)]=\\\"_subid.sub_channel\\\" ><mdl-option *ngFor=\\\"let sub_channel of subChannels\\\" [value]=\\\"sub_channel.name\\\">{{sub_channel.name}}</mdl-option></mdl-select>\\n    </div>\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Signal</h6>\\n      <mdl-select [(ngModel)]=\\\"_subid.audience\\\" ><mdl-option *ngFor=\\\"let audience of audiences\\\" [value]=\\\"audience.name\\\">{{audience.name}}</mdl-option></mdl-select>    \\n    </div>\\n  </div>\\n\\n  <div class=\\\"mdl-grid\\\">\\n    <div class=\\\"mdl-cell mdl-cell--6-col\\\">\\n      <h6>Source Domain</h6>\\n      <mdl-select [(ngModel)]=\\\"_subid.originating_domain\\\" ><mdl-option *ngFor=\\\"let originating_domain of originatingDomains\\\" [value]=\\\"originating_domain.name\\\">{{originating_domain.name}}</mdl-option></mdl-select>\\n    </div>\\n  </div>  \\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/components/editors/subids/subid.component.html\n ** module id = 789\n ** module chunks = 2\n **/","module.exports = \"<!-- START widgets box-->\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Spend: by advertiser</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-9 col-sm-12\\\">\\n        <by-day #thechart [fromDate]='fromDate' [toDate]='toDate' [query]='query'></by-day>\\n    </div>\\n</div>\\n<!-- END widgets box-->\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/ads-by-day/dashboard.component.html\n ** module id = 790\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n    \\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">       \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedDomains\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Domains\\\">\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n\\n            <div>\\n                <button class=\\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('domain')\\\">\\n                    <i class=\\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>            \\n        </div>       \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Filter:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <button mdl-button (click)=\\\"filterData()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Filter</button>\\n            </div>\\n        </div>        \\n\\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n                \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                startAt=\\\"startDate\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                startAt=\\\"startDate\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>        \\n        \\n    </div>\\n    \\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n        <md-toolbar color=\\\"accent\\\">\\n          <span>AIM Sales</span>\\n          <span>\\n              <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                    <mdl-spinner class=\\\"loading\\\" [active]=\\\"searching\\\"></mdl-spinner>\\n              </div>\\n          </span>\\n          <span flex hide show-gt-md></span>\\n          <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n            </md-pagination>\\n          </span>\\n        </md-toolbar>\\n    \\n        <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n            <thead>\\n                <tr class=\\\"revenue-table-cell-header\\\">\\n                    <th class=\\\"revenue-table-cell-header left-column\\\">Date</th>\\n                    <th class=\\\"revenue-table-cell-header left-column\\\">Billing Site</th>\\n                    <th class=\\\"revenue-table-cell-header left-column\\\">Source</th>\\n                    <th class=\\\"revenue-table-cell-header left-column\\\">Campaign</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Content</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Term</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing Hits</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Small Form</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Big Form</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Submits</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Sales</th>\\n                </tr>\\n            </thead>  \\n          <tbody>\\n          <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n            <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\">\\n                <td class=\\\"revenue-table-cell left-column\\\">{{ data.date }}</td>\\n                <td class=\\\"revenue-table-cell left-column\\\">{{ data.billing_site }}</td>\\n                <td class=\\\"revenue-table-cell left-column\\\">{{ data.source }}</td>\\n                <td class=\\\"revenue-table-cell left-column\\\">{{ data.campaign }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.content }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.term }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.billing_hits | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.smallform | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.bigform | number }}%</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.submits | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.billing | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.sales | number }}</td>\\n            </tr>\\n          </template>\\n          </tbody>\\n        </md-data-table>\\n    \\n        <md-toolbar color=\\\"accent\\\">\\n            <span>\\n                <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n            </span>       \\n            <span flex hide show-gt-md></span>\\n            <span hide show-gt-md>\\n                <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n                </md-pagination>\\n            </span>\\n    </md-toolbar>\\n    \\n    </div>\\n    \"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/aim-sales/dashboard.component.html\n ** module id = 791\n ** module chunks = 2\n **/","module.exports = \"<!-- START widgets box-->\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Revenue vs Spend (networks vs ads)</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-9 col-sm-12\\\">\\n        <type-by-day #thechart [fromDate]='fromDate' [toDate]='toDate' [query]='query'></type-by-day>\\n    </div>\\n</div>\\n<!-- END widgets box-->\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/balance-by-day/dashboard.component.html\n ** module id = 792\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\" type=\\\"date\\\" placeholder=\\\"Date\\\" format=\\\"MM/DD/YYYY\\\" (change)=\\\"changeDates($event)\\\"></md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\" type=\\\"date\\\" placeholder=\\\"Date\\\" format=\\\"MM/DD/YYYY\\\" (change)=\\\"changeDates($event)\\\"></md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>B. Company:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"billingStatementCompanyId\\\" (change)=\\\"onChangeBillingStatementCompany(billingStatementCompanyId)\\\" >\\n                    <mdl-option *ngFor=\\\"let billingStatementCompany of billingStatementCompanies\\\" [value]=\\\"billingStatementCompany.id\\\">{{billingStatementCompany.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>User:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"billingStatementUserId\\\" (change)=\\\"onChangeBillingStatementUser(billingStatementUserId)\\\" >\\n                    <mdl-option *ngFor=\\\"let billingStatementUser of billingStatementUsers\\\" [value]=\\\"billingStatementUser.id\\\">{{billingStatementUser.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>        \\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Billing Statements</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n        <thead>\\n            <tr>\\n                <th class=\\\"revenue-table-cell-header\\\">Date (yyyy-mm-dd)</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Account</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Billing Company</th>\\n                <th class=\\\"revenue-table-cell-header\\\">User</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Description</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Amount</th>\\n            </tr>\\n        </thead>  \\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n        <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\" (click)=\\\"showDetails(data)\\\">\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.date }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.network_name }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.billing_company }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.user }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">-</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.amount | currency:'USD':true }}</td>\\n        </tr>\\n            <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\" >\\n                <tr class=\\\"revenue-table-cell rowdetail\\\" style=\\\"background-color: #88aaff\\\">\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >-</td>\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.network_name }}</td>\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.billing_company }}</td>\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.user }}</td>\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.description }}</td>\\n                    <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.amount | currency:'USD':true }}</td>\\n                </tr>\\n            </template>\\n      </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Basic</button>\\n        </span>\\n        <span class=\\\"left-separator\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetails()\\\"><mdl-icon>get_app</mdl-icon>Details</button>\\n        </span>        \\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n</md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/billing-statements/dashboard.component.html\n ** module id = 793\n ** module chunks = 2\n **/","module.exports = \"<!-- START widgets box-->\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Revenue: by network</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n    </div>\\n</div>\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-9 col-sm-12\\\">\\n        <by-day #thechart [fromDate]='fromDate' [toDate]='toDate' [query]='query'></by-day>\\n    </div>\\n</div>\\n<!-- END widgets box-->\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/by-day/dashboard.component.html\n ** module id = 794\n ** module chunks = 2\n **/","module.exports = \"<!-- START widgets box-->\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Revenue: by network</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-9 col-sm-12\\\">\\n        <by-day #thechart [fromDate]='fromDate' [toDate]='toDate' [query]='query'></by-day>\\n    </div>\\n</div>\\n<!-- END widgets box-->\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/by-month/dashboard.component.html\n ** module id = 795\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-md-6 col-lg-6\\\">\\n                <h3>Login User:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"userId\\\" (change)=\\\"onChangeUser(userId)\\\" >\\n                    <mdl-option *ngFor=\\\"let user of users\\\" [value]=\\\"user.id\\\">{{user.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-md-6 col-lg-6\\\">\\n                <h3>Processing Co.:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"processorId\\\" (change)=\\\"onChangeProcessor(processorId)\\\" >\\n                    <mdl-option *ngFor=\\\"let processor of processors\\\" [value]=\\\"processor.id\\\">{{processor.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>ISO:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"isoId\\\" (change)=\\\"onChangeIso(isoId)\\\" >\\n                    <mdl-option *ngFor=\\\"let iso of isos\\\" [value]=\\\"iso.id\\\">{{iso.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Credit Card:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"ccId\\\" (change)=\\\"onChangeCC(ccId)\\\" >\\n                    <mdl-option *ngFor=\\\"let cc of ccs\\\" [value]=\\\"cc.id\\\">{{cc.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Range:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n              <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onRangeChange(rangeId)\\\" >\\n                <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n              </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Log. User</th>\\n        <th class=\\\"md-text-cell\\\">Processor Id</th>\\n        <th class=\\\"md-text-cell\\\">Processing Co.</th>\\n        <th class=\\\"md-text-cell\\\">ISO</th>\\n        <th class=\\\"md-text-cell\\\">MID</th>\\n        <th class=\\\"md-text-cell\\\">Domain</th>\\n        <th >Current Sales</th>\\n        <th >Prior Sales</th>\\n        <th ># VS C.B.</th>\\n        <th ># MC C.B.</th>\\n        <th >VS Ratio</th>\\n        <th >MC Ratio</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\" >\\n        <td class=\\\"md-text-cell\\\">{{ data.user }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.processor_id }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.processor }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.iso }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.mid }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.domain }}</td>\\n        <td >${{ data.csales }}</td>\\n        <td >${{ data.psales }}</td>\\n        <td >{{ data.vchargebackstx }}</td>\\n        <td >{{ data.mchargebackstx }}</td>\\n        <td >{{ data.vratio }} %</td>\\n        <td >{{ data.mratio }} %</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/cb-tracker/dashboard.component.html\n ** module id = 796\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\" type=\\\"date\\\" placeholder=\\\"Date\\\" format=\\\"MM/DD/YYYY\\\" (change)=\\\"changeDates($event)\\\"></md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\" type=\\\"date\\\" placeholder=\\\"Date\\\" format=\\\"MM/DD/YYYY\\\" (change)=\\\"changeDates($event)\\\"></md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Credit Cards</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n        <thead>\\n            <tr>\\n                <th class=\\\"revenue-table-cell-header\\\">Date (yyyy-mm-dd)</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Network Name</th>\\n                <th class=\\\"revenue-table-cell-header\\\">User</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Bank</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Account Name</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Account Number</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Netsuite Account Number</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Description</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Card Member</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Amount</th>\\n            </tr>\\n        </thead>  \\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n        <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\">\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.date }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.network_name }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.user }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.bank }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.account_name }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.account_number }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.netsuite_account_number }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.description }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.card_member }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\">{{ data.amount | currency:'USD':true }}</td>\\n        </tr>\\n      </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Export</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n</md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/credit-cards/dashboard.component.html\n ** module id = 797\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid\\\">\\n<div mdl-shadow=\\\"2\\\" class=\\\"col-lg-6 col-sm-12\\\">\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Network:</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Subid:</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-textfield type=\\\"text\\\" label=\\\"subid\\\" [(ngModel)]=\\\"subid\\\" floating-label autofocus (keyup.enter)=\\\"updateSubid()\\\" ></mdl-textfield>\\n    </div>\\n</div>\\n\\n</div>\\n<div mdl-shadow=\\\"2\\\" class=\\\"col-lg-6 col-sm-12\\\">\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>From:</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                        type=\\\"date\\\"\\n                        placeholder=\\\"Date\\\"\\n                        format=\\\"MM/DD/YYYY\\\"\\n                        (change)=\\\"changeDates($event)\\\">\\n        </md2-datepicker>\\n    </div>\\n    </div>\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>To:</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                        type=\\\"date\\\"\\n                        placeholder=\\\"Date\\\"\\n                        format=\\\"MM/DD/YYYY\\\"\\n                        (change)=\\\"changeDates($event)\\\">\\n        </md2-datepicker>\\n    </div>\\n</div>\\n</div>\\n</div>\\n<div class=\\\"mdl-grid\\\">\\n\\n<div mdl-shadow=\\\"2\\\" class=\\\"col-lg-12 col-sm-12\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Date</th>\\n        <th class=\\\"md-text-cell\\\">Network</th>\\n        <th class=\\\"md-text-cell\\\">User</th>\\n        <th class=\\\"md-text-cell\\\">Sub id</th>\\n        <th>Revenue</th>\\n        <th>Clicks</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.network_datetime }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.network_name }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.user }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.subid }}</td>\\n        <td>${{ data.revenue }}</td>\\n        <td>{{ data.clicks }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/data-by-network/dashboard.component.html\n ** module id = 798\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    \\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Source:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedSources\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Sources\\\">\\n                    <mdl-option *ngFor=\\\"let source of sources\\\" [value]=\\\"source.id\\\">{{source.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n            \\n            <div>\\n                <button class = \\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('source')\\\">\\n                    <i class = \\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>\\n        </div>        \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedDomains\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Domains\\\">\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n\\n            <div>\\n                <button class=\\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('domain')\\\">\\n                    <i class=\\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>            \\n        </div>       \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Filter:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <button mdl-button (click)=\\\"filterData()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Send</button>\\n            </div>\\n\\n            <!--\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n            -->\\n        </div>    \\n        \\n         \\n\\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Vertical:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"verticalId\\\" (change)=\\\"onChangeVertical(verticalId)\\\" >\\n                    <mdl-option *ngFor=\\\"let vertical of verticals\\\" [value]=\\\"vertical.id\\\">{{vertical.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>          \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                startAt=\\\"startDate\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                startAt=\\\"startDate\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>         \\n        \\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Group By:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"groupingId\\\" (change)=\\\"onChangeGrouping(groupingId)\\\" >\\n                    <mdl-option *ngFor=\\\"let grouping of groupings\\\" [value]=\\\"grouping.id\\\">{{grouping.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n\\n        <!--\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Level 1:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [disabled]=\\\"false\\\" [(ngModel)]=\\\"filterLevel1Id\\\" (change)=\\\"onChangeFilterLevel1(filterLevel1Id)\\\">\\n                    <mdl-option *ngFor=\\\"let filter of filtersLevel1\\\" [value]=\\\"filter.id\\\">{{filter.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n        \\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Level 2:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [disabled]=\\\"isInvalidLevel2\\\" [(ngModel)]=\\\"filterLevel2Id\\\" (change)=\\\"onChangeFilterLevel2(filterLevel2Id)\\\" >\\n                    <mdl-option *ngFor=\\\"let filter of filtersLevel2\\\" [value]=\\\"filter.id\\\">{{filter.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Level 3:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [disabled]=\\\"isInvalidLevel3\\\" [(ngModel)]=\\\"filterLevel3Id\\\">\\n                    <mdl-option *ngFor=\\\"let filter of filtersLevel3\\\" [value]=\\\"filter.id\\\">{{filter.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n        -->      \\n\\n    </div>\\n    \\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n        <md-toolbar color=\\\"accent\\\">\\n          <span>Billing Performance</span>\\n          <span>\\n              <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                    <mdl-spinner class=\\\"loading\\\" [active]=\\\"searching\\\"></mdl-spinner>\\n              </div>\\n          </span>\\n          <span flex hide show-gt-md></span>\\n          <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n            </md-pagination>\\n          </span>\\n        </md-toolbar>\\n    \\n        <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n            <thead>\\n                <tr class=\\\"revenue-table-cell-header\\\">\\n                    <th *ngIf=\\\"showDateColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell-header left-column\\\">Date</th>\\n                    <th *ngIf=\\\"showSourceColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell-header left-column\\\">Source</th>\\n                    <th *ngIf=\\\"showBillingSiteColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell-header left-column\\\">Billing Site</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing Site Visits</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Form 1 Impressions</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Form 2 Impressions</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Submits</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Notices</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Sales</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Confirmations</th>\\n                </tr>\\n            </thead>  \\n          <tbody>\\n          <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n            <!-- Root Level -->\\n            <tr (click)=\\\"showDrillDown1(data)\\\" [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\">\\n                <td *ngIf=\\\"showDateColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.date }}</td>\\n                <td *ngIf=\\\"showSourceColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.source }}</td>\\n                <td *ngIf=\\\"showBillingSiteColumn\\\" colspan=\\\"4\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.billing_site }}</td>\\n                <td class=\\\"revenue-table-cell\\\">\\n                    {{ data.billing_site_visits | number }}\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '-'\\\">\\n                        <mdl-icon class=\\\"lowNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '--'\\\">\\n                        <mdl-icon class=\\\"mediumNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>                    \\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '---'\\\">\\n                        <mdl-icon class=\\\"highNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '+'\\\">\\n                        <mdl-icon class=\\\"lowPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '++'\\\">\\n                        <mdl-icon class=\\\"mediumPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === '+++'\\\">\\n                        <mdl-icon class=\\\"highPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"data.billingSiteVisitsTrend === ''\\\">\\n                        <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                </td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.form_1_impressions | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.form_2_impressions | number }}</td>                \\n                <td class=\\\"revenue-table-cell\\\">{{ data.submits | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.notices | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">\\n                    {{ data.sales | number }}\\n                    <span *ngIf=\\\"data.salesTrend === '-'\\\">\\n                        <mdl-icon class=\\\"lowNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.salesTrend === '--'\\\">\\n                        <mdl-icon class=\\\"mediumNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>                    \\n                    <span *ngIf=\\\"data.salesTrend === '---'\\\">\\n                        <mdl-icon class=\\\"highNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"data.salesTrend === '+'\\\">\\n                        <mdl-icon class=\\\"lowPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.salesTrend === '++'\\\">\\n                        <mdl-icon class=\\\"mediumPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"data.salesTrend === '+++'\\\">\\n                        <mdl-icon class=\\\"highPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"data.salesTrend === ''\\\">\\n                        <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>    \\n                </td>                \\n                <td class=\\\"revenue-table-cell\\\">{{ data.confirmation | number }}</td>\\n            </tr>\\n            <!-- LEVEL 1 -->\\n            <tr *ngIf=\\\"data.showdetails\\\" class=\\\"detailHeaderBS\\\">\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th colspan=\\\"2\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\">Billing Site Visits</th>\\n                <th class=\\\"detailHeaderBS\\\">Form 1 Impressions</th>\\n                <th class=\\\"detailHeaderBS\\\">Form 2 Impressions</th>\\n                <th class=\\\"detailHeaderBS\\\">Submits</th>\\n                <th class=\\\"detailHeaderBS\\\">Notices</th>\\n                <th class=\\\"detailHeaderBS\\\">Sales</th>\\n                <th class=\\\"detailHeaderBS\\\">Confirmations</th>\\n            </tr>\\n                <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\">\\n                    <tr (click)=\\\"showCampaignDetails(data, detail)\\\" class=\\\"detailHeaderBS rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': detail.showCampaignDetails === true }\\\">\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td colspan=\\\"2\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">\\n                            {{ detail.billing_site_visits | number }}\\n                            <span>\\n                                <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                            </span> \\n                        </td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">{{ detail.form_1_impressions | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">{{ detail.form_2_impressions | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">{{ detail.submits | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">{{ detail.notices | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">\\n                            {{ detail.sales | number }}\\n                            <span>\\n                                <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                            </span> \\n                        </td>\\n                        <td class=\\\"detailRowBS rowdetail\\\">{{ detail.confirmation | number }}</td>\\n                    </tr>\\n                </template>\\n          </template>\\n          </tbody>\\n        </md-data-table>\\n    \\n        <md-toolbar color=\\\"accent\\\">\\n            <span>\\n                <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n            </span>\\n            <span style=\\\"padding-left: 15px\\\">\\n                <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetail()\\\"><mdl-icon>get_app</mdl-icon>Detail</button>\\n            </span>        \\n            <span flex hide show-gt-md></span>\\n            <span hide show-gt-md>\\n                <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n                </md-pagination>\\n            </span>\\n    </md-toolbar>\\n    \\n    </div>\\n    \"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-billing-performance/dashboard.component.html\n ** module id = 799\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    \\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Source:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedSources\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Sources\\\">\\n                    <mdl-option *ngFor=\\\"let source of sources\\\" [value]=\\\"source.id\\\">{{source.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n            \\n            <div>\\n                <button class = \\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('source')\\\">\\n                    <i class = \\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>\\n        </div>        \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedDomains\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Domains\\\">\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n\\n            <div>\\n                <button class=\\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('domain')\\\">\\n                    <i class=\\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>            \\n        </div>       \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Filter:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <button mdl-button (click)=\\\"filterData()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Update</button>\\n            </div>\\n        </div>        \\n\\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        \\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Vertical:</h3>\\n            </div>\\n\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"selectedVerticals\\\" [multiple]=\\\"true\\\" placeholder=\\\"Select Verticals\\\">\\n                    <mdl-option *ngFor=\\\"let vertical of verticals\\\" [value]=\\\"vertical.id\\\">{{vertical.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n            \\n            <div>\\n                <button class = \\\"mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab\\\" (click)=\\\"cleanFilter('vertical')\\\">\\n                    <i class = \\\"material-icons\\\">clear</i>\\n                </button>\\n            </div>\\n        </div>          \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                startAt=\\\"startDate\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <mdl-select [(ngModel)]=\\\"fromHourId\\\" (change)=\\\"onChangeFromHour(fromHourId)\\\" >\\n                    <mdl-option *ngFor=\\\"let fromHourValue of fromHours\\\" [value]=\\\"fromHourValue.id\\\">{{fromHourValue.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <md2-datepicker min=\\\"01/08/2019\\\"\\n                                [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                startAt=\\\"startDate\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <mdl-select [(ngModel)]=\\\"toHourId\\\" (change)=\\\"onChangeToHour(toHourId)\\\" >\\n                    <mdl-option *ngFor=\\\"let toHourValue of toHours\\\" [value]=\\\"toHourValue.id\\\">{{toHourValue.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>        \\n        \\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Trend Marker:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"tradeMarkerId\\\" (change)=\\\"onChangeTradeMarker(tradeMarkerId)\\\" >\\n                    <mdl-option *ngFor=\\\"let tradeMarker of tradeMarkers\\\" [value]=\\\"tradeMarker.id\\\">{{tradeMarker.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>       \\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Group By:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [disabled]=\\\"disableGroupBy\\\" [(ngModel)]=\\\"groupingId\\\" (change)=\\\"onChangeGrouping(groupingId)\\\" >\\n                    <mdl-option *ngFor=\\\"let grouping of groupings\\\" [value]=\\\"grouping.id\\\">{{grouping.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>\\n        \\n        <div class=\\\"mdl-grid mdl-grid-revenue align-content\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-switch [disabled]=\\\"disableAggregate\\\" [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>        \\n\\n    </div>\\n    \\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n        <md-toolbar color=\\\"accent\\\">\\n          <span>Traffic Conversions</span>\\n          <span>\\n              <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                    <mdl-spinner class=\\\"loading\\\" [active]=\\\"searching\\\"></mdl-spinner>\\n              </div>\\n          </span>\\n          <span flex hide show-gt-md></span>\\n          <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n            </md-pagination>\\n          </span>\\n        </md-toolbar>\\n    \\n        <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n            <thead>\\n                <tr class=\\\"revenue-table-cell-header\\\">\\n                    <th *ngIf=\\\"displayDateField\\\" class=\\\"revenue-table-cell-header left-column\\\">Date</th>\\n                    <th class=\\\"revenue-table-cell-header left-column\\\">Domain</th>\\n                    <th colspan=\\\"2\\\" class=\\\"revenue-table-cell-header left-column\\\">Source</th>\\n                    <th colspan=\\\"2\\\" class=\\\"revenue-table-cell-header left-column\\\">Vertical</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Portal site</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing site</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Transfer rate</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Form 1</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Form 2</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Submits</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Registration rate</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing page</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Sales</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Conversion rate</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Billing to Sale ratio</th>\\n                    <th class=\\\"revenue-table-cell-header\\\">Confirmations</th>\\n                </tr>\\n            </thead>  \\n          <tbody>\\n          <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n            <!-- Root Level -->\\n            <tr (click)=\\\"loadLevel1ClickFunc(data)\\\" [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\">\\n                <td *ngIf=\\\"displayDateField\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.date }}</td>\\n                <td class=\\\"revenue-table-cell left-column\\\">{{ data.domain }}</td>\\n                <td colspan=\\\"2\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.source }}</td>\\n                <td colspan=\\\"2\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.vertical }}</td>\\n                <td class=\\\"revenue-table-cell\\\">\\n                    {{ data.portal_visits | number }}\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '-'\\\">\\n                        <mdl-icon class=\\\"lowNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '--'\\\">\\n                        <mdl-icon class=\\\"mediumNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>                    \\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '---'\\\">\\n                        <mdl-icon class=\\\"highNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '+'\\\">\\n                        <mdl-icon class=\\\"lowPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '++'\\\">\\n                        <mdl-icon class=\\\"mediumPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === '+++'\\\">\\n                        <mdl-icon class=\\\"highPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"aggregate && data.portalVisitsTrend === ''\\\">\\n                        <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                </td>\\n                <td class=\\\"revenue-table-cell\\\">\\n                    {{ data.billing_site_visits | number }}\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '-'\\\">\\n                        <mdl-icon class=\\\"lowNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '--'\\\">\\n                        <mdl-icon class=\\\"mediumNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>                    \\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '---'\\\">\\n                        <mdl-icon class=\\\"highNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '+'\\\">\\n                        <mdl-icon class=\\\"lowPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '++'\\\">\\n                        <mdl-icon class=\\\"mediumPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === '+++'\\\">\\n                        <mdl-icon class=\\\"highPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"aggregate && data.billingSiteVisitsTrend === ''\\\">\\n                        <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>    \\n                </td>\\n                <td class=\\\"revenue-table-cell\\\">{{ calculateDivision(data.billing_site_visits, data.portal_visits) | number }}%</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.form_1_impressions | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.form_2_impressions | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.submits | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ calculateDivision(data.submits, data.portal_visits) | number }}%</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.billing_impressions | number }}</td>\\n                <td class=\\\"revenue-table-cell\\\">\\n                    {{ data.sales | number }}\\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '-'\\\">\\n                        <mdl-icon class=\\\"lowNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '--'\\\">\\n                        <mdl-icon class=\\\"mediumNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>                    \\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '---'\\\">\\n                        <mdl-icon class=\\\"highNegativeIndicator\\\" mdl-list-item-icon>trending_down</mdl-icon>\\n                    </span>\\n    \\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '+'\\\">\\n                        <mdl-icon class=\\\"lowPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '++'\\\">\\n                        <mdl-icon class=\\\"mediumPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                    <span *ngIf=\\\"aggregate && data.salesTrend === '+++'\\\">\\n                        <mdl-icon class=\\\"highPositiveIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n\\n                    <span *ngIf=\\\"aggregate && data.salesTrend === ''\\\">\\n                        <mdl-icon class=\\\"emptyIndicator\\\" mdl-list-item-icon>trending_up</mdl-icon>\\n                    </span>\\n                </td>\\n                <td class=\\\"revenue-table-cell\\\">{{ calculateDivision(data.sales, data.portal_visits) | number }}%</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ calculateDivision(data.sales, data.billing_site_visits) | number }}%</td>\\n                <td class=\\\"revenue-table-cell\\\">{{ data.confirmation | number }}</td>\\n            </tr>\\n            <!-- LEVEL 1 -->\\n            <tr *ngIf=\\\"data.showdetails\\\" class=\\\"detailHeaderBS\\\">\\n                <th *ngIf=\\\"grouping != SOURCE_GROUPING\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th *ngIf=\\\"grouping == SOURCE_GROUPING\\\" class=\\\"detailHeaderBS left-column\\\">Domain</th>\\n\\n                <th class=\\\"detailHeaderBS left-column\\\">Source</th>\\n\\n                <th *ngIf=\\\"grouping == DATE_GROUPING\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n\\n                <th *ngIf=\\\"grouping != NO_GROUPING\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailHeaderBS left-column\\\">Billing Site</th>\\n\\n                <th *ngIf=\\\"grouping != SOURCE_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailHeaderBS left-column\\\"></th>\\n                <th *ngIf=\\\"grouping == SOURCE_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailHeaderBS left-column\\\">Vertical</th>\\n\\n                <th class=\\\"detailHeaderBS\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\">Billing site hits</th>\\n                <th class=\\\"detailHeaderBS\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\">Form 1</th>\\n                <th class=\\\"detailHeaderBS\\\">Form 2</th>\\n                <th class=\\\"detailHeaderBS\\\">Submits</th>\\n                <th class=\\\"detailHeaderBS\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\">Billing page</th>\\n                <th class=\\\"detailHeaderBS\\\">Sales</th>\\n                <th class=\\\"detailHeaderBS\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\"></th>\\n                <th class=\\\"detailHeaderBS\\\">Confirmations</th>\\n            </tr>\\n                <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\">\\n                    <tr (click)=\\\"loadLevel2ClickFun(data, detail)\\\" class=\\\"detailHeaderBS rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': detail.showdetails === true }\\\">\\n                        <td *ngIf=\\\"grouping != SOURCE_GROUPING\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td *ngIf=\\\"grouping == SOURCE_GROUPING\\\" class=\\\"detailRowBS rowdetail left-column\\\">{{ detail.domain }}</td>\\n\\n                        <td class=\\\"detailRowBS rowdetail left-column\\\">{{ detail.source }}</td>\\n\\n                        <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        \\n                        <td *ngIf=\\\"grouping != NO_GROUPING\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailRowBS rowdetail left-column\\\">{{ detail.billing_site }}</td>\\n\\n                        <td *ngIf=\\\"grouping != SOURCE_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td *ngIf=\\\"grouping == SOURCE_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailRowBS rowdetail left-column\\\">{{ detail.vertical }}</td>\\n\\n                        <td class=\\\"detailRowBS rowdetail left-column\\\"></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.billing_site_visits | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" ></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.form_1_impressions | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.form_2_impressions | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.submits | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" ></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.billing_impressions | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.sales | number }}</td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" ></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" ></td>\\n                        <td class=\\\"detailRowBS rowdetail\\\" >{{ detail.confirmation | number }}</td>\\n                    </tr>\\n                    <!-- LEVEL 2 -->\\n                    <tr *ngIf=\\\"detail.showdetails\\\" class=\\\"detailHeaderCampaign\\\">\\n                        <th class=\\\"detailHeaderCampaign\\\">Domain</th>\\n                        <th class=\\\"detailHeaderCampaign left-column\\\">Source</th>\\n                        <th *ngIf=\\\"grouping == DATE_GROUPING\\\" class=\\\"detailHeaderCampaign left-column\\\"></th>\\n                        <th *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\"></th>\\n                        <th *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\">Billing Site</th>\\n                        <th *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\"></th>\\n                        <th *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\">Campaign</th>\\n                        <th colspan=\\\"2\\\" class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th *ngIf=\\\"grouping == NO_GROUPING\\\" class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Billing site hits</th>\\n                        <th class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Form 1</th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Form 2</th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Submits</th>\\n                        <th class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Billing page</th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Sales</th>\\n                        <th class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th class=\\\"detailHeaderCampaign\\\"></th>\\n                        <th class=\\\"detailHeaderCampaign\\\">Confirmations</th>\\n                    </tr>\\n                    <template *ngIf=\\\"detail.showdetails\\\" ngFor let-detailCampaign [ngForOf]=\\\"detail.details\\\" >\\n                        <tr (click)=\\\"loadLevel3ClickFun(data, detail, detailCampaign)\\\" class=\\\"detailRowCampaign rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': detailCampaign.showdetails === true }\\\">\\n                            <td class=\\\"detailRowCampaign rowdetail\\\">{{ detailCampaign.domain }}</td>\\n                            <td colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\">{{ detailCampaign.source }}</td>\\n                            <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\"></td>\\n                            <td *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\"></td>\\n                            <td *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowCampaign rowdetail left-column\\\">{{ detailCampaign.billing_site }}</td>\\n                            <td *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowCampaign rowdetail left-column\\\"></td>\\n                            <td *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailRowCampaign rowdetail left-column\\\">{{ detailCampaign.campaign }}</td>\\n                            <td colspan=\\\"2\\\" class=\\\"detailRowCampaign rowdetail\\\" ></td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.billing_site_visits | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" ></td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.form_1_impressions | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.form_2_impressions | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.submits | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" ></td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.billing_impressions | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.sales | number }}</td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" ></td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" ></td>\\n                            <td class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.confirmation | number }}</td>\\n                        </tr>\\n                        <!-- LEVEL 3 -->\\n                        <tr *ngIf=\\\"detailCampaign.showdetails\\\" class=\\\"detailHeaderContent\\\">\\n                            <th class=\\\"detailHeaderContent left-column\\\"></th>\\n                            <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Source</th>\\n                            <th *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\"></th>\\n                            <th *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\"></th>\\n                            <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Billing Site</th>\\n                            <th *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Campaign</th>\\n                            <th *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\"></th>\\n                            <th *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"2\\\" class=\\\"detailHeaderContent left-column\\\">Content</th>\\n                            <th class=\\\"detailHeaderContent\\\"></th>\\n                            <th class=\\\"detailHeaderContent\\\">Billing site hits</th>\\n                            <th class=\\\"detailHeaderContent\\\"></th>\\n                            <th class=\\\"detailHeaderContent\\\">Form 1</th>\\n                            <th class=\\\"detailHeaderContent\\\">Form 2</th>\\n                            <th class=\\\"detailHeaderContent\\\">Submits</th>\\n                            <th class=\\\"detailHeaderContent\\\"></th>\\n                            <th class=\\\"detailHeaderContent\\\">Billing page</th>\\n                            <th class=\\\"detailHeaderContent\\\">Sales</th>\\n                            <th class=\\\"detailHeaderContent\\\"></th>\\n                            <th class=\\\"detailHeaderContent\\\"></th>\\n                            <th class=\\\"detailHeaderContent\\\">Confirmations</th>\\n                        </tr>\\n                        <template *ngIf=\\\"detailCampaign.showdetails\\\" ngFor let-detailContent [ngForOf]=\\\"detailCampaign.details\\\">\\n                            <tr (click)=\\\"loadLevel4ClickFun(data, detail, detailCampaign, detailContent)\\\" class=\\\"detailRowContent rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': detailContent.showdetails === true }\\\">\\n                                <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\"></td>\\n                                <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\">{{ detailContent.source }}</td>\\n                                <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\"></td>\\n                                <td *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\"></td>\\n                                <td colspan=\\\"1\\\"class=\\\"detailRowContent rowdetail left-column\\\">{{ detailContent.billing_site }}</td>\\n                                <td *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\">{{ detailContent.campaign }}</td>\\n                                <td *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\"></td>\\n                                <td *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"2\\\"class=\\\"detailRowContent rowdetail left-column\\\">{{ detailContent.content }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" ></td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.billing_site_visits | number }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" ></td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.form_1_impressions | number }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.form_2_impressions | number }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.submits | number }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" ></td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.billing_impressions | number }}</td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.sales | number }}</td>\\n                                <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail\\\"></td>\\n                                <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail\\\"></td>\\n                                <td class=\\\"detailRowContent rowdetail\\\" >{{ detailContent.confirmation | number }}</td>\\n                            </tr>\\n                            <!-- LEVEL 4 -->\\n                            <tr *ngIf=\\\"detailContent.showdetails\\\" class=\\\"detailHeaderTerm\\\">\\n                                <th colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\"></th>\\n                                <th colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\">Source</th>\\n                                <th *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\"></th>\\n                                <th *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\"></th>\\n                                <th colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\">Billing Site</th>\\n                                <th colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\">Campaign</th>\\n                                <th *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\">Content</th>\\n                                <th *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\"></th>\\n                                <th *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderTerm left-column\\\">Term</th>\\n                                <th *ngIf=\\\"grouping == NO_GROUPING\\\" class=\\\"detailHeaderTerm\\\"></th>\\n                                <th class=\\\"detailHeaderTerm\\\">Billing site hits</th>\\n                                <th class=\\\"detailHeaderTerm\\\"></th>\\n                                <th class=\\\"detailHeaderTerm\\\">Form 1</th>\\n                                <th class=\\\"detailHeaderTerm\\\">Form 2</th>\\n                                <th class=\\\"detailHeaderTerm\\\">Submits</th>\\n                                <th class=\\\"detailHeaderTerm\\\"></th>\\n                                <th class=\\\"detailHeaderTerm\\\">Billing page</th>\\n                                <th class=\\\"detailHeaderTerm\\\">Sales</th>\\n                                <th class=\\\"detailHeaderTerm\\\"></th>\\n                                <th class=\\\"detailHeaderTerm\\\"></th>\\n                                <th class=\\\"detailHeaderTerm\\\">Confirmations</th>\\n                            </tr>\\n                            <template *ngIf=\\\"detailContent.showdetails\\\" ngFor let-detailTerm [ngForOf]=\\\"detailContent.details\\\">\\n                                    <tr (click)=\\\"loadLevel5ClickFun(data, detail, detailCampaign, detailContent, detailTerm)\\\" class=\\\"detailRowContent rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': detailTerm.showdetails === true }\\\">\\n                                    <td colspan=\\\"1\\\" class=\\\"detailRowTerm rowdetail left-column\\\"></td>\\n                                    <td colspan=\\\"1\\\" class=\\\"detailRowTerm rowdetail left-column\\\">{{ detailTerm.source }}</td>\\n                                    <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowTerm rowdetail left-column\\\"></td>\\n                                    <td *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowTerm rowdetail left-column\\\"></td>\\n                                    <td colspan=\\\"1\\\"class=\\\"detailRowTerm rowdetail left-column\\\">{{ detailTerm.billing_site }}</td>\\n                                    <td colspan=\\\"1\\\" class=\\\"detailRowTerm rowdetail left-column\\\">{{ detailTerm.campaign }}</td>\\n                                    <td *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowTerm rowdetail left-column\\\">{{ detailTerm.content }}</td>\\n                                    <td *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowTerm rowdetail left-column\\\"></td>\\n                                    <td *ngIf=\\\"grouping == NO_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowTerm rowdetail left-column\\\">{{ detailTerm.term }}</td>\\n                                    <td *ngIf=\\\"grouping == NO_GROUPING\\\" class=\\\"detailRowTerm rowdetail\\\" ></td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.billing_site_visits | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" ></td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.form_1_impressions | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.form_2_impressions | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.submits | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" ></td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.billing_impressions | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.sales | number }}</td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" ></td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" ></td>\\n                                    <td class=\\\"detailRowTerm rowdetail\\\" >{{ detailTerm.confirmation | number }}</td>\\n                                </tr>\\n                                <!-- LEVEL 5 -->\\n                                <tr *ngIf=\\\"detailTerm.showdetails && grouping != NO_GROUPING\\\" class=\\\"detailHeaderExtra\\\">\\n                                    <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\"></th>\\n                                    <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\">Source</th>\\n                                    <th *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\"></th>\\n                                    <th *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\"></th>\\n                                    <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\">Billing Site</th>\\n                                    <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\">Campaign</th>\\n                                    <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\">Content</th>\\n                                    <th *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\">Term</th>\\n                                    <th *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra left-column\\\"></th>\\n                                    <th class=\\\"detailHeaderExtra\\\"></th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Billing site hits</th>\\n                                    <th class=\\\"detailHeaderExtra\\\"></th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Form 1</th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Form 2</th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Submits</th>\\n                                    <th class=\\\"detailHeaderExtra\\\"></th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Billing page</th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Sales</th>\\n                                    <th class=\\\"detailHeaderExtra\\\">Confirmations</th>\\n                                </tr>\\n                                <template *ngIf=\\\"detailTerm.showdetails && grouping != NO_GROUPING\\\" ngFor let-extraDetails [ngForOf]=\\\"detailTerm.details\\\">\\n                                    <tr (click)=\\\"loadLevel6ClickFun(data, detail, detailCampaign, detailContent, detailTerm, extraDetails)\\\" class=\\\"detailRowContent rowdetail\\\" [ngClass]=  \\\"{ 'normalBorderRow': extraDetails.showdetails === true }\\\">\\n                                        <td colspan=\\\"1\\\" class=\\\"detailRowExtra rowdetail left-column\\\"></td>\\n                                        <td colspan=\\\"1\\\" class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.source }}</td>\\n                                        <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowExtra rowdetail left-column\\\"></td>\\n                                        <td *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowExtra rowdetail left-column\\\"></td>\\n                                        <td colspan=\\\"1\\\"class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.billing_site }}</td>\\n                                        <td colspan=\\\"1\\\" class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.campaign }}</td>\\n                                        <td colspan=\\\"1\\\"class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.content }}</td>\\n                                        <td *ngIf=\\\"grouping != VERTICAL_GROUPING && grouping != DATE_GROUPING && grouping != SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.term }}</td>\\n                                        <td *ngIf=\\\"grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING\\\" colspan=\\\"1\\\"class=\\\"detailRowExtra rowdetail left-column\\\">{{ extraDetails.term }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" ></td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.billing_site_visits | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" ></td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.form_1_impressions | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.form_2_impressions | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.submits | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" ></td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.billing_impressions | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.sales | number }}</td>\\n                                        <td class=\\\"detailRowExtra rowdetail\\\" >{{ extraDetails.confirmation | number }}</td>\\n                                    </tr>\\n                                    <!-- LEVEL 6 -->\\n                                    <tr *ngIf=\\\"extraDetails.showdetails && (grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING)\\\" class=\\\"detailHeaderExtra2\\\">\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\"></th>\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\">Source</th>\\n                                        <th *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\"></th>\\n                                        <th *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\"></th>\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\">Billing Site</th>\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\">Campaign</th>\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\">Content</th>\\n                                        <th colspan=\\\"1\\\" class=\\\"detailHeaderExtra2 left-column\\\">Term</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\"></th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Billing site hits</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\"></th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Form 1</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Form 2</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Submits</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\"></th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Billing page</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Sales</th>\\n                                        <th class=\\\"detailHeaderExtra2\\\">Confirmations</th>\\n                                    </tr>\\n                                    <template *ngIf=\\\"extraDetails.showdetails && (grouping == VERTICAL_GROUPING || grouping == DATE_GROUPING || grouping == SOURCE_GROUPING)\\\" ngFor let-extraDetails2 [ngForOf]=\\\"extraDetails.details\\\">\\n                                        <tr>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowExtra2 rowdetail left-column\\\"></td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowExtra2 rowdetail left-column\\\">{{ extraDetails2.source }}</td>\\n                                            <td *ngIf=\\\"grouping == DATE_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowExtra2 rowdetail left-column\\\"></td>\\n                                            <td *ngIf=\\\"grouping != NO_GROUPING\\\" colspan=\\\"1\\\" class=\\\"detailRowExtra2 rowdetail left-column\\\"></td>\\n                                            <td colspan=\\\"1\\\"class=\\\"detailRowExtra2 rowdetail left-column\\\">{{ extraDetails2.billing_site }}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowExtra2 rowdetail left-column\\\">{{ extraDetails2.campaign }}</td>\\n                                            <td colspan=\\\"1\\\"class=\\\"detailRowExtra2 rowdetail left-column\\\">{{ extraDetails2.content }}</td>\\n                                            <td colspan=\\\"1\\\"class=\\\"detailRowExtra2 rowdetail left-column\\\">{{ extraDetails2.term }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" ></td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.billing_site_visits | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" ></td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.form_1_impressions | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.form_2_impressions | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.submits | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" ></td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.billing_impressions | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.sales | number }}</td>\\n                                            <td class=\\\"detailRowExtra2 rowdetail\\\" >{{ extraDetails2.confirmation | number }}</td>\\n                                        </tr>\\n                                    </template>\\n                                </template>\\n                            </template>\\n                        </template>                        \\n                    </template>\\n                </template>\\n          </template>\\n          </tbody>\\n        </md-data-table>\\n    \\n        <md-toolbar color=\\\"accent\\\">\\n            <span>\\n                <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n            </span>\\n            <span style=\\\"padding-left: 15px\\\">\\n                <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetail()\\\"><mdl-icon>get_app</mdl-icon>Detail</button>\\n            </span>        \\n            <span flex hide show-gt-md></span>\\n            <span hide show-gt-md>\\n                <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n                </md-pagination>\\n            </span>\\n    </md-toolbar>\\n    \\n    </div>\\n    \"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.html\n ** module id = 800\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n\\n        <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n    \\n            <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n                <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                    <h3>From:</h3>\\n                </div>\\n                <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                    <md2-datepicker min=\\\"01/08/2019\\\"\\n                                    [(ngModel)]=\\\"fromDate\\\"\\n                                    type=\\\"date\\\"\\n                                    startAt=\\\"startDate\\\"\\n                                    placeholder=\\\"Date\\\"\\n                                    format=\\\"MM/DD/YYYY\\\"\\n                                    (change)=\\\"changeDates($event)\\\">\\n                    </md2-datepicker>\\n                </div>\\n            </div>\\n    \\n            <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n                <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                    <h3>To:</h3>\\n                </div>\\n                <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                    <md2-datepicker min=\\\"01/08/2019\\\"\\n                                    [(ngModel)]=\\\"toDate\\\"\\n                                    type=\\\"date\\\"\\n                                    placeholder=\\\"Date\\\"\\n                                    format=\\\"MM/DD/YYYY\\\"\\n                                    startAt=\\\"startDate\\\"\\n                                    (change)=\\\"changeDates($event)\\\">\\n                    </md2-datepicker>\\n                </div>\\n            </div>\\n            \\n        </div>\\n        \\n    </div>\\n    \\n    <div mdl-shadow=\\\"2\\\">\\n        <md-toolbar color=\\\"accent\\\">\\n            <span>Visitor ID Pivoted</span>\\n            <span>\\n                <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                    <mdl-spinner class=\\\"loading\\\" [active]=\\\"searching\\\"></mdl-spinner>\\n                </div>\\n            </span>\\n            <span flex hide show-gt-md></span>\\n            <span hide show-gt-md>\\n                <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\"></md-pagination>\\n            </span>\\n        </md-toolbar>\\n        \\n        <!-- LEVEL 1 Table -->\\n        <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n        <thead>\\n            <!-- LEVEL 1 Header -->\\n            <tr class=\\\"revenue-table-cell-header\\\">\\n                <th class=\\\"revenue-table-cell-header left-column\\\">Date</th>\\n                <th class=\\\"revenue-table-cell-header left-column\\\">Domain</th>\\n                <th class=\\\"revenue-table-cell-header\\\">Visits</th>\\n                <th class=\\\"revenue-table-cell-header\\\">CookieSelected</th>\\n                <th class=\\\"revenue-table-cell-header\\\">CookieResponded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">CookieSucceeded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">CookieEmailsSucceeded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TowerMd5Selected</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TowerMd5Responded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TowerMd5Succeeded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TowerMd5EmailsSucceeded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TraverseMd5Selected</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TraverseMd5Responded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TraverseMd5Succeeded</th>\\n                <th class=\\\"revenue-table-cell-header\\\">TraverseMd5EmailsSucceeded</th>\\n            </tr>\\n        </thead>\\n        <tbody>\\n            <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n                <!-- LEVEL 1 Data -->\\n                <tr (click)=\\\"showSecondLevel(data)\\\" [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'secondLevelDivHeader': data.showSecondLevel === true }\\\">\\n                    <td class=\\\"revenue-table-cell left-column\\\">{{ data.date }}</td>\\n                    <td class=\\\"revenue-table-cell left-column\\\">{{ data.domain }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.visits }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.cookieSelected }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.cookieResponded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.cookieSucceeded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.cookieEmailsSucceeded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.towerMd5Selected }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.towerMd5Responded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.towerMd5Succeeded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.towerMd5EmailsSucceeded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.traverseMd5Selected }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.traverseMd5Responded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.traverseMd5Succeeded }}</td>\\n                    <td class=\\\"revenue-table-cell\\\">{{ data.traverseMd5EmailsSucceeded }}</td>\\n                </tr>\\n            </template>\\n        </tbody>\\n    </md-data-table>\\n</div>\\n        \"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.html\n ** module id = 801\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n\\n        <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n    \\n            <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n                <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                    <h3>From:</h3>\\n                </div>\\n                <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                    <md2-datepicker min=\\\"01/08/2019\\\"\\n                                    [(ngModel)]=\\\"fromDate\\\"\\n                                    type=\\\"date\\\"\\n                                    startAt=\\\"startDate\\\"\\n                                    placeholder=\\\"Date\\\"\\n                                    format=\\\"MM/DD/YYYY\\\"\\n                                    (change)=\\\"changeDates($event)\\\">\\n                    </md2-datepicker>\\n                </div>\\n            </div>\\n    \\n            <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n                <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                    <h3>To:</h3>\\n                </div>\\n                <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                    <md2-datepicker min=\\\"01/08/2019\\\"\\n                                    [(ngModel)]=\\\"toDate\\\"\\n                                    type=\\\"date\\\"\\n                                    placeholder=\\\"Date\\\"\\n                                    format=\\\"MM/DD/YYYY\\\"\\n                                    startAt=\\\"startDate\\\"\\n                                    (change)=\\\"changeDates($event)\\\">\\n                    </md2-datepicker>\\n                </div>\\n            </div>\\n            \\n        </div>\\n        \\n    </div>\\n    \\n    <div mdl-shadow=\\\"2\\\">\\n            <md-toolbar color=\\\"accent\\\">\\n              <span>Visitor ID</span>\\n              <span>\\n                  <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                        <mdl-spinner class=\\\"loading\\\" [active]=\\\"searching\\\"></mdl-spinner>\\n                  </div>\\n              </span>\\n              <span flex hide show-gt-md></span>\\n              <span hide show-gt-md>\\n                <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n                </md-pagination>\\n              </span>\\n            </md-toolbar>\\n        \\n            <!-- LEVEL 1 Table -->\\n            <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n                <thead>\\n                    <!-- LEVEL 1 Header -->\\n                    <tr class=\\\"revenue-table-cell-header\\\">\\n                        <th class=\\\"revenue-table-cell-header left-column\\\">Date</th>\\n                        <th class=\\\"revenue-table-cell-header left-column\\\">Visit Count</th>\\n                    </tr>\\n                </thead>\\n                <tbody>\\n                    <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n                        <!-- LEVEL 1 Data -->\\n                        <tr (click)=\\\"showSecondLevel(data)\\\" [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'secondLevelDivHeader': data.showSecondLevel === true }\\\">\\n                            <td class=\\\"revenue-table-cell left-column\\\">{{ data.date }}</td>\\n                            <td class=\\\"revenue-table-cell left-column\\\">{{ data.visitCount }}</td>    \\n                        </tr>\\n                        <!-- LEVEL 2 Table -->\\n                        <div *ngIf=\\\"data.showSecondLevel\\\" class=\\\"secondLevelDivDetail\\\">\\n                            <md-data-table class=\\\"tableFixHead\\\" layout-fill >\\n                                <thead>\\n                                    <!-- LEVEL 2 Header -->\\n                                    <tr class=\\\"revenue-table-cell-header detailHeaderL2\\\">\\n                                        <th class=\\\"detailHeaderL2 left-column\\\">Domain</th>\\n                                        <!-- <th class=\\\"detailHeaderL2 left-column\\\">Publisher</th> -->\\n                                        <th class=\\\"detailHeaderL2\\\">Slot</th>\\n                                        <th class=\\\"detailHeaderL2\\\">Page</th>\\n                                        <th class=\\\"detailHeaderL2\\\">MD5 Provider</th>\\n                                        <th class=\\\"detailHeaderL2\\\">Selected</th>\\n                                        <th class=\\\"detailHeaderL2\\\">Responded</th>\\n                                        <th class=\\\"detailHeaderL2\\\">Succeeded</th>          \\n                                    </tr>\\n                                </thead>\\n                                <tbody>\\n                                    <template ngFor let-detail [ngForOf]=\\\"data.details\\\">\\n                                        <!-- LEVEL 2 Data -->\\n                                        <tr (click)=\\\"showThirdLevel(data, detail)\\\" class=\\\"detailRowL2 rowdetail\\\" [ngClass]=  \\\"{ 'thirdLevelDivHeader': detail.showThirdLevel === true }\\\">\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail left-column\\\">{{ detail.domain }}</td>\\n                                            <!-- <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail left-column\\\">{{ detail.publisher }}</td> -->\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.slot | number }}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.page | number }}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.provider}}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.selected | number }}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.responded | number }}</td>\\n                                            <td colspan=\\\"1\\\" class=\\\"detailRowL2 rowdetail\\\" >{{ detail.succeeded | number }}</td>\\n                                        </tr>\\n                                        <!-- LEVEL 3 Header -->\\n                                        <tr *ngIf=\\\"detail.showThirdLevel\\\">\\n                                            <th class=\\\"\\\"></th>\\n                                            <!-- <th class=\\\"\\\"></th> -->\\n                                            <th class=\\\"detailHeaderL3\\\">Slot</th>\\n                                            <th class=\\\"detailHeaderL3\\\">Page</th>\\n                                            <th class=\\\"detailHeaderL3\\\">Email Provider</th>\\n                                            <th class=\\\"detailHeaderL3\\\">Selected</th>\\n                                            <th class=\\\"detailHeaderL3\\\">Responded</th>\\n                                            <th class=\\\"detailHeaderL3\\\">Succeeded</th>\\n                                        </tr>\\n                                        <template *ngIf=\\\"detail.showThirdLevel\\\" ngFor let-thirdLevelData [ngForOf]=\\\"detail.details\\\">\\n                                            <!-- LEVEL 3 Data -->\\n                                            <tr class=\\\"detailRowCampaign rowdetail\\\">\\n                                                <td colspan=\\\"1\\\" class=\\\"rowdetail\\\"></td>\\n                                                <!-- <td colspan=\\\"1\\\" class=\\\"rowdetail\\\"></td> -->\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.slot | number }}</td>\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.page | number }}</td>\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.provider}}</td>\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.selected | number }}</td>\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.responded | number }}</td>\\n                                                <td colspan=\\\"1\\\" class=\\\"detailRowL3 rowdetail\\\" >{{ thirdLevelData.succeeded | number }}</td>\\n                                            </tr> \\n                                        </template>\\n                                    </template>\\n                                </tbody>\\n                            </md-data-table>\\n                        </div>\\n                </template>\\n              </tbody>\\n            </md-data-table>\\n            \\n        </div>\\n        \"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.html\n ** module id = 802\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"col-lg-12 col-sm-12\\\">\\n            <div class=\\\"col-lg-6 col-sm-12\\\">\\n                <h3>Processing Co.:\\n                        <button *ngIf=\\\"gatewayError\\\" mdl-tooltip-large=\\\"Error\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"accent\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>                \\n                        <button *ngIf=\\\"gatewayDelay\\\" mdl-tooltip-large=\\\"Updating\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>\\n                </h3>\\n            </div>\\n            <div class=\\\"col-lg-6 col-sm-12\\\">\\n                  <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n                    <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"col-lg-12 col-sm-12\\\">\\n                <div class=\\\"col-lg-6 col-sm-12\\\">\\n                    <h3>Processor Id:</h3>\\n                </div>\\n                <div class=\\\"col-lg-6 col-sm-12\\\">\\n                      <mdl-select [(ngModel)]=\\\"processorId\\\" (change)=\\\"onProcessorChange(processorId)\\\" >\\n                        <mdl-option *ngFor=\\\"let processor of processors\\\" [value]=\\\"processor.id\\\">{{processor.name}}</mdl-option>\\n                      </mdl-select>\\n                </div>\\n        </div>\\n        <div class=\\\"col-lg-12 col-sm-12\\\">\\n                <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"col-lg-12 col-sm-12\\\">\\n            <div class=\\\"col-lg-4 col-sm-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-lg-8 col-sm-8\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"col-lg-12 col-sm-12\\\">\\n            <div class=\\\"col-lg-4 col-sm-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-lg-8 col-sm-8\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Date</th>\\n        <th class=\\\"md-text-cell\\\">Processor Id</th>\\n        <th>Charges</th>\\n        <th>Refunds</th>\\n        <th>Voids</th>\\n        <th>Totals</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.transaction_day }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.processor_id }}</td>\\n        <td>${{ data.charges }}</td>\\n        <td>${{ data.refunds }}</td>\\n        <td>${{ data.voids }}</td>\\n        <td>${{ data.totals }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/gateway-data/dashboard.component.html\n ** module id = 803\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-md-6 col-lg-6\\\">\\n                <h3>Login User:\\n                        <button *ngIf=\\\"gatewayError\\\" mdl-tooltip-large=\\\"Error\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"accent\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>                \\n                        <button *ngIf=\\\"gatewayDelay\\\" mdl-tooltip-large=\\\"Updating\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>                        \\n                </h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"userId\\\" (change)=\\\"onChangeUser(userId)\\\" >\\n                    <mdl-option *ngFor=\\\"let user of users\\\" [value]=\\\"user.id\\\">{{user.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-md-6 col-lg-6\\\">\\n                <h3>Processing Co.:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"processorId\\\" (change)=\\\"onChangeProcessor(processorId)\\\" >\\n                    <mdl-option *ngFor=\\\"let processor of processors\\\" [value]=\\\"processor.id\\\">{{processor.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-6 col-sm-6 col-md-6 col-lg-6\\\">\\n                <h3>Operating Co.:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"operatingId\\\" (change)=\\\"onChangeOperating(operatingId)\\\" >\\n                    <mdl-option *ngFor=\\\"let operating of operatings\\\" [value]=\\\"operating.id\\\">{{operating.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>ISO:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"isoId\\\" (change)=\\\"onChangeIso(isoId)\\\" >\\n                    <mdl-option *ngFor=\\\"let iso of isos\\\" [value]=\\\"iso.id\\\">{{iso.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Range:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n              <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onRangeChange(rangeId)\\\" >\\n                <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n              </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n<div style=\\\"overflow-x:scroll;\\\" mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Log. User</th>\\n        <th class=\\\"md-text-cell\\\">Processor Name</th>\\n        <th class=\\\"md-text-cell\\\">Operating Co.</th>\\n        <th class=\\\"md-text-cell\\\">Processing Co.</th>\\n        <th class=\\\"md-text-cell\\\">ISO</th>\\n        <th class=\\\"md-text-cell\\\">MID</th>\\n        <th class=\\\"md-text-cell\\\">Product</th>\\n        <th class=\\\"md-text-cell\\\">Domain</th>\\n        <th >Mo. Cap.</th>\\n        <th >Charges</th>\\n        <th >Usage %</th>\\n        <th >Projection</th>\\n        <th >Days to limit</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\" >\\n        <td class=\\\"md-text-cell\\\">{{ data.user }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.processor_name }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.operating }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.processor }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.iso }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.mid }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.product }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.domain }}</td>\\n        <td >${{ data.mo_cap }}</td>\\n        <td >${{ data.charges }}</td>\\n        <td [style.background-color]=\\\"data.background\\\" >{{ data.usagepercent }}</td>\\n        <td [style.background-color]=\\\"data.projectioncolor\\\" >${{ data.projection }}</td>\\n        <td [style.background-color]=\\\"data.projectioncolor\\\" >{{ data.projecteddays }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/gateway-status/dashboard.component.html\n ** module id = 804\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <div class=\\\"col-lg-4 col-sm-2\\\">\\n            <h3>Iso:\\n                    <button *ngIf=\\\"isoError\\\" mdl-tooltip-large=\\\"Error\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"accent\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>                \\n                    <button *ngIf=\\\"isoDelay\\\" mdl-tooltip-large=\\\"Updating\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>                \\n            </h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n              <mdl-select [(ngModel)]=\\\"isoId\\\" (change)=\\\"onChangeIso(isoId)\\\" >\\n                <mdl-option *ngFor=\\\"let iso of isos\\\" [value]=\\\"iso.id\\\">{{iso.name}}</mdl-option>\\n              </mdl-select>\\n        </div>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <div class=\\\"col-lg-7 col-sm-6\\\">\\n            <h3>Processing Co.:</h3>\\n        </div>\\n        <div class=\\\"col-lg-5 col-sm-6\\\">\\n              <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n                <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n              </mdl-select>\\n        </div>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <div class=\\\"col-lg-2 col-sm-2\\\">\\n            <h3>From:</h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n            <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                            type=\\\"date\\\"\\n                            placeholder=\\\"Date\\\"\\n                            format=\\\"MM/DD/YYYY\\\"\\n                            (change)=\\\"changeDates($event)\\\">\\n            </md2-datepicker>\\n        </div>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <div class=\\\"col-lg-2 col-sm-2\\\">\\n            <h3>To:</h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n            <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                            type=\\\"date\\\"\\n                            placeholder=\\\"Date\\\"\\n                            format=\\\"MM/DD/YYYY\\\"\\n                            (change)=\\\"changeDates($event)\\\">\\n            </md2-datepicker>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Date</th>\\n        <th class=\\\"md-text-cell\\\">Merchant Id</th>\\n        <th class=\\\"md-text-cell\\\">DBA Name</th>\\n        <th >Charges</th>\\n        <th >Refunds</th>\\n        <th >Net Sales</th>\\n        <th >Adjustments</th>\\n        <th >Fees</th>\\n        <th >Deposits</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.transaction_day }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.merchant_id }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.dba_name }}</td>\\n        <td >${{ data.charges }}</td>\\n        <td >${{ data.refunds }}</td>\\n        <td >${{ data.netsales }}</td>\\n        <td >${{ data.adjustments }}</td>\\n        <td >${{ data.fees }}</td>\\n        <td >${{ data.deposits }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/iso-data/dashboard.component.html\n ** module id = 805\n ** module chunks = 2\n **/","module.exports = \"<!-- START widgets box-->\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <h3>Revenue: by network</h3>\\n    </div>\\n    <div class=\\\"col-lg-6 col-sm-12\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n\\n<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n            <!-- START widget-->\\n            <div class=\\\"panel widget bg-green\\\">\\n                <div class=\\\"row row-table\\\">\\n                    <div class=\\\"col-xs-4 text-center bg-green-dark pv-lg\\\">\\n                        <em class=\\\"icon-wallet fa-3x\\\"></em>\\n                    </div>\\n                    <div class=\\\"col-xs-8 pv-lg\\\">\\n                        <div class=\\\"h3 mt0\\\">{{stats.revenue | number}}</div>\\n                        <div class=\\\"text-uppercase\\\">Gross Revenue</div>\\n                    </div>\\n                </div>\\n            </div>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n        <!-- START widget-->\\n        <div class=\\\"panel widget bg-green\\\">\\n            <div class=\\\"row row-table\\\">\\n                <div class=\\\"col-xs-4 text-center bg-green-dark pv-lg\\\">\\n                    <em class=\\\"icon-wallet fa-3x\\\"></em>\\n                </div>\\n                <div class=\\\"col-xs-8 pv-lg\\\">\\n                    <div class=\\\"h3 mt0\\\">{{stats.net_revenue | number}}</div>\\n                    <div class=\\\"text-uppercase\\\">Net Revenue</div>\\n                </div>\\n            </div>\\n        </div>\\n    </div>    \\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n            <!-- START widget-->\\n            <div class=\\\"panel widget bg-info\\\">\\n                <div class=\\\"row row-table\\\">\\n                    <div class=\\\"col-xs-4 text-center bg-info-dark pv-lg\\\">\\n                        <em class=\\\"icon-mouse fa-3x\\\"></em>\\n                    </div>\\n                    <div class=\\\"col-xs-8 pv-lg\\\">\\n                        <div class=\\\"h3 mt0\\\">{{stats.clicks | number}}\\n                        </div>\\n                        <div class=\\\"text-uppercase\\\">Clicks</div>\\n                    </div>\\n                </div>\\n            </div>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-12\\\">\\n            <!-- START widget-->\\n            <div class=\\\"panel widget bg-danger-light\\\">\\n                <div class=\\\"row row-table\\\">\\n                    <div class=\\\"col-xs-4 text-center bg-danger pv-lg\\\">\\n                        <em class=\\\"icon-credit-card fa-3x\\\"></em>\\n                    </div>\\n                    <div class=\\\"col-xs-8 pv-lg\\\">\\n                        <div *ngIf=\\\"!loadingExpense\\\" class=\\\"h3 mt0\\\">{{stats.spend | number}}</div>\\n                        <div *ngIf=\\\"loadingExpense\\\" class=\\\"h3 mt0\\\">\\n                            <mdl-spinner [active]=\\\"loadingExpense\\\"></mdl-spinner>\\n                        </div>\\n                        <div class=\\\"text-uppercase\\\">Expense</div>\\n                    </div>\\n                </div>\\n            </div>\\n    </div>\\n</div>\\n<div class=\\\"hidden-xs mdl-grid\\\">\\n    <div class=\\\"col-lg-9 col-sm-12 chart\\\">\\n        <by-network #thechart [fromDate]='fromDate' [toDate]='toDate' ></by-network>\\n    </div>\\n</div>\\n<!-- END widgets box-->\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/main/dashboard.component.html\n ** module id = 806\n ** module chunks = 2\n **/","module.exports = \"<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Error list</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"errorpagination\\\" name=\\\"errorCounter\\\" (on-pagination-change)=\\\"detectErrorChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">N. Type</th>\\n        <th class=\\\"md-text-cell\\\">N. Name</th>\\n        <th class=\\\"md-text-cell\\\">E. Field</th>\\n        <th class=\\\"md-text-cell\\\">User</th>\\n        <th class=\\\"md-text-cell\\\">Download Date</th>\\n        <th class=\\\"md-text-cell\\\">Database Date</th>\\n        <th class=\\\"md-text-cell\\\">Error</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of errorpagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.network_type }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.network_name }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.extra_field }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.user }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.selenium_execution_date }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.persistence_execution_date }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.error }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n</div>\\n\\n<div id=\\\"divLine\\\" style=\\\"background-color:lightblue;border-bottom: 6px solid lightskyblue;background-color: lightgrey;\\\"></div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Delay list</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"delaypagination\\\" name=\\\"delayCounter\\\" (on-pagination-change)=\\\"detectDelayChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">N. Type</th>\\n        <th class=\\\"md-text-cell\\\">N. Name</th>\\n        <th class=\\\"md-text-cell\\\">E. Field</th>\\n        <th class=\\\"md-text-cell\\\">User</th>\\n        <th class=\\\"md-text-cell\\\">Download Date</th>\\n        <th class=\\\"md-text-cell\\\">Database Date</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of delaypagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.network_type }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.network_name }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.extra_field }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.user }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.selenium_execution_date }}</td>\\n        <td class=\\\"md-text-cell\\\">{{ data.persistence_execution_date }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n</div>\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/networks/dashboard.component.html\n ** module id = 807\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Vendor:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"vendorId\\\" (change)=\\\"onChangeVendor(vendorId)\\\" >\\n                    <mdl-option *ngFor=\\\"let vendor of vendors\\\" [value]=\\\"vendor.id\\\">{{vendor.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"domainId\\\" (change)=\\\"onChangeDomain(domainId)\\\" >\\n                    <mdl-option *ngFor=\\\"let domain of domains; let rowcount = index\\\" [value]=\\\"rowcount + 1\\\">{{domain.name}}</mdl-option>\\n                  </mdl-select>\\n                  <mdl-switch [(ngModel)]=\\\"trading\\\" mdl-ripple (change)=\\\"onChangeTrading()\\\">Trading</mdl-switch>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Range:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"dateId\\\" (change)=\\\"onDatesChange(dateId)\\\" >\\n                    <mdl-option *ngFor=\\\"let date of dates\\\" [value]=\\\"date.id\\\">{{date.name}}</mdl-option>\\n                  </mdl-select>\\n                  <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Revenue by day</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table class=\\\"revenue-table-cell\\\" layout-fill >\\n      <thead>\\n      <tr>\\n        <th>Date</th>\\n        <th class=\\\"hidden-xs revenue-table-cell\\\" >Domain</th>\\n        <th class=\\\"hidden-xs revenue-table-cell\\\" >Revenue</th>\\n        <th class=\\\"hidden-xs revenue-table-cell\\\" >Spend</th>\\n        <th class=\\\"hidden-xs revenue-table-cell\\\" >ROAS %</th>\\n        <th class=\\\"hidden-xs revenue-table-cell\\\" >NET</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" >\\n        <tr>\\n          <td class=\\\"\\\">{{ data.date }}</td>\\n          <td class=\\\"revenue-table-cell colummdetail \\\" (click)=\\\"showDetails( data, { group_name : '$domain' }, 'domain' )\\\">{{ data.domain }}</td>\\n          <td class=\\\"\\\">${{ data.revenue }}</td>\\n          <td class=\\\"\\\">${{ data.spend }}</td>\\n          <td class=\\\"\\\">{{ data.roas }}</td>\\n          <td class=\\\"\\\">${{ data.net }}</td>\\n        </tr>\\n        <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\" >\\n            <tr class=\\\"revenue-table-cell rowdetail\\\" style=\\\"background-color: #88aaff\\\">\\n                <td class=\\\"revenue-table-cell rowdetail\\\"  colspan=\\\"2\\\" >{{ detail.domain }}</td>\\n                <td class=\\\"revenue-table-cell rowdetail\\\" >${{ detail.revenue }}</td>\\n                <td class=\\\"revenue-table-cell rowdetail\\\" >${{ detail.spend }}</td>\\n                <td class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.roas }}</td>\\n                <td class=\\\"revenue-table-cell rowdetail\\\" >${{ detail.net }}</td>\\n            </tr>\\n        </template>\\n  </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n        </span>\\n        <span *ngIf=\\\"fulldetailreport\\\" style=\\\"padding-left: 15px\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetails()\\\"><mdl-icon>get_app</mdl-icon>Detail</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/pandl/dashboard.component.html\n ** module id = 808\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue filtersContainer\\\">\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Network:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"networkId\\\" (change)=\\\"onChangeNetwork(networkId)\\\" >\\n                    <mdl-option *ngFor=\\\"let network of networks\\\" [value]=\\\"network.id\\\">{{network.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n                <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                    <mdl-switch [(ngModel)]=\\\"history\\\" mdl-ripple (change)=\\\"onChangeHistory()\\\">History</mdl-switch>\\n                </div>\\n            </div>\\n        </div>        \\n    </div>\\n\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"YYYY-MM-DD\\\"\\n                                [disabled]=\\\"!history\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"YYYY-MM-DD\\\"\\n                                [disabled]=\\\"!history\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <div *ngIf=\\\"!history\\\">\\n        <md-data-table layout-fill>\\n            <thead>\\n                <tr>\\n                    <th class=\\\"md-text-cell\\\">Edit</th>\\n                    <th class=\\\"md-text-cell\\\">Network</th>\\n                    <th class=\\\"md-text-cell\\\">Class</th>\\n                    <th class=\\\"md-text-cell\\\">Coefficient</th>\\n                    <th class=\\\"md-text-cell\\\">Extra Info</th>\\n                </tr>\\n            </thead>\\n            <tbody>\\n                <tr *ngFor=\\\"let data of pagedData\\\">\\n                    <td class=\\\"md-text-cell\\\">\\n                        <button #editRevSplitValue mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"editCoefficient(data)\\\">\\n                            <mdl-icon>settings</mdl-icon>\\n                        </button>\\n                    </td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.network_name }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.name }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.coefficient }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.extra_field }}</td>\\n                </tr>\\n            </tbody>\\n        </md-data-table>        \\n    </div>\\n\\n    <div *ngIf=\\\"history\\\">\\n        <md-data-table layout-fill>\\n            <thead>\\n                <tr>\\n                    <th class=\\\"md-text-cell\\\">Edit</th>\\n                    <th class=\\\"md-text-cell\\\">Network</th>\\n                    <th class=\\\"md-text-cell\\\">Class</th>\\n                    <th class=\\\"md-text-cell\\\">Date</th>\\n                    <th class=\\\"md-text-cell\\\">Coefficient</th>\\n                    <th class=\\\"md-text-cell\\\">Created By</th>\\n                    <th class=\\\"md-text-cell\\\">Updated By</th>\\n                </tr>\\n            </thead>\\n            <tbody>\\n                <tr *ngFor=\\\"let data of pagedData\\\">\\n                    <td class=\\\"md-text-cell\\\">\\n                        <button #editRevSplitValue mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"editCoefficient(data)\\\">\\n                            <mdl-icon>settings</mdl-icon>\\n                        </button>\\n                    </td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.network_name }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.name }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.date }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.coefficient }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.created_by }}</td>\\n                    <td class=\\\"md-text-cell\\\">{{ data.updated_by }}</td>\\n                </tr>\\n            </tbody>\\n        </md-data-table>        \\n    </div>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\\n<mdl-dialog #editNetworkCoefficient\\n            [mdl-dialog-config]=\\\"{\\n              clickOutsideToClose: true,\\n              styles:{'width': '300px'}}\\\"\\n            (show)=\\\"onDialogShow(dialogRef)\\\"\\n            (hide)=\\\"onDialogHide()\\\">\\n  <h3 class=\\\"mdl-dialog__title\\\">Edit Rev Split Value</h3>\\n  <div class=\\\"mdl-dialog__content\\\">\\n    <rev-split-values-editor [revSplitValue]=\\\"revSplitValue\\\"></rev-split-values-editor>\\n  </div>\\n  <div class=\\\"mdl-dialog__actions\\\">\\n    <button mdl-button (click)=\\\"saveRevSplitValue()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Save</button>\\n    <button mdl-button (click)=\\\"editNetworkCoefficient.close()\\\" mdl-ripple>Close</button>\\n  </div>\\n</mdl-dialog>\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/rev-split-values/dashboard.component.html\n ** module id = 809\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Network:\\n                    <button *ngIf=\\\"networkError\\\" mdl-tooltip-large=\\\"Error\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"accent\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>\\n                    <button *ngIf=\\\"networkDelay\\\" mdl-tooltip-large=\\\"Updating\\\" mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\" [routerLink]=\\\"['/networks']\\\" ><mdl-icon>bug_report</mdl-icon></button>\\n                </h3>\\n                \\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"networkId\\\" (change)=\\\"onChangeNetwork(networkId)\\\" >\\n                    <mdl-option *ngFor=\\\"let network of networks\\\" [value]=\\\"network.id\\\">{{network.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"domainId\\\" (change)=\\\"onChangeDomain(domainId)\\\" >\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Channel:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"channelId\\\" (change)=\\\"onChangeChannel(channelId)\\\" >\\n                    <mdl-option *ngFor=\\\"let channel of channels\\\" [value]=\\\"channel.id\\\">{{channel.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Sub-channel:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"subChannelId\\\" (change)=\\\"onChangeSubChannel(subChannelId)\\\" >\\n                    <mdl-option *ngFor=\\\"let subChannel of subChannels\\\" [value]=\\\"subChannel.id\\\">{{subChannel.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <!-- <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Signal:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-select [(ngModel)]=\\\"audienceId\\\" (change)=\\\"onChangeAudience(audienceId)\\\" >\\n                    <mdl-option *ngFor=\\\"let audience of audiences\\\" [value]=\\\"audience.id\\\">{{audience.name}}</mdl-option>\\n                </mdl-select>\\n            </div>\\n        </div>         -->\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Offer:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"offerId\\\" (change)=\\\"onChangeOffer(offerId)\\\" >\\n                    <mdl-option *ngFor=\\\"let offer of offers\\\" [value]=\\\"offer.id\\\">{{offer.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <!-- <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3 *ngIf=\\\"pressEnter\\\">Day:</h3>\\n                <h3 *ngIf=\\\"!pressEnter\\\" mdl-badge=\\\"*\\\" >Day:</h3>\\n            </div>\\n            <div class=\\\"col-xs-4 col-sm-4 col-lg-4\\\" >\\n                  <mdl-textfield type=\\\"text\\\" label=\\\"All days\\\" [(ngModel)]=\\\"day\\\" floating-label autofocus (keyup)=\\\"onKeyup($event)\\\" (keyup.enter)=\\\"onChangeAge()\\\"></mdl-textfield>\\n            </div>    \\n        </div> -->\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Source Domain:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"originatingDomainId\\\" (change)=\\\"onChangeOriginatingDomain(originatingDomainId)\\\" >\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Range:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"dateId\\\" (change)=\\\"onDatesChange(dateId)\\\" >\\n                    <mdl-option *ngFor=\\\"let date of dates\\\" [value]=\\\"date.id\\\">{{date.name}}</mdl-option>\\n                  </mdl-select>\\n                  <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <!-- <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-12 col-sm-12 col-md-12 col-lg-12\\\">\\n                <mdl-switch [mdl-ripple]=\\\"true\\\" [(ngModel)]=\\\"dayreport\\\">Day/Channel Report</mdl-switch>              \\n            </div>\\n        </div> -->\\n        <!-- <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-12 col-sm-12 col-md-12 col-lg-12\\\">\\n                <mdl-switch [mdl-ripple]=\\\"true\\\" [(ngModel)]=\\\"showBadDebt\\\" (change)=\\\"onChangeBadDebt()\\\">Bad Debt</mdl-switch>              \\n            </div>\\n        </div> -->\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Sub id (filter):</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <mdl-textfield type=\\\"text\\\" label=\\\"sub id\\\" [(ngModel)]=\\\"subidfilter\\\" floating-label autofocus (keyup.enter)=\\\"onChangeSubid()\\\" ></mdl-textfield>\\n            </div>\\n        </div>        \\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Revenue by day</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table class=\\\"tableFixHead revenue-table-cell\\\" layout-fill >\\n        <thead>\\n            <tr class=\\\"revenue-table-cell-header\\\">\\n                <th class=\\\"revenue-table-cell-header hidden-xs revenue-table-cell\\\" *ngFor=\\\"let column of columns\\\">\\n                    <ng-container>\\n                        {{column}}\\n                    </ng-container>\\n                </th>\\n            </tr>\\n        </thead>  \\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" >\\n        <tr>\\n          <td *ngIf=\\\"fulldetailreport && columns.indexOf('Sub Id') !== -1\\\" class=\\\"colummdetail fulldetailreport\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_day', offer : '$sub_id_offer', subid : '$sub_id', network : '$network_name', channel : '$sub_id_channel', sub_channel : '$sub_id_sub_channel', utm_medium : '$sub_id_utm_medium', utm_campaign : '$sub_id_utm_campaign', originating_domain : '$sub_id_originating_domain', domain : '$sub_id_domain', audience : '$sub_id_audience', utm_content : '$sub_id_utm_content', avenue_domain : '$avenue_domain' }, 'fullreport' )\\\" >{{ data.date }}</td>\\n          <td *ngIf=\\\"!fulldetailreport\\\" class=\\\"revenue-table-cell\\\">{{ data.date }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Day') !== -1\\\" class=\\\"revenue-table-cell colummdetail hidden-xs\\\" (click)=\\\"showDayDetails( data )\\\" >{{ data.day }}</td>\\n          <td class=\\\"revenue-table-cell hidden-xs\\\" *ngIf=\\\"(fulldetailreport || channelkey === 'SMS') && columns.indexOf('Sub Id') !== -1\\\">All subids</td>\\n          <td *ngIf=\\\"columns.indexOf('Network') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$network_name' }, 'network' )\\\" >{{ data.network }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Source Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail hidden-xs\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_originating_domain' }, 'originating_domain' )\\\" >{{ data.originating_domain }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail hidden-xs\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_domain' }, 'domain' )\\\" >{{ data.domain }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Channel') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_channel' }, 'channel' )\\\">{{ data.channel }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Sub Channel') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_sub_channel', sub_channel : '$sub_id_sub_channel', channel : '$sub_id_channel' }, 'fullreport' )\\\">{{ data.sub_channel }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Utm Medium') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_utm_medium' }, 'utm_medium' )\\\">All UTMs</td>\\n          <td *ngIf=\\\"columns.indexOf('Utm Campaign') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_utm_campaign' }, 'utm_campaign' )\\\">All UTMs</td>\\n          <td *ngIf=\\\"columns.indexOf('Utm Content') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_utm_content' }, 'utm_content' )\\\">All UTMs</td>\\n          <td *ngIf=\\\"columns.indexOf('Utm Source') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_utm_source' }, 'utm_source' )\\\">All UTMs</td>\\n          <td *ngIf=\\\"columns.indexOf('Offer') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_offer' }, 'offer' )\\\">{{ data.offer }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Gross Revenue') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.revenue | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Net Revenue') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.net_revenue | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Page Views') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.page_views | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad requests') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.ad_requests }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Impressions') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.impressions | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad impressions') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.ad_impressions | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Visitors') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.visitors | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Clicks') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.clicks | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad clicks') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.ad_clicks | number }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Page CTR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.page_ctr }}%</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad request CTR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.ad_request_ctr }}%</td>\\n          <td *ngIf=\\\"columns.indexOf('CTR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ calculateGrossCtr(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad CTR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ calculateAdCtr(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('CPC') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.cpc | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Page RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">${{ basicDivision(data.revenue, data.page_views) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad Request RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ basicDivision(data.revenue, data.ad_requests) | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Impressions RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ basicDivision(data.revenue, data.impressions) | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Ad RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ basicDivision(data.revenue, data.ad_impressions) | currency:'USD':true }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Avenue Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs colummdetail hidden-xs\\\" (click)=\\\"showDetails( data, { group_name : '$avenue_domain' }, 'avenue_domain' )\\\" >All Avenue Domains</td>\\n          <td *ngIf=\\\"columns.indexOf('Active View') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.active_view }}%</td>\\n          <td *ngIf=\\\"columns.indexOf('RPC') !== -1\\\" class=\\\"revenue-table-cell\\\">{{  calculateRPC(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">{{  calculateRPM(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('VPR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{  calculateVPR(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Conversion') !== -1\\\" class=\\\"revenue-table-cell\\\">{{  calculateConversion(data) }}</td>\\n          <td *ngIf=\\\"columns.indexOf('Coverage') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.coverage }}%</td>\\n          <td *ngIf=\\\"columns.indexOf('Matched ad CTR') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ data.matched_ad_ctr }}%</td>\\n        </tr>\\n            <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\" >\\n                <tr class=\\\"revenue-table-cell rowdetail\\\" style=\\\"background-color: #88aaff\\\">\\n                <td class=\\\"revenue-table-cell colummdetail hidden-xs rowdetail\\\"></td>\\n                <td *ngIf=\\\"columns.indexOf('Day') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" colspan=\\\"2\\\" >{{ detail.day }}</td>\\n                <td class=\\\"revenue-table-cell rowdetail\\\"  *ngIf=\\\"(fulldetailreport  || channelkey === 'SMS') && columns.indexOf('Sub Id') !== -1\\\">{{ detail.subid }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Network') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.network }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Source Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.originating_domain }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.domain }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Channel') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.channel }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Sub Channel') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.sub_channel }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Utm Medium') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.utm_medium }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Utm Campaign') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.utm_campaign }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Utm Content') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.utm_content }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Utm Source') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.utm_source }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Offer') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.offer }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Gross Revenue') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.revenue | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Net Revenue') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ detail.net_revenue | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Page Views') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.page_views }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad requests') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.ad_requests }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Impressions') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.impressions }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad impressions') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.ad_impressions }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Visitors') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.visitors }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Clicks') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.clicks | number }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad clicks') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.ad_clicks }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Page CTR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.page_ctr }}%</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad request CTR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.ad_request_ctr }}%</td>\\n                <td *ngIf=\\\"columns.indexOf('CTR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ calculateGrossCtr(detail) }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad CTR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ calculateAdCtr(detail) }}</td>\\n                <td *ngIf=\\\"columns.indexOf('CPC') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.cpc | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Page RPM') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.page_rpm | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad Request RPM') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\">{{ detail.ad_request_rpm | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Impressions RPM') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.impression_rpm | currency:'USD':true }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Ad RPM') !== -1\\\" class=\\\"revenue-table-cell\\\">{{ detail.ad_rpm }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Avenue Domain') !== -1\\\" class=\\\"revenue-table-cell hidden-xs rowdetail\\\" >{{ detail.avenue_domain }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Active View') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.active_view }}</td>\\n                <td *ngIf=\\\"columns.indexOf('RPC') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{  calculateRPC(detail) }}</td>\\n\\n                <td *ngIf=\\\"columns.indexOf('RPM') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{  calculateRPM(detail) }}</td>\\n                <td *ngIf=\\\"columns.indexOf('VPR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{  calculateVPR(detail) }}</td>\\n                <td *ngIf=\\\"columns.indexOf('Conversion') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{  calculateConversion(detail) }}</td>\\n\\n                <td *ngIf=\\\"columns.indexOf('Coverage') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.coverage }}%</td>\\n                <td *ngIf=\\\"columns.indexOf('Matched ad CTR') !== -1\\\" class=\\\"revenue-table-cell rowdetail\\\" >{{ detail.matched_ad_ctr }}%</td>\\n                </tr>\\n            </template>\\n      </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n        </span>\\n        <span *ngIf=\\\"fulldetailreport || channelkey === 'SMS'\\\" style=\\\"padding-left: 15px\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetails(true)\\\"><mdl-icon>get_app</mdl-icon>Detail</button>\\n        </span>\\n        <span style=\\\"padding-left: 15px\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDayxreport()\\\"><mdl-icon>get_app</mdl-icon>Day Report</button>\\n        </span>\\n        <span style=\\\"padding-left: 15px\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadSubChannelDayReport()\\\"><mdl-icon>get_app</mdl-icon>Sub-Channel Report</button>\\n        </span>              \\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n</md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-analysis/dashboard.component.html\n ** module id = 810\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div class=\\\"col-lg-4 col-sm-12\\\">\\n        <div class=\\\"col-lg-2 col-sm-2\\\">\\n                <h3>Range</h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n              <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n                <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n              </mdl-select>\\n        </div>\\n    </div>\\n    <div class=\\\"col-lg-4 col-sm-12\\\">\\n        <div class=\\\"col-lg-2 col-sm-2\\\">\\n            <h3>From:</h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n            <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                            type=\\\"date\\\"\\n                            placeholder=\\\"Date\\\"\\n                            format=\\\"DD/MM/YYYY\\\"\\n                            (change)=\\\"changeDates($event)\\\">\\n            </md2-datepicker>\\n        </div>\\n    </div>\\n    <div class=\\\"col-lg-4 col-sm-12\\\">\\n        <div class=\\\"col-lg-2 col-sm-2\\\">\\n            <h3>To:</h3>\\n        </div>\\n        <div class=\\\"col-lg-6 col-sm-4\\\">\\n            <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                            type=\\\"date\\\"\\n                            placeholder=\\\"Date\\\"\\n                            format=\\\"DD/MM/YYYY\\\"\\n                            (change)=\\\"changeDates($event)\\\">\\n            </md2-datepicker>\\n        </div>\\n    </div>\\n</div>\\n\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>\\n          <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n      </span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Sub id</th>\\n        <th>Revenue</th>\\n        <th>Clicks</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.subid }}</td>\\n        <td>${{ data.revenue }}</td>\\n        <td>{{ data.clicks }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-by-subid/dashboard.component.html\n ** module id = 811\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-lg-6 col-sm-12\\\">\\n        <div class=\\\"mdl-grid\\\">\\n            <div class=\\\"col-lg-3 col-sm-6\\\">\\n                <h3>Network</h3>\\n            </div>\\n            <div class=\\\"col-lg-6 col-sm-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"networkId\\\" (change)=\\\"onChangeNetwork(networkId)\\\" >\\n                    <mdl-option *ngFor=\\\"let network of networks\\\" [value]=\\\"network.id\\\">{{network.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid\\\">\\n            <div class=\\\"col-lg-3 col-sm-6\\\">\\n                <h3>Domain</h3>\\n            </div>\\n            <div class=\\\"col-lg-6 col-sm-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"domainId\\\" (change)=\\\"onChangeDomain(domainId)\\\" >\\n                    <mdl-option *ngFor=\\\"let domain of domains\\\" [value]=\\\"domain.id\\\">{{domain.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid\\\">\\n            <div class=\\\"col-lg-3 col-sm-6\\\">\\n                <h3>Channel</h3>\\n            </div>\\n            <div class=\\\"col-lg-6 col-sm-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"channelId\\\" (change)=\\\"onChangeMedia(channelId)\\\" >\\n                    <mdl-option *ngFor=\\\"let channel of channels\\\" [value]=\\\"channel.id\\\">{{channel.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-lg-6 col-sm-12\\\">\\n        <div class=\\\"mdl-grid\\\">\\n            <div class=\\\"col-lg-3 col-sm-6\\\">\\n                <h3>Fixed:</h3>\\n            </div>\\n            <div class=\\\"col-lg-4 col-sm-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"dateId\\\" (change)=\\\"onDatesChange(dateId)\\\" >\\n                    <mdl-option *ngFor=\\\"let date of dates\\\" [value]=\\\"date.id\\\">{{date.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid\\\">\\n            <div class=\\\"col-lg-3 col-sm-6\\\">\\n                <h3>Custom:</h3>\\n            </div>\\n            <div class=\\\"col-lg-4 col-sm-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n      </span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th>Date</th>\\n        <th>Day</th>\\n        <th>Network</th>\\n        <th>Domain</th>\\n        <th>Channel</th>\\n        <th>Offer</th>\\n        <th>Revenue</th>\\n        <th>Clicks</th>\\n        <th>RPC</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" >\\n        <tr>\\n          <td >{{ data.date }}</td>\\n          <td class=\\\"colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_day', offer : '$sub_id_offer' }, 'day' )\\\" >{{ data.day }}</td>\\n          <td class=\\\"colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$network_name' }, 'network' )\\\" >{{ data.network }}</td>\\n          <td class=\\\"colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_domain' }, 'domain' )\\\" >{{ data.domain }}</td>\\n          <td class=\\\"colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_channel' }, 'channel' )\\\">{{ data.channel }}</td>\\n          <td class=\\\"colummdetail\\\" (click)=\\\"showDetails( data, { group_name : '$sub_id_offer' }, 'offer' )\\\">{{ data.offer }}</td>\\n          <td>${{ data.revenue }}</td>\\n          <td>{{ data.clicks }}</td>\\n          <td>{{ data.rpc }}</td>\\n        </tr>\\n            <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\" >\\n                <tr style=\\\"background-color: #88aaff\\\">\\n                <td colspan=\\\"2\\\" >{{ detail.day }}</td>\\n                <td>{{ detail.network }}</td>\\n                <td>{{ detail.domain }}</td>\\n                <td>{{ detail.channel }}</td>\\n                <td>{{ detail.offer }}</td>\\n                <td>${{ detail.revenue }}</td>\\n                <td>{{ detail.clicks }}</td>\\n                <td>{{ detail.rpc }}</td>\\n                </tr>\\n            </template>\\n      </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-daily/dashboard.component.html\n ** module id = 812\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Vendor:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"networkId\\\" (change)=\\\"onChangeNetwork(networkId)\\\" >\\n                    <mdl-option *ngFor=\\\"let network of networks\\\" [value]=\\\"network.id\\\">{{network.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Domain:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"domainId\\\" (change)=\\\"onChangeDomain(domainId)\\\" >\\n                    <mdl-option *ngFor=\\\"let domain of domains; let rowcount = index\\\" [value]=\\\"rowcount + 1\\\">{{domain.name}}</mdl-option>\\n                  </mdl-select>\\n            </div>\\n        </div>\\n    </div>\\n    <div mdl-shadow=\\\"2\\\" class=\\\"col-xs-12 col-sm-12 col-md-4 col-lg-4\\\">\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>Range:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                  <mdl-select [(ngModel)]=\\\"dateId\\\" (change)=\\\"onDatesChange(dateId)\\\" >\\n                    <mdl-option *ngFor=\\\"let date of dates\\\" [value]=\\\"date.id\\\">{{date.name}}</mdl-option>\\n                  </mdl-select>\\n                  <mdl-switch [(ngModel)]=\\\"aggregate\\\" mdl-ripple (change)=\\\"onChangeAggregate()\\\">Aggregate</mdl-switch>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>From:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"fromDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n        <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n            <div class=\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4\\\">\\n                <h3>To:</h3>\\n            </div>\\n            <div class=\\\"col-xs-6 col-sm-6 col-lg-6\\\">\\n                <md2-datepicker [(ngModel)]=\\\"toDate\\\"\\n                                type=\\\"date\\\"\\n                                placeholder=\\\"Date\\\"\\n                                format=\\\"MM/DD/YYYY\\\"\\n                                (change)=\\\"changeDates($event)\\\">\\n                </md2-datepicker>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Expense By Day</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table class=\\\"revenue-table-cell\\\" layout-fill >\\n      <thead>\\n      <tr>\\n        <th colspan=\\\"1\\\" class=\\\"left-column\\\">Date</th>\\n        <th colspan=\\\"4\\\" class=\\\"hidden-xs revenue-table-cell left-column\\\" >Domain</th>\\n        <th colspan=\\\"1\\\" class=\\\"revenue-table-cell\\\" >Expense</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <template ngFor let-data [ngForOf]=\\\"pagedData\\\" let-isEven=\\\"even\\\" let-isOdd=\\\"odd\\\">\\n        <!-- Root Level -->\\n        <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': data.showdetails === true }\\\" (click)=\\\"loadLevel1ClickFunc(data)\\\">\\n          <td colspan=\\\"1\\\" class=\\\"left-column\\\">{{ data.date }}</td>\\n          <td colspan=\\\"4\\\" *ngIf=\\\"aggregate\\\" class=\\\"revenue-table-cell hidden-xs colummdetail hidden-xs left-column\\\">All Domains</td>\\n          <td colspan=\\\"4\\\" *ngIf=\\\"!aggregate\\\" class=\\\"revenue-table-cell left-column\\\">{{ data.domain }}</td>\\n          <td colspan=\\\"1\\\" class=\\\"revenue-table-cell\\\">{{ data.spend | currency:'USD':true }}</td>\\n        </tr>\\n        <!-- LEVEL 1 - Source -->\\n        <tr *ngIf=\\\"data.showdetails\\\" class=\\\"detailHeaderBS\\\">\\n            <th colspan=\\\"1\\\" class=\\\"detailHeaderBS left-column\\\">Date</th>\\n            <th colspan=\\\"1\\\" class=\\\"detailHeaderBS left-column\\\">Domain</th>\\n            <th colspan=\\\"3\\\" class=\\\"detailHeaderBS left-column\\\">Source</th>\\n            <th colspan=\\\"1\\\" class=\\\"detailHeaderBS\\\">Expense</th>\\n        </tr>\\n        <template *ngIf=\\\"data.showdetails\\\" ngFor let-detail [ngForOf]=\\\"data.details\\\" >\\n            <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': detail.showdetails === true }\\\" (click)=\\\"loadLevel2ClickFun(detail)\\\">\\n                <td colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail left-column\\\" >-</td>\\n                <td colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail left-column\\\" >{{ detail.domain }}</td>\\n                <td colspan=\\\"3\\\" class=\\\"detailRowBS rowdetail left-column\\\" >{{ detail.source }}</td>\\n                <td colspan=\\\"1\\\" class=\\\"detailRowBS rowdetail\\\" >{{ detail.spend | currency:'USD':true }}</td>\\n            </tr>\\n            <!-- LEVEL 2 - Campaign -->\\n            <tr *ngIf=\\\"detail.showdetails\\\" class=\\\"detailHeaderCampaign\\\">\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\">Date</th>\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\">Domain</th>\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderCampaign left-column\\\">Source</th>\\n                <th colspan=\\\"2\\\" class=\\\"detailHeaderCampaign left-column\\\">Campaign</th>\\n                <th colspan=\\\"1\\\" class=\\\"detailHeaderCampaign\\\">Expense</th>\\n            </tr>\\n            <template *ngIf=\\\"detail.showdetails\\\" ngFor let-detailCampaign [ngForOf]=\\\"detail.details\\\">\\n                <tr [ngClass]=\\\"{ 'oddBasicRow': isOdd === true, 'evenBasicRow': isEven === true, 'normalBorderRow': detailCampaign.showdetails === true }\\\" (click)=\\\"loadLevel3ClickFun(detailCampaign)\\\">\\n                    <td colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\" >-</td>\\n                    <td colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\" >{{ detailCampaign.domain }}</td>\\n                    <td colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail left-column\\\" >{{ detailCampaign.source }}</td>\\n                    <td colspan=\\\"2\\\" class=\\\"detailRowCampaign rowdetail left-column\\\" >{{ detailCampaign.campaign }}</td>\\n                    <td colspan=\\\"1\\\" class=\\\"detailRowCampaign rowdetail\\\" >{{ detailCampaign.spend | currency:'USD':true }}</td>                    \\n                </tr>\\n                <!-- LEVEL 3 - SearchKeyword -->\\n                <tr *ngIf=\\\"detailCampaign.showdetails\\\" class=\\\"detailHeaderContent\\\">\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Date</th>\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Domain</th>\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Source</th>\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Campaign</th>\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent left-column\\\">Keyword</th>\\n                    <th colspan=\\\"1\\\" class=\\\"detailHeaderContent\\\">Expense</th>\\n                </tr>\\n                <template *ngIf=\\\"detailCampaign.showdetails\\\" ngFor let-detailKeyword [ngForOf]=\\\"detailCampaign.details\\\">\\n                    <tr class=\\\"detailRowContent rowdetail\\\">\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\" >-</td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\" >{{ detailKeyword.domain }}</td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\" >{{ detailKeyword.source }}</td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\" >{{ detailKeyword.campaign }}</td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail left-column\\\" >{{ detailKeyword.keyword }}</td>\\n                        <td colspan=\\\"1\\\" class=\\\"detailRowContent rowdetail\\\" >{{ detailKeyword.spend | currency:'USD':true }}</td>                        \\n                    </tr>\\n                </template>\\n            </template>\\n        </template>\\n      </template>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadMain()\\\"><mdl-icon>get_app</mdl-icon>Main</button>\\n        </span>\\n        <span *ngIf=\\\"fulldetailreport\\\" style=\\\"padding-left: 15px\\\">\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadDetails()\\\"><mdl-icon>get_app</mdl-icon>Detail</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/spend-analysis/dashboard.component.html\n ** module id = 813\n ** module chunks = 2\n **/","module.exports = \"<div *ngIf=\\\"!displayFullView\\\">\\n  <mdl-dialog #ediConfirmationPwdDialog [mdl-dialog-config]=\\\"{ styles:{'width': '300px'}}\\\" (show)=\\\"showEditSubIdDialog\\\" (hide)=\\\"onDialogHide()\\\">\\n    <h3 class=\\\"mdl-dialog__title\\\">Confirmation password</h3>\\n    <div class=\\\"mdl-dialog__content\\\">\\n      <remap-confirmation-pwd (passwordEvent)=\\\"verifyPassword($event)\\\"></remap-confirmation-pwd>\\n    </div>\\n    <div class=\\\"mdl-dialog__actions\\\">\\n      <button mdl-button (click)=\\\"verifyPassword()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Confirm</button>\\n      <button mdl-button (click)=\\\"closeConfirmationModal()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Close</button>\\n    </div>\\n  </mdl-dialog>\\n</div>\\n\\n<div *ngIf=\\\"displayFullView\\\">\\n  <div class=\\\"mdl-grid mdl-grid-revenue\\\">\\n      <div class=\\\"col-lg-4 col-sm-12\\\">\\n          <div class=\\\"col-lg-4 col-sm-2\\\">\\n              <h3>Sub id (filter):</h3>\\n          </div>\\n          <div class=\\\"col-lg-6 col-sm-4\\\">\\n                <mdl-textfield type=\\\"text\\\" label=\\\"sub id\\\" [(ngModel)]=\\\"subidfilter\\\" floating-label autofocus (keyup.enter)=\\\"onChangeSubid()\\\" ></mdl-textfield>\\n          </div>\\n      </div>\\n      <div class=\\\"col-lg-4 col-sm-12\\\">\\n          <div class=\\\"col-lg-4 col-sm-6\\\">\\n              <h3>Re-map:</h3>\\n          </div>\\n          <div class=\\\"col-lg-6 col-sm-6\\\">\\n            <mdl-textfield #passwordConfirmationBtn type=\\\"number\\\" label=\\\"days back\\\" [(ngModel)]=\\\"daysback\\\" floating-label autofocus (keyup.enter)=\\\"onChangeRemapBack()\\\" ></mdl-textfield>\\n          </div>\\n      </div>\\n      <div class=\\\"col-lg-4 col-sm-12\\\">\\n          <div class=\\\"col-lg-4 col-sm-6\\\">\\n              <h3>Network:</h3>\\n          </div>\\n          <div class=\\\"col-lg-6 col-sm-6\\\">\\n              <mdl-select [(ngModel)]=\\\"networkId\\\" (change)=\\\"onChangeNetwork(networkId)\\\" >\\n                  <mdl-option *ngFor=\\\"let network of networks\\\" [value]=\\\"network.id\\\">{{network.name}}</mdl-option>\\n              </mdl-select>\\n          </div>\\n      </div>    \\n  </div>\\n\\n  <div mdl-shadow=\\\"2\\\">\\n      <md-toolbar color=\\\"accent\\\">\\n        <span class=\\\"separator\\\">\\n          <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"resetSelectedSubIDs()\\\">reset</button>\\n        </span>\\n        <span>\\n          <div>\\n            <label>Selected: </label> {{selectedSubIDsCounter}}\\n          </div>\\n        </span>\\n        <span>\\n            <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                  <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n            </div>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n          <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n          </md-pagination>\\n        </span>\\n      </md-toolbar>\\n\\n      <md-data-table layout-fill >\\n        <thead>\\n        <tr>\\n          <th class=\\\"md-text-cell\\\">Check</th>\\n          <th class=\\\"md-text-cell\\\">Edit</th>\\n          <th class=\\\"md-text-cell\\\">Found</th>\\n          <th class=\\\"md-text-cell\\\">Network</th>\\n          <th class=\\\"md-text-cell\\\">Name</th>\\n          <th class=\\\"md-text-cell\\\">Source Domain</th>\\n          <th class=\\\"md-text-cell\\\">Domain</th>\\n          <th class=\\\"md-text-cell\\\">Channel</th>\\n          <th class=\\\"md-text-cell\\\">Sub-channel</th>\\n          <th class=\\\"md-text-cell\\\">Signal</th>\\n          <th class=\\\"md-text-cell\\\">Day</th>\\n        </tr>\\n        </thead>\\n        <tbody>\\n        <tr *ngFor=\\\"let data of pagedData\\\">\\n          <td class=\\\"md-text-cell\\\">\\n              <input class=\\\"mdl-checkbox mdl-js-checkbox\\\" type=\\\"checkbox\\\" [(ngModel)]=\\\"data.isChecked\\\" (click)=\\\"markSubId(data)\\\">\\n          </td>\\n          <td class=\\\"md-text-cell\\\">\\n              <button #editUserButton mdl-button mdl-button-type=\\\"icon\\\" mdl-colored=\\\"primary\\\"\\n                      mdl-ripple (click)=\\\"editSubid(data)\\\">\\n                      <mdl-icon>settings</mdl-icon>\\n              </button>\\n          </td>\\n          <td class=\\\"md-text-cell\\\">{{ data.datetime_collected }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.network }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.name }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.originating_domain }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.domain }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.channel }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.sub_channel }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.audience }}</td>\\n          <td class=\\\"md-text-cell\\\">{{ data.day }}</td>\\n        </tr>\\n        </tbody>\\n      </md-data-table>\\n\\n      <md-toolbar color=\\\"accent\\\">\\n          <span flex hide show-gt-md></span>\\n          <span hide show-gt-md>\\n              <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n              </md-pagination>\\n          </span>\\n      </md-toolbar>\\n\\n      <div>\\n\\n        <mdl-dialog #editUserDialog [mdl-dialog-config]=\\\"{  styles:{'width': '550px'},\\n                                                            isModal:true,\\n                                                            openFrom: editUserButton,\\n                                                            enterTransitionDuration: 400,\\n                                                            leaveTransitionDuration: 400}\\\"\\n                                                            (show)=\\\"showEditSubIdDialog\\\"\\n                                                            (hide)=\\\"onDialogHide()\\\">\\n            <h3 class=\\\"mdl-dialog__title align-content\\\">Edit SubID</h3>\\n            <div class=\\\"mdl-dialog__content\\\">\\n              <subid-editor [subid]=\\\"subid\\\" ></subid-editor>\\n            </div>\\n            <div class=\\\"mdl-dialog__actions\\\">\\n              <button mdl-button (click)=\\\"saveSubid()\\\" mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple>Save</button>\\n              <button mdl-button (click)=\\\"closeEditSubIdModal()\\\" mdl-ripple>Close</button>\\n            </div>\\n          </mdl-dialog>\\n        </div>\\n\\n  </div>\\n\\n\\n</div>\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/sub-ids/dashboard.component.html\n ** module id = 814\n ** module chunks = 2\n **/","module.exports = \"<div class=\\\"mdl-grid\\\">\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n        <h3>Tonic today: user</h3>\\n    </div>\\n    <div class=\\\"col-lg-3 col-sm-6\\\">\\n          <mdl-select [(ngModel)]=\\\"rangeId\\\" (change)=\\\"onChange(rangeId)\\\" >\\n            <mdl-option *ngFor=\\\"let range of ranges\\\" [value]=\\\"range.id\\\">{{range.name}}</mdl-option>\\n          </mdl-select>\\n    </div>\\n</div>\\n\\n<div mdl-shadow=\\\"2\\\">\\n    <md-toolbar color=\\\"accent\\\">\\n      <span>Data</span>\\n      <span>\\n          <div *ngIf=\\\"searching\\\" class=\\\"col-lg-2 col-sm-4 mdl-extra-padding\\\">\\n                <mdl-spinner [active]=\\\"searching\\\"></mdl-spinner>\\n          </div>\\n      </span>\\n      <span flex hide show-gt-md></span>\\n      <span hide show-gt-md>\\n        <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">          \\n        </md-pagination>\\n      </span>\\n    </md-toolbar>\\n\\n    <md-data-table layout-fill >\\n      <thead>\\n      <tr>\\n        <th class=\\\"md-text-cell\\\">Subid</th>\\n        <th>Revenue</th>\\n        <th>Clicks</th>\\n        <th>RPC</th>\\n      </tr>\\n      </thead>\\n      <tbody>\\n      <tr *ngFor=\\\"let data of pagedData\\\">\\n        <td class=\\\"md-text-cell\\\">{{ data.subid }}</td>\\n        <td>${{ data.revenue }}</td>\\n        <td>{{ data.clicks }}</td>\\n        <td>{{ data.rpc }}</td>\\n      </tr>\\n      </tbody>\\n    </md-data-table>\\n\\n    <md-toolbar color=\\\"accent\\\">\\n        <span>\\n            <button mdl-button mdl-button-type=\\\"raised\\\" mdl-colored=\\\"primary\\\" mdl-ripple (click)=\\\"downloadData()\\\">Download</button>\\n        </span>\\n        <span flex hide show-gt-md></span>\\n        <span hide show-gt-md>\\n            <md-pagination [model]=\\\"pagination\\\" name=\\\"basic\\\" (on-pagination-change)=\\\"detectChange($event)\\\" [items-per-page-options]=\\\"availableLength\\\">\\n            </md-pagination>\\n        </span>\\n    </md-toolbar>\\n\\n</div>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/tonic-today/dashboard.component.html\n ** module id = 815\n ** module chunks = 2\n **/","module.exports = \"<mdl-layout mdl-layout-fixed-header >\\n  <mdl-layout-header>\\n    <mdl-layout-header-row class=\\\"mdl-color--primary mdl-color-text--accent main-header\\\">\\n      <div  class=\\\"mdl-layout__drawer-button\\\" (click)=\\\"mainLayout.toggleDrawer()\\\">\\n        <mdl-icon>&#xE5D2;</mdl-icon>\\n      </div>\\n      <mdl-layout-title class=\\\"docs-layout-title\\\">\\n        {{title}}\\n      </mdl-layout-title>\\n      <mdl-layout-spacer></mdl-layout-spacer>\\n      <div class=\\\"mdl-cell--hide-phone\\\">\\n          <nav class=\\\"mdl-navigation\\\">\\n            <a class=\\\"list_element\\\" [routerLink]=\\\"['/rev-split-values']\\\" ><mdl-icon>settings_ethernet</mdl-icon></a>\\n            <a class=\\\"list_element\\\" [routerLink]=\\\"['/sub-ids']\\\" ><mdl-icon>settings</mdl-icon></a>\\n            <a class=\\\"list_element\\\" [routerLink]=\\\"['/login']\\\" ><mdl-icon>power_settings_new</mdl-icon></a>\\n          </nav>\\n      </div>\\n    </mdl-layout-header-row>\\n  </mdl-layout-header>\\n  <mdl-layout-content>\\n    <mdl-layout mdl-layout-no-drawer-button #mainLayout=\\\"mdlLayout\\\">\\n      <mdl-layout-drawer>\\n        <nav class=\\\"mdl-navigation\\\" *ngIf=\\\"isauth\\\">\\n            <mdl-list>\\n              <mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/dashboard\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>dashboard</mdl-icon>\\n                  Main Dashboard    \\n                </mdl-list-item-primary-content>\\n              </mdl-list-item>\\n              <mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/bydayrevenue\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>trending_up</mdl-icon>\\n                  Revenue (by day)\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item>\\n              <!-- mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/bydayspend\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>credit_card</mdl-icon>\\n                  Spend (by day)\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item -->\\n              <!-- mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/bydaybalance\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>account_balance</mdl-icon>\\n                  Balance (by day)\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item -->\\n              <!-- mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/bysubid\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>today</mdl-icon>\\n                  Revenue (by subid)\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item -->\\n              <!-- mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/bynetwork\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>list</mdl-icon>\\n                  Data (by net)\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item -->\\n              <mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/revenue-analysis\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>monetization_on</mdl-icon>\\n                  Revenue Analysis\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item>\\n              <mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/spend-analysis\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>account_balance</mdl-icon>\\n                  Expense Analysis\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item>\\n              <mdl-list-item>\\n                <mdl-list-item-primary-content (click)=\\\"componentSelected(mainLayout)\\\" class=\\\" routerLink\\\" routerLink=\\\"/billing-statements\\\" routerLinkActive=\\\"router-link-active\\\" [routerLinkActiveOptions]=\\\"{exact:true}\\\">\\n                  <mdl-icon mdl-list-item-icon>account_balance_wallet</mdl-icon>\\n                  Billing Statements\\n                </mdl-list-item-primary-content>\\n              </mdl-list-item>\\n            </mdl-list>          \\n        </nav>\\n      </mdl-layout-drawer>\\n        <mdl-layout-content class=\\\"app-main-content\\\">\\n          <div class=\\\"main-content\\\">\\n            <div class=\\\"router-outlet\\\">\\n              <router-outlet></router-outlet>\\n            </div>\\n            <footer class=\\\"mdl-mini-footer\\\">\\n              <div class=\\\"mdl-mini-footer__right-section\\\">\\n              </div>\\n            </footer>\\n          </div>\\n        </mdl-layout-content>\\n    </mdl-layout>\\n  </mdl-layout-content>\\n</mdl-layout>\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/shared/layout/layout.component.html\n ** module id = 816\n ** module chunks = 2\n **/","module.exports = \"/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n    position: fixed;\\n    z-index: 999;\\n    height: 2em;\\n    width: 2em;\\n    overflow: visible;\\n    margin: auto;\\n    top: 0;\\n    left: 0;\\n    bottom: 0;\\n    right: 0;\\n  }\\n  \\n  /* Transparent Overlay */\\n  .loading:before {\\n    content: '';\\n    display: block;\\n    position: fixed;\\n    top: 0;\\n    left: 0;\\n    width: 100%;\\n    height: 100%;\\n    background-color: rgba(0,0,0,0.3);\\n  }\\n  \\n  /* :not(:required) hides these rules from IE9 and below */\\n  .loading:not(:required) {\\n    /* hide \\\"loading...\\\" text */\\n    font: 0/0 a;\\n    color: transparent;\\n    text-shadow: none;\\n    background-color: transparent;\\n    border: 0;\\n  }\\n  \\n  .loading:not(:required):after {\\n    content: '';\\n    display: block;\\n    font-size: 10px;\\n    width: 1em;\\n    height: 1em;\\n    margin-top: -0.5em;\\n    -webkit-animation: spinner 1500ms infinite linear;\\n    -moz-animation: spinner 1500ms infinite linear;\\n    -ms-animation: spinner 1500ms infinite linear;\\n    -o-animation: spinner 1500ms infinite linear;\\n    animation: spinner 1500ms infinite linear;\\n    border-radius: 0.5em;\\n    -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n    box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  }\\n  \\n  /* Animation */\\n  \\n  @-webkit-keyframes spinner {\\n    0% {\\n      -webkit-transform: rotate(0deg);\\n      -moz-transform: rotate(0deg);\\n      -ms-transform: rotate(0deg);\\n      -o-transform: rotate(0deg);\\n      transform: rotate(0deg);\\n    }\\n    100% {\\n      -webkit-transform: rotate(360deg);\\n      -moz-transform: rotate(360deg);\\n      -ms-transform: rotate(360deg);\\n      -o-transform: rotate(360deg);\\n      transform: rotate(360deg);\\n    }\\n  }\\n  @-moz-keyframes spinner {\\n    0% {\\n      -webkit-transform: rotate(0deg);\\n      -moz-transform: rotate(0deg);\\n      -ms-transform: rotate(0deg);\\n      -o-transform: rotate(0deg);\\n      transform: rotate(0deg);\\n    }\\n    100% {\\n      -webkit-transform: rotate(360deg);\\n      -moz-transform: rotate(360deg);\\n      -ms-transform: rotate(360deg);\\n      -o-transform: rotate(360deg);\\n      transform: rotate(360deg);\\n    }\\n  }\\n  @-o-keyframes spinner {\\n    0% {\\n      -webkit-transform: rotate(0deg);\\n      -moz-transform: rotate(0deg);\\n      -ms-transform: rotate(0deg);\\n      -o-transform: rotate(0deg);\\n      transform: rotate(0deg);\\n    }\\n    100% {\\n      -webkit-transform: rotate(360deg);\\n      -moz-transform: rotate(360deg);\\n      -ms-transform: rotate(360deg);\\n      -o-transform: rotate(360deg);\\n      transform: rotate(360deg);\\n    }\\n  }\\n  @keyframes spinner {\\n    0% {\\n      -webkit-transform: rotate(0deg);\\n      -moz-transform: rotate(0deg);\\n      -ms-transform: rotate(0deg);\\n      -o-transform: rotate(0deg);\\n      transform: rotate(0deg);\\n    }\\n    100% {\\n      -webkit-transform: rotate(360deg);\\n      -moz-transform: rotate(360deg);\\n      -ms-transform: rotate(360deg);\\n      -o-transform: rotate(360deg);\\n      transform: rotate(360deg);\\n    }\\n  }\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/auth-callback/auth-callback.component.css\n ** module id = 1119\n ** module chunks = 2\n **/","module.exports = \".align-content {\\n    display: table-cell;\\n    text-align: center;\\n    vertical-align: middle;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/auth/login.component.css\n ** module id = 1120\n ** module chunks = 2\n **/","module.exports = \".center-content-date-filters {\\n    width: 50%;\\n    margin: 0 auto;\\n}\\n.center-checkbox {\\n    align-self: center;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.fulldetailreport {\\n    background-color: transparent;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n    font-size: 14px;\\n}\\n.revenue-table-cell-campaign {\\n    background-color: burlywood;\\n}\\n.detailHeaderBS {\\n    background-color: #ccffcc;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowBS {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6ffe6; \\n}\\n.detailHeaderCampaign {\\n    background-color: #80d4ff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowCampaign {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #cceeff; \\n}\\n.detailHeaderContent {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowContent {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.detailHeaderTerm {\\n    background-color: #d9b38c;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowTerm {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ecd9c6; \\n}\\n.detailHeaderExtra {\\n    background-color: #ccccff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowExtra {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6e6ff; \\n}\\n.detailHeaderExtra2 {\\n    background-color: #ffecb3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowExtra2 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #fff9e6; \\n}\\n.left-column {\\n    text-align: left;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\n.mdl-grid-revenue {\\n    padding: 1px;\\n}\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n\\n.oddDetailRow {\\n    background-color: #D6EAFD;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.evenDetailRow {\\n    background-color: #BEDDFA;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n\\n.firstBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-top: 3px solid rgb(63,81,181);\\n}\\n\\n.lastBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-bottom: 3px solid rgb(63,81,181);\\n}\\n\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.lowNegativeIndicator {\\n    color: #ff9999;\\n}\\n.mediumNegativeIndicator {\\n    color: #ff4d4d;\\n}\\n.highNegativeIndicator {\\n    color: #ff0000;\\n}\\n.lowPositiveIndicator {\\n    color: #85e085;\\n}\\n.mediumPositiveIndicator {\\n    color: #2eb82e;\\n}\\n.highPositiveIndicator {\\n    color: #1f7a1f;\\n}\\n.emptyIndicator {\\n    color: transparent;\\n}\\n\\n\\n/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n  position: fixed;\\n  z-index: 999;\\n  height: 2em;\\n  width: 2em;\\n  overflow: visible;\\n  margin: auto;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n/* Transparent Overlay */\\n.loading:before {\\n  content: '';\\n  display: block;\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  background-color: rgba(0,0,0,0.3);\\n}\\n\\n/* :not(:required) hides these rules from IE9 and below */\\n.loading:not(:required) {\\n  /* hide \\\"loading...\\\" text */\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.loading:not(:required):after {\\n  content: '';\\n  display: block;\\n  font-size: 10px;\\n  width: 1em;\\n  height: 1em;\\n  margin-top: -0.5em;\\n  -webkit-animation: spinner 1500ms infinite linear;\\n  -moz-animation: spinner 1500ms infinite linear;\\n  -ms-animation: spinner 1500ms infinite linear;\\n  -o-animation: spinner 1500ms infinite linear;\\n  animation: spinner 1500ms infinite linear;\\n  border-radius: 0.5em;\\n  -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n}\\n\\n/* Animation */\\n\\n@-webkit-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-o-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n.align-content {\\n    justify-content: center;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/aim-sales/dashboard.component.css\n ** module id = 1121\n ** module chunks = 2\n **/","module.exports = \"/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n}\\n\\nmd2-datepicker /deep/ .md2-datepicker-wrapper {\\n    top: -50px !important;\\n    left: -100px !important;\\n}\\n\\n.align-content {\\n    justify-content: center;\\n}\\n\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.left-separator {\\n    margin-left: 15px;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/billing-statements/dashboard.component.css\n ** module id = 1122\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/cb-tracker/dashboard.component.css\n ** module id = 1123\n ** module chunks = 2\n **/","module.exports = \"/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n}\\n\\nmd2-datepicker /deep/ .md2-datepicker-wrapper {\\n    top: -50px !important;\\n    left: -100px !important;\\n}\\n\\n.align-content {\\n    justify-content: center;\\n}\\n\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.left-separator {\\n    margin-left: 15px;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/credit-cards/dashboard.component.css\n ** module id = 1124\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/data-by-network/dashboard.component.css\n ** module id = 1125\n ** module chunks = 2\n **/","module.exports = \".center-content-date-filters {\\n    width: 50%;\\n    margin: 0 auto;\\n}\\n.center-checkbox {\\n    align-self: center;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.fulldetailreport {\\n    background-color: transparent;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n    font-size: 14px;\\n}\\n.revenue-table-cell-campaign {\\n    background-color: burlywood;\\n}\\n.detailHeaderBS {\\n    background-color: #ccffcc;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowBS {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6ffe6; \\n}\\n.detailHeaderCampaign {\\n    background-color: #80d4ff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowCampaign {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #cceeff; \\n}\\n.detailHeaderContent {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowContent {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.detailHeaderTerm {\\n    background-color: #d9b38c;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowTerm {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ecd9c6; \\n}\\n.left-column {\\n    text-align: left;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\n.mdl-grid-revenue {\\n    padding: 1px;\\n}\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n\\n.oddDetailRow {\\n    background-color: #D6EAFD;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.evenDetailRow {\\n    background-color: #BEDDFA;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n\\n.firstBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-top: 3px solid rgb(63,81,181);\\n}\\n\\n.lastBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-bottom: 3px solid rgb(63,81,181);\\n}\\n\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.lowNegativeIndicator {\\n    color: #ff9999;\\n}\\n.mediumNegativeIndicator {\\n    color: #ff4d4d;\\n}\\n.highNegativeIndicator {\\n    color: #ff0000;\\n}\\n.lowPositiveIndicator {\\n    color: #85e085;\\n}\\n.mediumPositiveIndicator {\\n    color: #2eb82e;\\n}\\n.highPositiveIndicator {\\n    color: #1f7a1f;\\n}\\n.emptyIndicator {\\n    color: transparent;\\n}\\n\\n\\n/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n  position: fixed;\\n  z-index: 999;\\n  height: 2em;\\n  width: 2em;\\n  overflow: visible;\\n  margin: auto;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n/* Transparent Overlay */\\n.loading:before {\\n  content: '';\\n  display: block;\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  background-color: rgba(0,0,0,0.3);\\n}\\n\\n/* :not(:required) hides these rules from IE9 and below */\\n.loading:not(:required) {\\n  /* hide \\\"loading...\\\" text */\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.loading:not(:required):after {\\n  content: '';\\n  display: block;\\n  font-size: 10px;\\n  width: 1em;\\n  height: 1em;\\n  margin-top: -0.5em;\\n  -webkit-animation: spinner 1500ms infinite linear;\\n  -moz-animation: spinner 1500ms infinite linear;\\n  -ms-animation: spinner 1500ms infinite linear;\\n  -o-animation: spinner 1500ms infinite linear;\\n  animation: spinner 1500ms infinite linear;\\n  border-radius: 0.5em;\\n  -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n}\\n\\n/* Animation */\\n\\n@-webkit-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-o-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n.align-content {\\n    display: flex;\\n    align-items: center;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-billing-performance/dashboard.component.css\n ** module id = 1126\n ** module chunks = 2\n **/","module.exports = \".center-content-date-filters {\\n    width: 50%;\\n    margin: 0 auto;\\n}\\n.center-checkbox {\\n    align-self: center;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.fulldetailreport {\\n    background-color: transparent;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n    font-size: 14px;\\n}\\n.revenue-table-cell-campaign {\\n    background-color: burlywood;\\n}\\n.detailHeaderBS {\\n    background-color: #ccffcc;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowBS {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6ffe6; \\n}\\n.detailHeaderCampaign {\\n    background-color: #80d4ff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowCampaign {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #cceeff; \\n}\\n.detailHeaderContent {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowContent {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.detailHeaderTerm {\\n    background-color: #d9b38c;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowTerm {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ecd9c6; \\n}\\n.detailHeaderExtra {\\n    background-color: #ccccff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowExtra {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6e6ff; \\n}\\n.detailHeaderExtra2 {\\n    background-color: #ffecb3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowExtra2 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #fff9e6; \\n}\\n.left-column {\\n    text-align: left;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\n.mdl-grid-revenue {\\n    padding: 1px;\\n}\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n\\n.oddDetailRow {\\n    background-color: #D6EAFD;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.evenDetailRow {\\n    background-color: #BEDDFA;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n\\n.firstBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-top: 3px solid rgb(63,81,181);\\n}\\n\\n.lastBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-bottom: 3px solid rgb(63,81,181);\\n}\\n\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.lowNegativeIndicator {\\n    color: #ff9999;\\n}\\n.mediumNegativeIndicator {\\n    color: #ff4d4d;\\n}\\n.highNegativeIndicator {\\n    color: #ff0000;\\n}\\n.lowPositiveIndicator {\\n    color: #85e085;\\n}\\n.mediumPositiveIndicator {\\n    color: #2eb82e;\\n}\\n.highPositiveIndicator {\\n    color: #1f7a1f;\\n}\\n.emptyIndicator {\\n    color: transparent;\\n}\\n\\n\\n/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n  position: fixed;\\n  z-index: 999;\\n  height: 2em;\\n  width: 2em;\\n  overflow: visible;\\n  margin: auto;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n/* Transparent Overlay */\\n.loading:before {\\n  content: '';\\n  display: block;\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  background-color: rgba(0,0,0,0.3);\\n}\\n\\n/* :not(:required) hides these rules from IE9 and below */\\n.loading:not(:required) {\\n  /* hide \\\"loading...\\\" text */\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.loading:not(:required):after {\\n  content: '';\\n  display: block;\\n  font-size: 10px;\\n  width: 1em;\\n  height: 1em;\\n  margin-top: -0.5em;\\n  -webkit-animation: spinner 1500ms infinite linear;\\n  -moz-animation: spinner 1500ms infinite linear;\\n  -ms-animation: spinner 1500ms infinite linear;\\n  -o-animation: spinner 1500ms infinite linear;\\n  animation: spinner 1500ms infinite linear;\\n  border-radius: 0.5em;\\n  -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n}\\n\\n/* Animation */\\n\\n@-webkit-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-o-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n.align-content {\\n    display: flex;\\n    align-items: center;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-traffic-conversions/dashboard.component.css\n ** module id = 1127\n ** module chunks = 2\n **/","module.exports = \".center-content-date-filters {\\n    width: 50%;\\n    margin: 0 auto;\\n}\\n.center-checkbox {\\n    align-self: center;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.fulldetailreport {\\n    background-color: transparent;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n    font-size: 14px;\\n}\\n.revenue-table-cell-campaign {\\n    background-color: burlywood;\\n}\\n.secondLevelDivHeader {\\n    border: 4px solid green;\\n}\\n.secondLevelDivDetail {\\n    border-right: 4px solid green;\\n    border-left: 4px solid green;\\n    border-bottom: 4px solid green;\\n}\\n.thirdLevelDivHeader {\\n    border: 3px solid #025697;\\n}\\n.thirdLevelDivDetail {\\n    border-right: 3px solid #025697;\\n    border-left: 3px solid #025697;\\n}\\n.detailHeaderL2 {\\n    background-color: #27dffb;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL2 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #9bf0fd; \\n}\\n.detailHeaderL3 {\\n    background-color: #62bbfd;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL3 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #b4defe; \\n}\\n.detailHeaderL4 {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL4 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.detailHeaderL5 {\\n    background-color: #d9b38c;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL5 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ecd9c6; \\n}\\n.left-column {\\n    text-align: left;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\n.mdl-grid-revenue {\\n    padding: 1px;\\n}\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n\\n.oddDetailRow {\\n    background-color: #D6EAFD;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.evenDetailRow {\\n    background-color: #BEDDFA;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF;\\n}\\n\\ntr:hover td.detailRowL2 {\\n    background-color: #e6fbfe;\\n}\\n\\n.firstBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-top: 3px solid rgb(63,81,181);\\n}\\n\\n.lastBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-bottom: 3px solid rgb(63,81,181);\\n}\\n\\n.drillDownEnable {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.lowNegativeIndicator {\\n    color: #ff9999;\\n}\\n.mediumNegativeIndicator {\\n    color: #ff4d4d;\\n}\\n.highNegativeIndicator {\\n    color: #ff0000;\\n}\\n.lowPositiveIndicator {\\n    color: #85e085;\\n}\\n.mediumPositiveIndicator {\\n    color: #2eb82e;\\n}\\n.highPositiveIndicator {\\n    color: #1f7a1f;\\n}\\n.emptyIndicator {\\n    color: transparent;\\n}\\n\\n\\n/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n  position: fixed;\\n  z-index: 999;\\n  height: 2em;\\n  width: 2em;\\n  overflow: visible;\\n  margin: auto;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n/* Transparent Overlay */\\n.loading:before {\\n  content: '';\\n  display: block;\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  background-color: rgba(0,0,0,0.3);\\n}\\n\\n/* :not(:required) hides these rules from IE9 and below */\\n.loading:not(:required) {\\n  /* hide \\\"loading...\\\" text */\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.loading:not(:required):after {\\n  content: '';\\n  display: block;\\n  font-size: 10px;\\n  width: 1em;\\n  height: 1em;\\n  margin-top: -0.5em;\\n  -webkit-animation: spinner 1500ms infinite linear;\\n  -moz-animation: spinner 1500ms infinite linear;\\n  -ms-animation: spinner 1500ms infinite linear;\\n  -o-animation: spinner 1500ms infinite linear;\\n  animation: spinner 1500ms infinite linear;\\n  border-radius: 0.5em;\\n  -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n}\\n\\n/* Animation */\\n\\n@-webkit-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-o-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-visitor-id-pivoted/dashboard.component.css\n ** module id = 1128\n ** module chunks = 2\n **/","module.exports = \".center-content-date-filters {\\n    width: 50%;\\n    margin: 0 auto;\\n}\\n.center-checkbox {\\n    align-self: center;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.fulldetailreport {\\n    background-color: transparent;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.revenue-table-cell-header {\\n    background-color: lightgray;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n    font-size: 14px;\\n}\\n.revenue-table-cell-campaign {\\n    background-color: burlywood;\\n}\\n.secondLevelDivHeader {\\n    border: 4px solid green;\\n}\\n.secondLevelDivDetail {\\n    border-right: 4px solid green;\\n    border-left: 4px solid green;\\n    border-bottom: 4px solid green;\\n}\\n.thirdLevelDivHeader {\\n    border: 3px solid #025697;\\n}\\n.thirdLevelDivDetail {\\n    border-right: 3px solid #025697;\\n    border-left: 3px solid #025697;\\n}\\n.detailHeaderL2 {\\n    background-color: #27dffb;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL2 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #9bf0fd; \\n}\\n.detailHeaderL3 {\\n    background-color: #62bbfd;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL3 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #b4defe; \\n}\\n.detailHeaderL4 {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL4 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.detailHeaderL5 {\\n    background-color: #d9b38c;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowL5 {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ecd9c6; \\n}\\n.left-column {\\n    text-align: left;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n/* Just common table stuff */\\ntable  { \\n    border-collapse: collapse;\\n    width: 100%;\\n    table-layout: fixed;\\n}\\nth, td {\\n    padding: 8px 16px;\\n}\\nth {\\n    background:#eee;\\n    width: auto;\\n}\\n.mdl-grid-revenue {\\n    padding: 1px;\\n}\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n\\n.oddDetailRow {\\n    background-color: #D6EAFD;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.evenDetailRow {\\n    background-color: #BEDDFA;\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF;\\n}\\n\\ntr:hover td.detailRowL2 {\\n    background-color: #e6fbfe;\\n}\\n\\n.firstBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-top: 3px solid rgb(63,81,181);\\n}\\n\\n.lastBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n    border-bottom: 3px solid rgb(63,81,181);\\n}\\n\\n.drillDownEnable {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n.lowNegativeIndicator {\\n    color: #ff9999;\\n}\\n.mediumNegativeIndicator {\\n    color: #ff4d4d;\\n}\\n.highNegativeIndicator {\\n    color: #ff0000;\\n}\\n.lowPositiveIndicator {\\n    color: #85e085;\\n}\\n.mediumPositiveIndicator {\\n    color: #2eb82e;\\n}\\n.highPositiveIndicator {\\n    color: #1f7a1f;\\n}\\n.emptyIndicator {\\n    color: transparent;\\n}\\n\\n\\n/*Spinner*/\\n/* Absolute Center Spinner */\\n.loading {\\n  position: fixed;\\n  z-index: 999;\\n  height: 2em;\\n  width: 2em;\\n  overflow: visible;\\n  margin: auto;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n/* Transparent Overlay */\\n.loading:before {\\n  content: '';\\n  display: block;\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  background-color: rgba(0,0,0,0.3);\\n}\\n\\n/* :not(:required) hides these rules from IE9 and below */\\n.loading:not(:required) {\\n  /* hide \\\"loading...\\\" text */\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.loading:not(:required):after {\\n  content: '';\\n  display: block;\\n  font-size: 10px;\\n  width: 1em;\\n  height: 1em;\\n  margin-top: -0.5em;\\n  -webkit-animation: spinner 1500ms infinite linear;\\n  -moz-animation: spinner 1500ms infinite linear;\\n  -ms-animation: spinner 1500ms infinite linear;\\n  -o-animation: spinner 1500ms infinite linear;\\n  animation: spinner 1500ms infinite linear;\\n  border-radius: 0.5em;\\n  -webkit-box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n  box-shadow: rgba(0, 0, 0, 0.75) 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, rgba(0, 0, 0, 0.75) -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) -1.5em 0 0 0, rgba(0, 0, 0, 0.75) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\\n}\\n\\n/* Animation */\\n\\n@-webkit-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@-o-keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spinner {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    -moz-transform: rotate(0deg);\\n    -ms-transform: rotate(0deg);\\n    -o-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    -moz-transform: rotate(360deg);\\n    -ms-transform: rotate(360deg);\\n    -o-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/edw-visitor-id-report/dashboard.component.css\n ** module id = 1129\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/gateway-data/dashboard.component.css\n ** module id = 1130\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/gateway-status/dashboard.component.css\n ** module id = 1131\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/iso-data/dashboard.component.css\n ** module id = 1132\n ** module chunks = 2\n **/","module.exports = \".chart {\\n    width: 100%;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/main/dashboard.component.css\n ** module id = 1133\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n}\\n\\nmd2-datepicker /deep/ .md2-datepicker-wrapper {\\n    top: -50px !important;\\n    left: -100px !important;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/pandl/dashboard.component.css\n ** module id = 1134\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.filtersContainer {\\n    justify-content: center;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/rev-split-values/dashboard.component.css\n ** module id = 1135\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n}\\n\\nmd2-datepicker /deep/ .md2-datepicker-wrapper {\\n    top: -50px !important;\\n    left: -100px !important;\\n}\\n.tableFixHead    { \\n    overflow-y: auto; \\n    height: 100px; \\n    width: 100%;\\n}\\n.tableFixHead th { \\n    position: sticky;\\n    font-size: 12px;\\n    top: 0; \\n}\\n.revenue-table-cell-header {\\n    background-color: #FFFAFA;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    z-index: 9;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-analysis/dashboard.component.css\n ** module id = 1136\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #88aaff;\\n}\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-by-subid/dashboard.component.css\n ** module id = 1137\n ** module chunks = 2\n **/","module.exports = \".colummdetail {\\n    cursor: pointer;\\n}\\n.colummdetail:hover {\\n    background-color: #aabbff;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/revenue-daily/dashboard.component.css\n ** module id = 1138\n ** module chunks = 2\n **/","module.exports = \".fulldetailreport {\\n    background-color: #ccddff;\\n}\\n.colummdetail {\\n    cursor: pointer;\\n}\\n\\n.rowdetail {\\n    height: 30px;\\n}\\n.mdl-grid-revenue{\\n    padding: 2px;\\n}\\n\\n.versiondetail {\\n    cursor: pointer;\\n}\\n.versiondetail:hover {\\n    background-color: #88aabb;\\n}\\n.revenue-table-cell {\\n    padding: 0 10px 0 10px;\\n}\\n\\nmd2-datepicker /deep/ .md2-datepicker-wrapper {\\n    top: -50px !important;\\n    left: -100px !important;\\n}\\n\\nmd-data-table tbody tr:hover, md-data-table .md-data-tbody tr:hover, .md-data-table tbody tr:hover, .md-data-table .md-data-tbody tr:hover {\\n    background-color: #E9F4FF; \\n}\\n\\n.normalBorderRow {\\n    border-left: 3px solid rgb(63,81,181);\\n    border-right: 3px solid rgb(63,81,181);\\n}\\n\\n.oddBasicRow {\\n    background-color: #ffffff;\\n}\\n.evenBasicRow {\\n    background-color: #f1f1f1;\\n}\\n.detailHeaderBS {\\n    background-color: #ccffcc;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowBS {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #e6ffe6; \\n}\\n.detailHeaderCampaign {\\n    background-color: #80d4ff;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowCampaign {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #cceeff; \\n}\\n.detailHeaderContent {\\n    background-color: #ffb3b3;\\n    color: black;\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n}\\n.detailRowContent {\\n    padding: 0 10px 0 10px;\\n    font-size: 11px;\\n    background-color: #ffe6e6; \\n}\\n.left-column {\\n    text-align: left;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/spend-analysis/dashboard.component.css\n ** module id = 1139\n ** module chunks = 2\n **/","module.exports = \".separator {\\n    margin-right: 15px;\\n}\\n.pending-sub-ids {\\n    color: red;\\n}\\n.align-content {\\n    text-align: center;\\n}\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/pages/dashboards/sub-ids/dashboard.component.css\n ** module id = 1140\n ** module chunks = 2\n **/","module.exports = \".router-outlet {\\n    flex-grow: 1;\\n    flex-shrink: 0;\\n    margin-left: 1rem;\\n    margin-right: 1rem;\\n}\\n\\nmain {\\n    display: flex !important;\\n    flex-direction: row;\\n}\\n\\n.main-footer {\\n    flex-grow: 1;\\n}\\n\\nfooter {\\n    flex-shrink: 0;\\n}\\n\\n.app-main-content {\\n    display: flex;\\n    flex-direction: column;\\n}\\n\\n.main-content {\\n    display: flex;\\n    flex-direction: column;\\n    align-items: stretch;\\n    flex-grow: 1;\\n}\\n\\n.icon svg {\\n    display: inline-block;\\n    width: 16px;\\n    height: 16px;\\n    vertical-align: middle;\\n}\\n\\n.list_element {\\n    padding: 8px 16px;\\n}\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/app/shared/layout/layout.component.css\n ** module id = 1141\n ** module chunks = 2\n **/"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AA3LA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACNA;AACA;AAEA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AArGA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACRA;AACA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAhCA;AADA;AAKA;AAJA;AAAA;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClgcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjFA;AACA;AACA;AAGA;AAMA;AAAA;AAJA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;AASA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;;;;;;;;;AASA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAzHA;AADA;AAOA;AANA;AAAA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACJA;AACA;AAIA;AAGA;AAAA;AAFA;AAEA;AAEA;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAzCA;AADA;AAIA;AAHA;AAAA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACpHA;AACA;AACA;AAGA;AAEA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAtBA;AADA;AAGA;AAFA;AAAA;;;;;;;;;;;;;;;;;;ACLA;AAEA;AAEA;AAEA;AACA;AAOA;AA6EA;AAAA;AA3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAQA;AAAA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAhDA;AAAA;AAAA;AAAA;AAEA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AA3EA;AALA;AACA;AACA;AACA;AA+EA;AA7EA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAEA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAnCA;AADA;AAKA;AAJA;AAAA;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACzHA;AAEA;AACA;AAOA;AAEA;AAAA;AAAA;AAAA;AAEA;AACA;;;;;;;;;;AAUA;AACA;AAEA;AAAA;AAlBA;AALA;AACA;AACA;AACA;AACA;AAGA;AAFA;AAAA;;;;;;;;;;;;;;;;;;ACVA;AACA;AACA;AAEA;AACA;AACA;AASA;AAQA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AARA;AACA;AAGA;AACA;AAIA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AA7CA;AANA;AACA;AACA;AACA;AACA;AAUA;AACA;AATA;AAAA;;;;;;;;;;;;;;;;;;ACfA;AAEA;AAEA;AAEA;AACA;AAOA;AA6EA;AAAA;AA3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAQA;AAAA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAlDA;AAAA;AAAA;AAAA;AAEA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AA3EA;AALA;AACA;AACA;AACA;AA+EA;AA7EA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AAEA;AAEA;AAEA;AACA;AAOA;AA6BA;AAAA;AAtBA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAzDA;AAAA;AAAA;AAAA;AAEA;AAAA;;AAAA;AACA;AAAA;;AAAA;AALA;AALA;AACA;AACA;AACA;AA+BA;AA7BA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AAEA;AAEA;AAEA;AACA;AAOA;AA6EA;AAAA;AA3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAQA;AAAA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAhDA;AAAA;AAAA;AAAA;AAEA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AA3EA;AALA;AACA;AACA;AACA;AA+EA;AA7EA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAGA;AACA;AAQA;AAWA;AAAA;AACA;AATA;AACA;AAGA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AA7CA;AAAA;AAAA;AAAA;AADA;AANA;AACA;AACA;AACA;AACA;AAaA;AACA;AAZA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AAEA;AACA;AACA;AASA;AAyBA;AAAA;AAAA;AAAA;AAtBA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AAkIA;AACA;AACA;AACA;AACA;AAlIA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAvOA;AAPA;AACA;AACA;AACA;AACA;AACA;AA2BA;AAzBA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AACA;AAGA;AACA;AAQA;AAWA;AAAA;AACA;AATA;AACA;AAGA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAhDA;AAAA;AAAA;AAAA;AADA;AANA;AACA;AACA;AACA;AACA;AAaA;AACA;AAZA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AACA;AAEA;AACA;AACA;AACA;AASA;AAwEA;AAAA;AACA;AACA;AACA;AACA;AAvEA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAiWA;AACA;AA3VA;AAhEA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AA4DA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA3jBA;AAPA;AACA;AACA;AACA;AACA;AACA;AA0EA;AACA;AACA;AACA;AACA;AA5EA;AAAA;;;;;;;;;;;;;;;;;;ACfA;AACA;AAGA;AACA;AACA;AAQA;AAWA;AAAA;AACA;AATA;AACA;AAGA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA7EA;AAAA;AAAA;AAAA;AADA;AANA;AACA;AACA;AACA;AACA;AAaA;AACA;AAZA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AAUA;AAgCA;AAAA;AACA;AACA;AACA;AA/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAMA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAzTA;AAPA;AACA;AACA;AACA;AACA;AACA;AAkCA;AACA;AACA;AACA;AAnCA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAEA;AACA;AACA;AACA;AACA;AASA;AAwEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAxEA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAgUA;AACA;AAzTA;AAjEA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AA6DA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA1hBA;AAPA;AACA;AACA;AACA;AACA;AACA;AA0EA;AACA;AACA;AACA;AACA;AACA;AA7EA;AAAA;;;;;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AASA;AAsBA;AAAA;AACA;AApBA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AArHA;AAPA;AACA;AACA;AACA;AACA;AACA;AAwBA;AACA;AAvBA;AAAA;;;;;;;;;;;;;;;;;;ACZA;AAEA;AACA;AACA;AASA;AAqFA;AAAA;AAAA;AAAA;AA/EA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AA+LA;AACA;AACA;AACA;AACA;AA/LA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAQA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;;;;;;;AAkBA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA5fA;AAPA;AACA;AACA;AACA;AACA;AACA;AAuFA;AArFA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AAEA;AACA;AACA;AASA;AA4FA;AAAA;AAAA;AAAA;AArFA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AA0fA;AACA;AACA;AACA;AACA;AA1fA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;;AAKA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAn4BA;AAPA;AACA;AACA;AACA;AACA;AACA;AA8FA;AA5FA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AAEA;AACA;AACA;AASA;AAiBA;AAAA;AAAA;AAAA;AAfA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAgEA;AACA;AACA;AACA;AACA;AAhEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAvGA;AAPA;AACA;AACA;AACA;AACA;AACA;AAmBA;AAjBA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AAEA;AACA;AACA;AASA;AA0BA;AAAA;AAAA;AAAA;AApBA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAiIA;AACA;AACA;AACA;AACA;AAjIA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AApLA;AAPA;AACA;AACA;AACA;AACA;AACA;AA4BA;AA1BA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AASA;AAoCA;AAAA;AACA;AACA;AACA;AApCA;AACA;AACA;AACA;AAEA;AACA;AACA;AAUA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAMA;AACA;AA7BA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AAyBA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAxKA;AAPA;AACA;AACA;AACA;AACA;AACA;AAsCA;AACA;AACA;AACA;AAvCA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AAUA;AA4CA;AAAA;AACA;AACA;AACA;AA3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAWA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAMA;AACA;AA9BA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AA0BA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AAEA;AAAA;AApTA;AAPA;AACA;AACA;AACA;AACA;AACA;AA8CA;AACA;AACA;AACA;AA/CA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AASA;AAsCA;AAAA;AACA;AACA;AACA;AAtCA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAWA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAMA;AACA;AA9BA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AA0BA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA/MA;AAPA;AACA;AACA;AACA;AACA;AACA;AAwCA;AACA;AACA;AACA;AAzCA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAGA;AACA;AASA;AAoBA;AAAA;AACA;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAGA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAhGA;AADA;;AAOA;AAEA;AAAA;AAAA;AAAA;AAVA;AAPA;AACA;AACA;AACA;AACA;AACA;AAsBA;AACA;AArBA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AAIA;AAQA;AAeA;AAAA;AACA;AACA;AAZA;AAEA;AAEA;AACA;AAEA;AACA;AAKA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AAEA;AAAA;AA5FA;AANA;AACA;AACA;AACA;AACA;AAiBA;AACA;AACA;AAjBA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AAUA;AA4CA;AAAA;AACA;AACA;AACA;AAtCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAMA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AApUA;AAPA;AACA;AACA;AACA;AACA;AACA;AA8CA;AACA;AACA;AACA;AA/CA;AAAA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAEA;AACA;AACA;AAGA;AACA;AASA;AAoBA;AAAA;AACA;AACA;AACA;AACA;AAtBA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AAiGA;AACA;AACA;AACA;AACA;AA9FA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAzJA;AAAA;AAAA;AAAA;AAdA;AAPA;AACA;AACA;AACA;AACA;AACA;AAsBA;AACA;AACA;AACA;AACA;AAxBA;AAAA;;;;;;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AAWA;AA0FA;AAAA;AACA;AACA;AACA;AAxFA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAUA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAuqBA;AACA;AAlqBA;AACA;AA5EA;AAAA;AACA;AACA;AAEA;AACA;AACA;;;AAJA;AAAA;AAIA;AAwEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAn/BA;AAPA;AACA;AACA;AACA;AACA;AACA;AA4FA;AACA;AACA;AACA;AA7FA;AAAA;;;;;;;;;;;;;;;;;;ACfA;AACA;AACA;AASA;AAqBA;AAAA;AACA;AAnBA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAAA;AAlHA;AAPA;AACA;AACA;AACA;AACA;AACA;AAuBA;AACA;AAtBA;AAAA;;;;;;;;;;;;;;;;;;ACXA;AACA;AACA;AACA;AAUA;AA+CA;AAAA;AACA;AACA;AA5CA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAKA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAzTA;AAPA;AACA;AACA;AACA;AACA;AACA;AAiDA;AACA;AACA;AAjDA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AAUA;AAwCA;AAAA;AACA;AACA;AArCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAKA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAtXA;AAPA;AACA;AACA;AACA;AACA;AACA;AA0CA;AACA;AACA;AA1CA;AAAA;;;;;;;;;;;;;;;;;;ACbA;AACA;AACA;AAGA;AACA;AACA;AASA;AAyBA;AAAA;AACA;AACA;AACA;AAtBA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAtQA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAHA;AAPA;AACA;AACA;AACA;AACA;AACA;AA2BA;AACA;AACA;AACA;AA5BA;AAAA;;;;;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AAQA;AAqBA;AAAA;AACA;AAnBA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA/GA;AANA;AACA;AACA;AACA;AACA;AAuBA;AACA;AAtBA;AAAA;;;;;;;;;;;;;;;;;;ACXA;AACA;AAEA;AAGA;AAIA;AAAA;AAAA;AAHA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAhCA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AAGA;AAGA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAAA;AAjCA;AADA;AAIA;AAHA;AAAA;;;;;;;;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAjCA;AADA;AAKA;AAJA;AAAA;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAuBA;AAAA;AAEA;AAAA;AAAA;AAFA;AArBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AAAA;;;;;;;;;;;;;;;;;;ACzFA;AAOA;AAEA;AAKA;AAHA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AATA;AAAA;;AAAA;AAPA;AALA;AACA;AACA;AACA;AACA;;AACA;AAAA;;;;;;;;;;;;;;;;;;ACPA;AAOA;AAWA;AATA;AACA;AACA;AAOA;AAJA;AAAA;AACA;AACA;;;AAAA;AAAA;AAIA;AACA;AACA;AAEA;AACA;AAGA;AAAA;AAdA;AADA;;;AAGA;AATA;AALA;AACA;AACA;AACA;AACA;;AACA;AAAA;;;;;;;;;;;;;;;;;;ACPA;AACA;AAOA;AAcA;AAAA;AAZA;AACA;AACA;AACA;AACA;AACA;AAOA;AAJA;AAAA;AACA;AACA;;;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAzGA;AADA;;;AAGA;AAZA;AALA;AACA;AACA;AACA;AACA;AAeA;AAdA;AAAA;;;;;;;;;;;;;;;;;;ACRA;AACA;AAGA;AACA;AAQA;AAWA;AAAA;AACA;AATA;AACA;AAGA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAzDA;AAAA;AAAA;AAAA;AADA;AANA;AACA;AACA;AACA;AACA;AAaA;AACA;AAZA;AAAA;;;;;;;;;;;;;;;;;;;;;;;ACbA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAjDA;AADA;AAEA;AADA;AAAA;AAmDA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACrEA;AAGA;AAQA;AAIA;AAAA;AAFA;AAGA;AACA;AAGA;AAAA;AACA;AACA;;;AAAA;AAAA;AAGA;AACA;AACA;AAEA;AAAA;AATA;AADA;;;AAGA;AAXA;AANA;AACA;AACA;AACA;AACA;AAMA;AAJA;AAAA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC9DA;AACA;AAEA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AA1CA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACRA;AACA;AACA;AAGA;AAGA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAvBA;AADA;AAIA;AAHA;AAAA;;;;;;;;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAxBA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACRA;AACA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AA/CA;AADA;AAKA;AAJA;AAAA;;;;;;;;;;;;;;;;;;ACNA;AACA;AAEA;AAGA;AAIA;AAAA;AAFA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAxBA;AADA;AAKA;AAJA;AAAA;;;;;;;;;ACNA;AACA;AAEA;AACA;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxgRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjQA;AACA;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5FA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;","sourceRoot":""}