blob: e302ff4c987f63fbfed0049334af21fcb4ee3698 [file] [log] [blame]
{"version":3,"file":"material.umd.min.js","sources":["../../src/material/tabs/tab-nav-bar/tab-nav-bar.ts","../../src/material/tabs/tabs-module.ts","../../src/material/toolbar/toolbar.ts","../../src/material/toolbar/toolbar-module.ts","../../src/material/tree/outlet.ts","../../src/material/tree/node.ts","../../src/material/tree/padding.ts","../../src/material/tree/tree.ts","../../src/material/tree/toggle.ts","../../src/material/tree/tree-module.ts","../../src/material/tree/data-source/flat-data-source.ts","../../src/material/tree/data-source/nested-data-source.ts","../../src/material/autocomplete/autocomplete-trigger.ts","../../src/material/core/month-constants.ts","../../src/material/datepicker/multi-year-view.ts","../../src/material/expansion/expansion-animations.ts","../../src/material/select/select.ts","../../src/material/tooltip/tooltip.ts","../../src/material/table/table-data-source.ts","../../src/material/tabs/ink-bar.ts","../../src/material/tabs/tab-content.ts","../../src/material/tabs/tab-label.ts","../../src/material/tabs/tab.ts","../../src/material/tabs/tabs-animations.ts","../../src/material/tabs/tab-body.ts","../../src/material/tabs/tab-label-wrapper.ts","../../src/material/tabs/paginated-tab-header.ts","../../src/material/tabs/tab-header.ts","../../src/material/tabs/tab-group.ts","../../src/material/sort/sort-header.ts","../../src/material/sort/sort-module.ts","../../src/material/stepper/step-label.ts","../../src/material/stepper/stepper-intl.ts","../../src/material/stepper/step-header.ts","../../src/material/stepper/stepper-animations.ts","../../src/material/stepper/stepper-icon.ts","../../src/material/stepper/stepper.ts","../../src/material/stepper/stepper-button.ts","../../src/material/stepper/stepper-module.ts","../../src/material/table/table.ts","../../src/material/table/cell.ts","../../src/material/table/row.ts","../../src/material/table/text-column.ts","../../src/material/table/table-module.ts","../../src/material/slider/slider.ts","../../src/material/slider/slider-module.ts","../../src/material/snack-bar/snack-bar-ref.ts","../../src/material/snack-bar/snack-bar-config.ts","../../src/material/snack-bar/simple-snack-bar.ts","../../src/material/snack-bar/snack-bar-animations.ts","../../src/material/snack-bar/snack-bar-container.ts","../../src/material/snack-bar/snack-bar-module.ts","../../src/material/snack-bar/snack-bar.ts","../../src/material/sort/sort.ts","../../src/material/sort/sort-animations.ts","../../src/material/sort/sort-header-intl.ts","../../src/material/sidenav/drawer.ts","../../src/material/sidenav/sidenav.ts","../../src/material/sidenav/sidenav-module.ts","../../src/material/slide-toggle/slide-toggle-config.ts","../../src/material/slide-toggle/slide-toggle.ts","../../src/material/slide-toggle/slide-toggle-module.ts","../../src/material/progress-spinner/progress-spinner.ts","../../src/material/progress-spinner/progress-spinner-module.ts","../../src/material/radio/radio.ts","../../src/material/radio/radio-module.ts","../../src/material/sidenav/drawer-animations.ts","../../src/material/select/select-module.ts","../../src/material/tooltip/tooltip-animations.ts","../../src/material/tooltip/tooltip-module.ts","../../src/material/paginator/paginator-intl.ts","../../src/material/paginator/paginator.ts","../../src/material/paginator/paginator-module.ts","../../src/material/progress-bar/progress-bar.ts","../../src/material/progress-bar/progress-bar-module.ts","../../src/material/menu/menu.ts","../../src/material/menu/menu-trigger.ts","../../src/material/menu/menu-module.ts","../../src/material/select/select-animations.ts","../../src/material/list/selection-list.ts","../../src/material/list/list-module.ts","../../src/material/menu/menu-animations.ts","../../src/material/menu/menu-content.ts","../../src/material/menu/menu-panel.ts","../../src/material/menu/menu-item.ts","../../src/material/list/list.ts","../../src/material/expansion/expansion-panel-header.ts","../../src/material/expansion/accordion.ts","../../src/material/expansion/expansion-module.ts","../../src/material/grid-list/grid-list-base.ts","../../src/material/grid-list/grid-tile.ts","../../src/material/grid-list/tile-coordinator.ts","../../src/material/grid-list/tile-styler.ts","../../src/material/grid-list/grid-list.ts","../../src/material/grid-list/grid-list-module.ts","../../src/material/icon/icon-registry.ts","../../src/material/icon/icon.ts","../../src/material/icon/icon-module.ts","../../src/material/datepicker/calendar.ts","../../src/material/datepicker/datepicker-animations.ts","../../src/material/datepicker/datepicker.ts","../../src/material/datepicker/datepicker-input.ts","../../src/material/datepicker/datepicker-toggle.ts","../../src/material/datepicker/datepicker-module.ts","../../src/material/divider/divider.ts","../../src/material/divider/divider-module.ts","../../src/material/expansion/accordion-base.ts","../../src/material/expansion/expansion-panel-content.ts","../../src/material/expansion/expansion-panel.ts","../../src/material/input/input.ts","../../src/material/input/input-module.ts","../../src/material/datepicker/datepicker-intl.ts","../../src/material/datepicker/calendar-body.ts","../../src/material/datepicker/month-view.ts","../../src/material/datepicker/year-view.ts","../../src/material/chips/chip-list.ts","../../src/material/chips/chip-input.ts","../../src/material/chips/chips-module.ts","../../src/material/dialog/dialog-config.ts","../../src/material/dialog/dialog-animations.ts","../../src/material/dialog/dialog-container.ts","../../src/material/dialog/dialog-ref.ts","../../src/material/dialog/dialog.ts","../../src/material/dialog/dialog-content-directives.ts","../../src/material/dialog/dialog-module.ts","../../src/material/input/autosize.ts","../../src/material/input/input-value-accessor.ts","../../src/material/card/card.ts","../../src/material/card/card-module.ts","../../src/material/checkbox/checkbox-config.ts","../../src/material/checkbox/checkbox.ts","../../src/material/checkbox/checkbox-required-validator.ts","../../src/material/checkbox/checkbox-module.ts","../../src/material/chips/chip.ts","../../src/material/chips/chip-default-options.ts","../../src/material/button/button.ts","../../src/material/button/button-module.ts","../../src/material/button-toggle/button-toggle.ts","../../src/material/button-toggle/button-toggle-module.ts","../../src/material/form-field/form-field.ts","../../src/material/form-field/form-field-module.ts","../../src/material/autocomplete/autocomplete.ts","../../src/material/autocomplete/autocomplete-origin.ts","../../src/material/autocomplete/autocomplete-module.ts","../../src/material/badge/badge.ts","../../src/material/badge/badge-module.ts","../../src/material/bottom-sheet/bottom-sheet-config.ts","../../src/material/bottom-sheet/bottom-sheet-animations.ts","../../src/material/bottom-sheet/bottom-sheet-container.ts","../../src/material/bottom-sheet/bottom-sheet-module.ts","../../src/material/bottom-sheet/bottom-sheet-ref.ts","../../src/material/bottom-sheet/bottom-sheet.ts","../../src/material/core/option/option.ts","../../src/material/core/option/index.ts","../../src/material/core/label/label-options.ts","../../src/material/form-field/error.ts","../../src/material/form-field/form-field-animations.ts","../../src/material/form-field/form-field-control.ts","../../src/material/form-field/hint.ts","../../src/material/form-field/label.ts","../../src/material/form-field/placeholder.ts","../../src/material/form-field/prefix.ts","../../src/material/form-field/suffix.ts","../../node_modules/tslib/tslib.es6.js","../../src/material/core/common-behaviors/common-module.ts","../../src/material/core/common-behaviors/disabled.ts","../../src/material/core/common-behaviors/color.ts","../../src/material/core/common-behaviors/disable-ripple.ts","../../src/material/core/common-behaviors/tabindex.ts","../../src/material/core/common-behaviors/error-state.ts","../../src/material/core/common-behaviors/initialized.ts","../../src/material/core/datetime/date-adapter.ts","../../src/material/core/datetime/native-date-adapter.ts","../../src/material/core/line/line.ts","../../src/material/core/ripple/ripple-renderer.ts","../../src/material/form-field/form-field-errors.ts","../../src/material/input/input-errors.ts","../../src/material/datepicker/datepicker-errors.ts","../../src/material/menu/menu-errors.ts","../../src/material/select/select-errors.ts","../../src/material/sort/sort-errors.ts","../../src/material/core/version.ts","../../src/material/core/animation/animation.ts","../../src/material/core/datetime/date-formats.ts","../../src/material/core/datetime/native-date-formats.ts","../../src/material/core/datetime/index.ts","../../src/material/core/error/error-options.ts","../../src/material/core/gestures/gesture-config.ts","../../src/material/core/ripple/ripple-ref.ts","../../src/material/core/ripple/ripple.ts","../../src/material/core/ripple/index.ts","../../src/material/core/selection/pseudo-checkbox/pseudo-checkbox.ts","../../src/material/core/selection/index.ts","../../src/material/core/option/optgroup.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {Directionality} from '@angular/cdk/bidi';\nimport {Platform} from '@angular/cdk/platform';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanDisable, CanDisableCtor,\n CanDisableRipple, CanDisableRippleCtor,\n HasTabIndex, HasTabIndexCtor,\n MAT_RIPPLE_GLOBAL_OPTIONS,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex, RippleConfig,\n RippleGlobalOptions,\n RippleRenderer,\n RippleTarget,\n ThemePalette,\n} from '@angular/material/core';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {FocusMonitor, FocusableOption} from '@angular/cdk/a11y';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {MatInkBar} from '../ink-bar';\nimport {MatPaginatedTabHeader} from '../paginated-tab-header';\n\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n moduleId: module.id,\n selector: '[mat-tab-nav-bar]',\n exportAs: 'matTabNavBar, matTabNav',\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.css'],\n host: {\n 'class': 'mat-tab-nav-bar mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatTabNav extends MatPaginatedTabHeader implements AfterContentChecked,\n AfterContentInit, OnDestroy {\n\n /** Query list of all tab links of the tab navigation. */\n @ContentChildren(forwardRef(() => MatTabLink), {descendants: true}) _items: QueryList<MatTabLink>;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator', {static: false}) _nextPaginator: ElementRef<HTMLElement>;\n @ViewChild('previousPaginator', {static: false}) _previousPaginator: ElementRef<HTMLElement>;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n constructor(elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n /**\n * @deprecated @breaking-change 9.0.0 `platform` parameter to become required.\n */\n @Optional() platform?: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected() {\n // noop\n }\n\n ngAfterContentInit() {\n this.updateActiveLink();\n super.ngAfterContentInit();\n }\n\n /**\n * Notifies the component that the active link has been changed.\n * @breaking-change 8.0.0 `element` parameter to be removed.\n */\n updateActiveLink(_element?: ElementRef) {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n}\n\n\n// Boilerplate for applying mixins to MatTabLink.\nclass MatTabLinkBase {}\nconst _MatTabLinkMixinBase:\n HasTabIndexCtor & CanDisableRippleCtor & CanDisableCtor & typeof MatTabLinkBase =\n mixinTabIndex(mixinDisableRipple(mixinDisabled(MatTabLinkBase)));\n\n/**\n * Link inside of a `mat-tab-nav-bar`.\n */\n@Directive({\n selector: '[mat-tab-link], [matTabLink]',\n exportAs: 'matTabLink',\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n host: {\n 'class': 'mat-tab-link',\n '[attr.aria-current]': 'active',\n '[attr.aria-disabled]': 'disabled',\n '[attr.tabIndex]': 'tabIndex',\n '[class.mat-tab-disabled]': 'disabled',\n '[class.mat-tab-label-active]': 'active',\n }\n})\nexport class MatTabLink extends _MatTabLinkMixinBase implements OnDestroy, CanDisable,\n CanDisableRipple, HasTabIndex, RippleTarget, FocusableOption {\n\n /** Whether the tab link is active or not. */\n protected _isActive: boolean = false;\n\n /** Reference to the RippleRenderer for the tab-link. */\n protected _tabLinkRipple: RippleRenderer;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean { return this._isActive; }\n set active(value: boolean) {\n if (value !== this._isActive) {\n this._isActive = value;\n this._tabNavBar.updateActiveLink(this.elementRef);\n }\n }\n\n /**\n * Ripple configuration for ripples that are launched on pointer down. The ripple config\n * is set to the global ripple options since we don't have any configurable options for\n * the tab link ripples.\n * @docs-private\n */\n rippleConfig: RippleConfig & RippleGlobalOptions;\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple ||\n !!this.rippleConfig.disabled;\n }\n\n constructor(\n private _tabNavBar: MatTabNav, public elementRef: ElementRef, ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS) globalRippleOptions: RippleGlobalOptions|null,\n @Attribute('tabindex') tabIndex: string, private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super();\n\n this._tabLinkRipple = new RippleRenderer(this, ngZone, elementRef, platform);\n this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement);\n this.rippleConfig = globalRippleOptions || {};\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n this.rippleConfig.animation = {enterDuration: 0, exitDuration: 0};\n }\n\n _focusMonitor.monitor(elementRef);\n }\n\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngOnDestroy() {\n this._tabLinkRipple._removeTriggerEvents();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatInkBar} from './ink-bar';\nimport {MatTab} from './tab';\nimport {MatTabBody, MatTabBodyPortal} from './tab-body';\nimport {MatTabContent} from './tab-content';\nimport {MatTabGroup} from './tab-group';\nimport {MatTabHeader} from './tab-header';\nimport {MatTabLabel} from './tab-label';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {MatTabLink, MatTabNav} from './tab-nav-bar/tab-nav-bar';\nimport {A11yModule} from '@angular/cdk/a11y';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule,\n ],\n // Don't export all components because some are only to be used internally.\n exports: [\n MatCommonModule,\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatTabNav,\n MatTabLink,\n MatTabContent,\n ],\n declarations: [\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatInkBar,\n MatTabLabelWrapper,\n MatTabNav,\n MatTabLink,\n MatTabBody,\n MatTabBodyPortal,\n MatTabHeader,\n MatTabContent,\n ],\n})\nexport class MatTabsModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n Inject,\n isDevMode,\n QueryList,\n ViewEncapsulation,\n} from '@angular/core';\nimport {CanColor, CanColorCtor, mixinColor} from '@angular/material/core';\n\n\n// Boilerplate for applying mixins to MatToolbar.\n/** @docs-private */\nclass MatToolbarBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatToolbarMixinBase: CanColorCtor & typeof MatToolbarBase = mixinColor(MatToolbarBase);\n\n@Directive({\n selector: 'mat-toolbar-row',\n exportAs: 'matToolbarRow',\n host: {'class': 'mat-toolbar-row'},\n})\nexport class MatToolbarRow {}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-toolbar',\n exportAs: 'matToolbar',\n templateUrl: 'toolbar.html',\n styleUrls: ['toolbar.css'],\n inputs: ['color'],\n host: {\n 'class': 'mat-toolbar',\n '[class.mat-toolbar-multiple-rows]': '_toolbarRows.length > 0',\n '[class.mat-toolbar-single-row]': '_toolbarRows.length === 0',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatToolbar extends _MatToolbarMixinBase implements CanColor, AfterViewInit {\n private _document: Document;\n\n /** Reference to all toolbar row elements that have been projected. */\n @ContentChildren(MatToolbarRow) _toolbarRows: QueryList<MatToolbarRow>;\n\n constructor(\n elementRef: ElementRef,\n private _platform: Platform,\n @Inject(DOCUMENT) document?: any) {\n super(elementRef);\n\n // TODO: make the document a required param when doing breaking changes.\n this._document = document;\n }\n\n ngAfterViewInit() {\n if (!isDevMode() || !this._platform.isBrowser) {\n return;\n }\n\n this._checkToolbarMixedModes();\n this._toolbarRows.changes.subscribe(() => this._checkToolbarMixedModes());\n }\n\n /**\n * Throws an exception when developers are attempting to combine the different toolbar row modes.\n */\n private _checkToolbarMixedModes() {\n if (!this._toolbarRows.length) {\n return;\n }\n\n // Check if there are any other DOM nodes that can display content but aren't inside of\n // a <mat-toolbar-row> element.\n const isCombinedUsage = Array.from<HTMLElement>(this._elementRef.nativeElement.childNodes)\n .filter(node => !(node.classList && node.classList.contains('mat-toolbar-row')))\n .filter(node => node.nodeType !== (this._document ? this._document.COMMENT_NODE : 8))\n .some(node => !!(node.textContent && node.textContent.trim()));\n\n if (isCombinedUsage) {\n throwToolbarMixedModesError();\n }\n }\n}\n\n/**\n * Throws an exception when attempting to combine the different toolbar row modes.\n * @docs-private\n */\nexport function throwToolbarMixedModesError() {\n throw Error('MatToolbar: Attempting to combine different toolbar modes. ' +\n 'Either specify multiple `<mat-toolbar-row>` elements explicitly or just place content ' +\n 'inside of a `<mat-toolbar>` for a single row.');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatToolbar, MatToolbarRow} from './toolbar';\n\n\n@NgModule({\n imports: [MatCommonModule],\n exports: [MatToolbar, MatToolbarRow, MatCommonModule],\n declarations: [MatToolbar, MatToolbarRow],\n})\nexport class MatToolbarModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {CDK_TREE_NODE_OUTLET_NODE, CdkTreeNodeOutlet} from '@angular/cdk/tree';\nimport {\n Directive,\n Inject,\n Optional,\n ViewContainerRef,\n} from '@angular/core';\n\n/**\n * Outlet for nested CdkNode. Put `[matTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\n@Directive({\n selector: '[matTreeNodeOutlet]'\n})\nexport class MatTreeNodeOutlet implements CdkTreeNodeOutlet {\n constructor(\n public viewContainer: ViewContainerRef,\n @Inject(CDK_TREE_NODE_OUTLET_NODE) @Optional() public _node?: any) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n CDK_TREE_NODE_OUTLET_NODE,\n CdkNestedTreeNode,\n CdkTree,\n CdkTreeNode,\n CdkTreeNodeDef,\n} from '@angular/cdk/tree';\nimport {\n AfterContentInit,\n Attribute,\n ContentChildren,\n Directive,\n ElementRef,\n Input,\n IterableDiffers,\n OnDestroy,\n QueryList,\n} from '@angular/core';\nimport {\n CanDisable,\n CanDisableCtor,\n HasTabIndex,\n HasTabIndexCtor,\n mixinDisabled,\n mixinTabIndex,\n} from '@angular/material/core';\n\nimport {MatTreeNodeOutlet} from './outlet';\n\nconst _MatTreeNodeMixinBase: HasTabIndexCtor & CanDisableCtor & typeof CdkTreeNode =\n mixinTabIndex(mixinDisabled(CdkTreeNode));\n\nconst _MatNestedTreeNodeMixinBase:\n HasTabIndexCtor & CanDisableCtor & typeof CdkNestedTreeNode =\n mixinTabIndex(mixinDisabled(CdkNestedTreeNode));\n\n/**\n * Wrapper for the CdkTree node with Material design styles.\n */\n@Directive({\n selector: 'mat-tree-node',\n exportAs: 'matTreeNode',\n inputs: ['disabled', 'tabIndex'],\n host: {\n '[attr.aria-expanded]': 'isExpanded',\n '[attr.aria-level]': 'role === \"treeitem\" ? level : null',\n '[attr.role]': 'role',\n 'class': 'mat-tree-node'\n },\n providers: [{provide: CdkTreeNode, useExisting: MatTreeNode}]\n})\nexport class MatTreeNode<T> extends _MatTreeNodeMixinBase<T>\n implements CanDisable, HasTabIndex {\n @Input() role: 'treeitem' | 'group' = 'treeitem';\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _tree: CdkTree<T>,\n @Attribute('tabindex') tabIndex: string) {\n super(_elementRef, _tree);\n\n this.tabIndex = Number(tabIndex) || 0;\n }\n}\n\n/**\n * Wrapper for the CdkTree node definition with Material design styles.\n */\n@Directive({\n selector: '[matTreeNodeDef]',\n inputs: [\n 'when: matTreeNodeDefWhen'\n ],\n providers: [{provide: CdkTreeNodeDef, useExisting: MatTreeNodeDef}]\n})\nexport class MatTreeNodeDef<T> extends CdkTreeNodeDef<T> {\n @Input('matTreeNode') data: T;\n}\n\n/**\n * Wrapper for the CdkTree nested node with Material design styles.\n */\n@Directive({\n selector: 'mat-nested-tree-node',\n exportAs: 'matNestedTreeNode',\n host: {\n '[attr.aria-expanded]': 'isExpanded',\n '[attr.role]': 'role',\n 'class': 'mat-nested-tree-node',\n },\n inputs: ['disabled', 'tabIndex'],\n providers: [\n {provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode},\n {provide: CdkTreeNode, useExisting: MatNestedTreeNode},\n {provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode}\n ]\n})\nexport class MatNestedTreeNode<T> extends _MatNestedTreeNodeMixinBase<T> implements\n AfterContentInit, CanDisable, HasTabIndex, OnDestroy {\n @Input('matNestedTreeNode') node: T;\n\n /** The children node placeholder. */\n @ContentChildren(MatTreeNodeOutlet, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n })\n nodeOutlet: QueryList<MatTreeNodeOutlet>;\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _tree: CdkTree<T>,\n protected _differs: IterableDiffers,\n @Attribute('tabindex') tabIndex: string) {\n super(_elementRef, _tree, _differs);\n\n this.tabIndex = Number(tabIndex) || 0;\n }\n\n // This is a workaround for https://github.com/angular/angular/issues/23091\n // In aot mode, the lifecycle hooks from parent class are not called.\n // TODO(tinayuangao): Remove when the angular issue #23091 is fixed\n ngAfterContentInit() {\n super.ngAfterContentInit();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {CdkTreeNodePadding} from '@angular/cdk/tree';\nimport {Directive, Input} from '@angular/core';\n\n/**\n * Wrapper for the CdkTree padding with Material design styles.\n */\n@Directive({\n selector: '[matTreeNodePadding]',\n providers: [{provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding}]\n})\nexport class MatTreeNodePadding<T> extends CdkTreeNodePadding<T> {\n\n /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n @Input('matTreeNodePadding') level: number;\n\n /** The indent for each level. Default number 40px from material design menu sub-menu spec. */\n @Input('matTreeNodePaddingIndent') indent: number;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkTree} from '@angular/cdk/tree';\nimport {ChangeDetectionStrategy, Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport {MatTreeNodeOutlet} from './outlet';\n\n/**\n * Wrapper for the CdkTable with Material design styles.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tree',\n exportAs: 'matTree',\n template: `<ng-container matTreeNodeOutlet></ng-container>`,\n host: {\n 'class': 'mat-tree',\n 'role': 'tree',\n },\n styleUrls: ['tree.css'],\n encapsulation: ViewEncapsulation.None,\n // See note on CdkTree for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [{provide: CdkTree, useExisting: MatTree}]\n})\nexport class MatTree<T> extends CdkTree<T> {\n // Outlets within the tree's template where the dataNodes will be inserted.\n @ViewChild(MatTreeNodeOutlet, {static: true}) _nodeOutlet: MatTreeNodeOutlet;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkTreeNodeToggle} from '@angular/cdk/tree';\nimport {Directive, Input} from '@angular/core';\n\n/**\n * Wrapper for the CdkTree's toggle with Material design styles.\n */\n@Directive({\n selector: '[matTreeNodeToggle]',\n providers: [{provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle}]\n})\nexport class MatTreeNodeToggle<T> extends CdkTreeNodeToggle<T> {\n @Input('matTreeNodeToggleRecursive') recursive: boolean = false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\n\nimport {CdkTreeModule} from '@angular/cdk/tree';\nimport {CommonModule} from '@angular/common';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatNestedTreeNode, MatTreeNodeDef, MatTreeNode} from './node';\nimport {MatTree} from './tree';\nimport {MatTreeNodeToggle} from './toggle';\nimport {MatTreeNodeOutlet} from './outlet';\nimport {MatTreeNodePadding} from './padding';\n\nconst MAT_TREE_DIRECTIVES = [\n MatNestedTreeNode,\n MatTreeNodeDef,\n MatTreeNodePadding,\n MatTreeNodeToggle,\n MatTree,\n MatTreeNode,\n MatTreeNodeOutlet\n];\n\n@NgModule({\n imports: [CdkTreeModule, CommonModule, MatCommonModule],\n exports: MAT_TREE_DIRECTIVES,\n declarations: MAT_TREE_DIRECTIVES,\n})\nexport class MatTreeModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CollectionViewer, DataSource} from '@angular/cdk/collections';\nimport {FlatTreeControl, TreeControl} from '@angular/cdk/tree';\nimport {BehaviorSubject, merge, Observable} from 'rxjs';\nimport {map, take} from 'rxjs/operators';\n\n/**\n * Tree flattener to convert a normal type of node to node with children & level information.\n * Transform nested nodes of type `T` to flattened nodes of type `F`.\n *\n * For example, the input data of type `T` is nested, and contains its children data:\n * SomeNode: {\n * key: 'Fruits',\n * children: [\n * NodeOne: {\n * key: 'Apple',\n * },\n * NodeTwo: {\n * key: 'Pear',\n * }\n * ]\n * }\n * After flattener flatten the tree, the structure will become\n * SomeNode: {\n * key: 'Fruits',\n * expandable: true,\n * level: 1\n * },\n * NodeOne: {\n * key: 'Apple',\n * expandable: false,\n * level: 2\n * },\n * NodeTwo: {\n * key: 'Pear',\n * expandable: false,\n * level: 2\n * }\n * and the output flattened type is `F` with additional information.\n */\nexport class MatTreeFlattener<T, F> {\n\n constructor(public transformFunction: (node: T, level: number) => F,\n public getLevel: (node: F) => number,\n public isExpandable: (node: F) => boolean,\n public getChildren: (node: T) =>\n Observable<T[]> | T[] | undefined | null) {}\n\n _flattenNode(node: T, level: number,\n resultNodes: F[], parentMap: boolean[]): F[] {\n const flatNode = this.transformFunction(node, level);\n resultNodes.push(flatNode);\n\n if (this.isExpandable(flatNode)) {\n const childrenNodes = this.getChildren(node);\n if (childrenNodes) {\n if (Array.isArray(childrenNodes)) {\n this._flattenChildren(childrenNodes, level, resultNodes, parentMap);\n } else {\n childrenNodes.pipe(take(1)).subscribe(children => {\n this._flattenChildren(children, level, resultNodes, parentMap);\n });\n }\n }\n }\n return resultNodes;\n }\n\n _flattenChildren(children: T[], level: number,\n resultNodes: F[], parentMap: boolean[]): void {\n children.forEach((child, index) => {\n let childParentMap: boolean[] = parentMap.slice();\n childParentMap.push(index != children.length - 1);\n this._flattenNode(child, level + 1, resultNodes, childParentMap);\n });\n }\n\n /**\n * Flatten a list of node type T to flattened version of node F.\n * Please note that type T may be nested, and the length of `structuredData` may be different\n * from that of returned list `F[]`.\n */\n flattenNodes(structuredData: T[]): F[] {\n let resultNodes: F[] = [];\n structuredData.forEach(node => this._flattenNode(node, 0, resultNodes, []));\n return resultNodes;\n }\n\n /**\n * Expand flattened node with current expansion status.\n * The returned list may have different length.\n */\n expandFlattenedNodes(nodes: F[], treeControl: TreeControl<F>): F[] {\n let results: F[] = [];\n let currentExpand: boolean[] = [];\n currentExpand[0] = true;\n\n nodes.forEach(node => {\n let expand = true;\n for (let i = 0; i <= this.getLevel(node); i++) {\n expand = expand && currentExpand[i];\n }\n if (expand) {\n results.push(node);\n }\n if (this.isExpandable(node)) {\n currentExpand[this.getLevel(node) + 1] = treeControl.isExpanded(node);\n }\n });\n return results;\n }\n}\n\n\n/**\n * Data source for flat tree.\n * The data source need to handle expansion/collapsion of the tree node and change the data feed\n * to `MatTree`.\n * The nested tree nodes of type `T` are flattened through `MatTreeFlattener`, and converted\n * to type `F` for `MatTree` to consume.\n */\nexport class MatTreeFlatDataSource<T, F> extends DataSource<F> {\n _flattenedData = new BehaviorSubject<F[]>([]);\n\n _expandedData = new BehaviorSubject<F[]>([]);\n\n _data: BehaviorSubject<T[]>;\n get data() { return this._data.value; }\n set data(value: T[]) {\n this._data.next(value);\n this._flattenedData.next(this._treeFlattener.flattenNodes(this.data));\n this._treeControl.dataNodes = this._flattenedData.value;\n }\n\n constructor(private _treeControl: FlatTreeControl<F>,\n private _treeFlattener: MatTreeFlattener<T, F>,\n initialData: T[] = []) {\n super();\n this._data = new BehaviorSubject<T[]>(initialData);\n }\n\n connect(collectionViewer: CollectionViewer): Observable<F[]> {\n const changes = [\n collectionViewer.viewChange,\n this._treeControl.expansionModel.onChange,\n this._flattenedData\n ];\n return merge(...changes).pipe(map(() => {\n this._expandedData.next(\n this._treeFlattener.expandFlattenedNodes(this._flattenedData.value, this._treeControl));\n return this._expandedData.value;\n }));\n }\n\n disconnect() {\n // no op\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CollectionViewer, DataSource} from '@angular/cdk/collections';\nimport {BehaviorSubject, merge, Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\n\n/**\n * Data source for nested tree.\n *\n * The data source for nested tree doesn't have to consider node flattener, or the way to expand\n * or collapse. The expansion/collapsion will be handled by TreeControl and each non-leaf node.\n */\nexport class MatTreeNestedDataSource<T> extends DataSource<T> {\n _data = new BehaviorSubject<T[]>([]);\n\n /**\n * Data for the nested tree\n */\n get data() { return this._data.value; }\n set data(value: T[]) { this._data.next(value); }\n\n connect(collectionViewer: CollectionViewer): Observable<T[]> {\n return merge(...[collectionViewer.viewChange, this._data])\n .pipe(map(() => {\n return this.data;\n }));\n }\n\n disconnect() {\n // no op\n }\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {Directionality} from '@angular/cdk/bidi';\nimport {DOWN_ARROW, ENTER, ESCAPE, TAB, UP_ARROW} from '@angular/cdk/keycodes';\nimport {\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayConfig,\n OverlayRef,\n PositionStrategy,\n ScrollStrategy,\n ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {DOCUMENT} from '@angular/common';\nimport {filter, take, switchMap, delay, tap, map} from 'rxjs/operators';\nimport {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n forwardRef,\n Host,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n ViewContainerRef,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n _countGroupLabelsBeforeOption,\n _getOptionScrollPosition,\n MatOption,\n MatOptionSelectionChange,\n} from '@angular/material/core';\nimport {MatFormField} from '@angular/material/form-field';\nimport {Subscription, defer, fromEvent, merge, of as observableOf, Subject, Observable} from 'rxjs';\nimport {MatAutocomplete} from './autocomplete';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatAutocompleteOrigin} from './autocomplete-origin';\n\n\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the scrollTop of the panel. Because we are not\n * actually focusing the active item, scroll must be handled manually.\n */\n\n/** The height of each autocomplete option. */\nexport const AUTOCOMPLETE_OPTION_HEIGHT = 48;\n\n/** The total height of the autocomplete panel. */\nexport const AUTOCOMPLETE_PANEL_HEIGHT = 256;\n\n/** Injection token that determines the scroll handling while the autocomplete panel is open. */\nexport const MAT_AUTOCOMPLETE_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-autocomplete-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_AUTOCOMPLETE_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY,\n};\n\n/**\n * Provider that allows the autocomplete to register as a ControlValueAccessor.\n * @docs-private\n */\nexport const MAT_AUTOCOMPLETE_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatAutocompleteTrigger),\n multi: true\n};\n\n/**\n * Creates an error to be thrown when attempting to use an autocomplete trigger without a panel.\n * @docs-private\n */\nexport function getMatAutocompleteMissingPanelError(): Error {\n return Error('Attempting to open an undefined instance of `mat-autocomplete`. ' +\n 'Make sure that the id passed to the `matAutocomplete` is correct and that ' +\n 'you\\'re attempting to open it after the ngAfterContentInit hook.');\n}\n\n\n@Directive({\n selector: `input[matAutocomplete], textarea[matAutocomplete]`,\n host: {\n '[attr.autocomplete]': 'autocompleteAttribute',\n '[attr.role]': 'autocompleteDisabled ? null : \"combobox\"',\n '[attr.aria-autocomplete]': 'autocompleteDisabled ? null : \"list\"',\n '[attr.aria-activedescendant]': '(panelOpen && activeOption) ? activeOption.id : null',\n '[attr.aria-expanded]': 'autocompleteDisabled ? null : panelOpen.toString()',\n '[attr.aria-owns]': '(autocompleteDisabled || !panelOpen) ? null : autocomplete?.id',\n '[attr.aria-haspopup]': '!autocompleteDisabled',\n // Note: we use `focusin`, as opposed to `focus`, in order to open the panel\n // a little earlier. This avoids issues where IE delays the focusing of the input.\n '(focusin)': '_handleFocus()',\n '(blur)': '_onTouched()',\n '(input)': '_handleInput($event)',\n '(keydown)': '_handleKeydown($event)',\n },\n exportAs: 'matAutocompleteTrigger',\n providers: [MAT_AUTOCOMPLETE_VALUE_ACCESSOR]\n})\nexport class MatAutocompleteTrigger implements ControlValueAccessor, OnChanges, OnDestroy {\n private _overlayRef: OverlayRef | null;\n private _portal: TemplatePortal;\n private _componentDestroyed = false;\n private _autocompleteDisabled = false;\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Old value of the native input. Used to work around issues with the `input` event on IE. */\n private _previousValue: string | number | null;\n\n /** Strategy that is used to position the panel. */\n private _positionStrategy: FlexibleConnectedPositionStrategy;\n\n /** Whether or not the label state is being overridden. */\n private _manuallyFloatingLabel = false;\n\n /** The subscription for closing actions (some are bound to document). */\n private _closingActionsSubscription: Subscription;\n\n /** Subscription to viewport size changes. */\n private _viewportSubscription = Subscription.EMPTY;\n\n /**\n * Whether the autocomplete can open the next time it is focused. Used to prevent a focused,\n * closed autocomplete from being reopened if the user switches to another browser tab and then\n * comes back.\n */\n private _canOpenOnNextFocus = true;\n\n /** Stream of keyboard events that can close the panel. */\n private readonly _closeKeyEventStream = new Subject<void>();\n\n /**\n * Event handler for when the window is blurred. Needs to be an\n * arrow function in order to preserve the context.\n */\n private _windowBlurHandler = () => {\n // If the user blurred the window while the autocomplete is focused, it means that it'll be\n // refocused when they come back. In this case we want to skip the first focus event, if the\n // pane was closed, in order to avoid reopening it unintentionally.\n this._canOpenOnNextFocus =\n this._document.activeElement !== this._element.nativeElement || this.panelOpen;\n }\n\n /** `View -> model callback called when value changes` */\n _onChange: (value: any) => void = () => {};\n\n /** `View -> model callback called when autocomplete has been touched` */\n _onTouched = () => {};\n\n /** The autocomplete panel to be attached to this trigger. */\n @Input('matAutocomplete') autocomplete: MatAutocomplete;\n\n /**\n * Position of the autocomplete panel relative to the trigger element. A position of `auto`\n * will render the panel underneath the trigger if there is enough space for it to fit in\n * the viewport, otherwise the panel will be shown above it. If the position is set to\n * `above` or `below`, the panel will always be shown above or below the trigger. no matter\n * whether it fits completely in the viewport.\n */\n @Input('matAutocompletePosition') position: 'auto' | 'above' | 'below' = 'auto';\n\n /**\n * Reference relative to which to position the autocomplete panel.\n * Defaults to the autocomplete trigger element.\n */\n @Input('matAutocompleteConnectedTo') connectedTo: MatAutocompleteOrigin;\n\n /**\n * `autocomplete` attribute to be set on the input element.\n * @docs-private\n */\n @Input('autocomplete') autocompleteAttribute: string = 'off';\n\n /**\n * Whether the autocomplete is disabled. When disabled, the element will\n * act as a regular input and the user won't be able to open the panel.\n */\n @Input('matAutocompleteDisabled')\n get autocompleteDisabled(): boolean { return this._autocompleteDisabled; }\n set autocompleteDisabled(value: boolean) {\n this._autocompleteDisabled = coerceBooleanProperty(value);\n }\n\n constructor(private _element: ElementRef<HTMLInputElement>, private _overlay: Overlay,\n private _viewContainerRef: ViewContainerRef,\n private _zone: NgZone,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_AUTOCOMPLETE_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality,\n @Optional() @Host() private _formField: MatFormField,\n @Optional() @Inject(DOCUMENT) private _document: any,\n // @breaking-change 8.0.0 Make `_viewportRuler` required.\n private _viewportRuler?: ViewportRuler) {\n\n if (typeof window !== 'undefined') {\n _zone.runOutsideAngular(() => {\n window.addEventListener('blur', this._windowBlurHandler);\n });\n }\n\n this._scrollStrategy = scrollStrategy;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['position'] && this._positionStrategy) {\n this._setStrategyPositions(this._positionStrategy);\n\n if (this.panelOpen) {\n this._overlayRef!.updatePosition();\n }\n }\n }\n\n ngOnDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener('blur', this._windowBlurHandler);\n }\n\n this._viewportSubscription.unsubscribe();\n this._componentDestroyed = true;\n this._destroyPanel();\n this._closeKeyEventStream.complete();\n }\n\n /** Whether or not the autocomplete panel is open. */\n get panelOpen(): boolean {\n return this._overlayAttached && this.autocomplete.showPanel;\n }\n private _overlayAttached: boolean = false;\n\n /** Opens the autocomplete suggestion panel. */\n openPanel(): void {\n this._attachOverlay();\n this._floatLabel();\n }\n\n /** Closes the autocomplete suggestion panel. */\n closePanel(): void {\n this._resetLabel();\n\n if (!this._overlayAttached) {\n return;\n }\n\n if (this.panelOpen) {\n // Only emit if the panel was visible.\n this.autocomplete.closed.emit();\n }\n\n this.autocomplete._isOpen = this._overlayAttached = false;\n\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n this._closingActionsSubscription.unsubscribe();\n }\n\n // Note that in some cases this can end up being called after the component is destroyed.\n // Add a check to ensure that we don't try to run change detection on a destroyed view.\n if (!this._componentDestroyed) {\n // We need to trigger change detection manually, because\n // `fromEvent` doesn't seem to do it at the proper time.\n // This ensures that the label is reset when the\n // user clicks outside.\n this._changeDetectorRef.detectChanges();\n }\n }\n\n /**\n * Updates the position of the autocomplete suggestion panel to ensure that it fits all options\n * within the viewport.\n */\n updatePosition(): void {\n if (this._overlayAttached) {\n this._overlayRef!.updatePosition();\n }\n }\n\n /**\n * A stream of actions that should close the autocomplete panel, including\n * when an option is selected, on blur, and when TAB is pressed.\n */\n get panelClosingActions(): Observable<MatOptionSelectionChange|null> {\n return merge(\n this.optionSelections,\n this.autocomplete._keyManager.tabOut.pipe(filter(() => this._overlayAttached)),\n this._closeKeyEventStream,\n this._getOutsideClickStream(),\n this._overlayRef ?\n this._overlayRef.detachments().pipe(filter(() => this._overlayAttached)) :\n observableOf()\n ).pipe(\n // Normalize the output so we return a consistent type.\n map(event => event instanceof MatOptionSelectionChange ? event : null)\n );\n }\n\n /** Stream of autocomplete option selections. */\n readonly optionSelections: Observable<MatOptionSelectionChange> = defer(() => {\n if (this.autocomplete && this.autocomplete.options) {\n return merge(...this.autocomplete.options.map(option => option.onSelectionChange));\n }\n\n // If there are any subscribers before `ngAfterViewInit`, the `autocomplete` will be undefined.\n // Return a stream that we'll replace with the real one once everything is in place.\n return this._zone.onStable\n .asObservable()\n .pipe(take(1), switchMap(() => this.optionSelections));\n }) as Observable<MatOptionSelectionChange>;\n\n /** The currently active option, coerced to MatOption type. */\n get activeOption(): MatOption | null {\n if (this.autocomplete && this.autocomplete._keyManager) {\n return this.autocomplete._keyManager.activeItem;\n }\n\n return null;\n }\n\n /** Stream of clicks outside of the autocomplete panel. */\n private _getOutsideClickStream(): Observable<any> {\n return merge(\n fromEvent(this._document, 'click') as Observable<MouseEvent>,\n fromEvent(this._document, 'touchend') as Observable<TouchEvent>\n )\n .pipe(filter(event => {\n const clickTarget = event.target as HTMLElement;\n const formField = this._formField ?\n this._formField._elementRef.nativeElement : null;\n\n return this._overlayAttached &&\n clickTarget !== this._element.nativeElement &&\n (!formField || !formField.contains(clickTarget)) &&\n (!!this._overlayRef && !this._overlayRef.overlayElement.contains(clickTarget));\n }));\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any): void {\n Promise.resolve(null).then(() => this._setTriggerValue(value));\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => {}): void {\n this._onChange = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: () => {}) {\n this._onTouched = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean) {\n this._element.nativeElement.disabled = isDisabled;\n }\n\n _handleKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n\n // Prevent the default action on all escape key presses. This is here primarily to bring IE\n // in line with other browsers. By default, pressing escape on IE will cause it to revert\n // the input value to the one that it had on focus, however it won't dispatch any events\n // which means that the model value will be out of sync with the view.\n if (keyCode === ESCAPE) {\n event.preventDefault();\n }\n\n if (this.activeOption && keyCode === ENTER && this.panelOpen) {\n this.activeOption._selectViaInteraction();\n this._resetActiveItem();\n event.preventDefault();\n } else if (this.autocomplete) {\n const prevActiveItem = this.autocomplete._keyManager.activeItem;\n const isArrowKey = keyCode === UP_ARROW || keyCode === DOWN_ARROW;\n\n if (this.panelOpen || keyCode === TAB) {\n this.autocomplete._keyManager.onKeydown(event);\n } else if (isArrowKey && this._canOpen()) {\n this.openPanel();\n }\n\n if (isArrowKey || this.autocomplete._keyManager.activeItem !== prevActiveItem) {\n this._scrollToOption();\n }\n }\n }\n\n _handleInput(event: KeyboardEvent): void {\n let target = event.target as HTMLInputElement;\n let value: number | string | null = target.value;\n\n // Based on `NumberValueAccessor` from forms.\n if (target.type === 'number') {\n value = value == '' ? null : parseFloat(value);\n }\n\n // If the input has a placeholder, IE will fire the `input` event on page load,\n // focus and blur, in addition to when the user actually changed the value. To\n // filter out all of the extra events, we save the value on focus and between\n // `input` events, and we check whether it changed.\n // See: https://connect.microsoft.com/IE/feedback/details/885747/\n if (this._previousValue !== value) {\n this._previousValue = value;\n this._onChange(value);\n\n if (this._canOpen() && this._document.activeElement === event.target) {\n this.openPanel();\n }\n }\n }\n\n _handleFocus(): void {\n if (!this._canOpenOnNextFocus) {\n this._canOpenOnNextFocus = true;\n } else if (this._canOpen()) {\n this._previousValue = this._element.nativeElement.value;\n this._attachOverlay();\n this._floatLabel(true);\n }\n }\n\n /**\n * In \"auto\" mode, the label will animate down as soon as focus is lost.\n * This causes the value to jump when selecting an option with the mouse.\n * This method manually floats the label until the panel can be closed.\n * @param shouldAnimate Whether the label should be animated when it is floated.\n */\n private _floatLabel(shouldAnimate = false): void {\n if (this._formField && this._formField.floatLabel === 'auto') {\n if (shouldAnimate) {\n this._formField._animateAndLockLabel();\n } else {\n this._formField.floatLabel = 'always';\n }\n\n this._manuallyFloatingLabel = true;\n }\n }\n\n /** If the label has been manually elevated, return it to its normal state. */\n private _resetLabel(): void {\n if (this._manuallyFloatingLabel) {\n this._formField.floatLabel = 'auto';\n this._manuallyFloatingLabel = false;\n }\n }\n\n /**\n * Given that we are not actually focusing active options, we must manually adjust scroll\n * to reveal options below the fold. First, we find the offset of the option from the top\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\n * the panel height + the option height, so the active option will be just visible at the\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\n * not adjusted.\n */\n private _scrollToOption(): void {\n const index = this.autocomplete._keyManager.activeItemIndex || 0;\n const labelCount = _countGroupLabelsBeforeOption(index,\n this.autocomplete.options, this.autocomplete.optionGroups);\n\n const newScrollPosition = _getOptionScrollPosition(\n index + labelCount,\n AUTOCOMPLETE_OPTION_HEIGHT,\n this.autocomplete._getScrollTop(),\n AUTOCOMPLETE_PANEL_HEIGHT\n );\n\n this.autocomplete._setScrollTop(newScrollPosition);\n }\n\n /**\n * This method listens to a stream of panel closing actions and resets the\n * stream every time the option list changes.\n */\n private _subscribeToClosingActions(): Subscription {\n const firstStable = this._zone.onStable.asObservable().pipe(take(1));\n const optionChanges = this.autocomplete.options.changes.pipe(\n tap(() => this._positionStrategy.reapplyLastPosition()),\n // Defer emitting to the stream until the next tick, because changing\n // bindings in here will cause \"changed after checked\" errors.\n delay(0)\n );\n\n // When the zone is stable initially, and when the option list changes...\n return merge(firstStable, optionChanges)\n .pipe(\n // create a new stream of panelClosingActions, replacing any previous streams\n // that were created, and flatten it so our stream only emits closing events...\n switchMap(() => {\n const wasOpen = this.panelOpen;\n this._resetActiveItem();\n this.autocomplete._setVisibility();\n\n if (this.panelOpen) {\n this._overlayRef!.updatePosition();\n\n // If the `panelOpen` state changed, we need to make sure to emit the `opened`\n // event, because we may not have emitted it when the panel was attached. This\n // can happen if the users opens the panel and there are no options, but the\n // options come in slightly later or as a result of the value changing.\n if (wasOpen !== this.panelOpen) {\n this.autocomplete.opened.emit();\n }\n }\n\n return this.panelClosingActions;\n }),\n // when the first closing event occurs...\n take(1))\n // set the value, close the panel, and complete.\n .subscribe(event => this._setValueAndClose(event));\n }\n\n /** Destroys the autocomplete suggestion panel. */\n private _destroyPanel(): void {\n if (this._overlayRef) {\n this.closePanel();\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n }\n\n private _setTriggerValue(value: any): void {\n const toDisplay = this.autocomplete && this.autocomplete.displayWith ?\n this.autocomplete.displayWith(value) :\n value;\n\n // Simply falling back to an empty string if the display value is falsy does not work properly.\n // The display value can also be the number zero and shouldn't fall back to an empty string.\n const inputValue = toDisplay != null ? toDisplay : '';\n\n // If it's used within a `MatFormField`, we should set it through the property so it can go\n // through change detection.\n if (this._formField) {\n this._formField._control.value = inputValue;\n } else {\n this._element.nativeElement.value = inputValue;\n }\n\n this._previousValue = inputValue;\n }\n\n /**\n * This method closes the panel, and if a value is specified, also sets the associated\n * control to that value. It will also mark the control as dirty if this interaction\n * stemmed from the user.\n */\n private _setValueAndClose(event: MatOptionSelectionChange | null): void {\n if (event && event.source) {\n this._clearPreviousSelectedOption(event.source);\n this._setTriggerValue(event.source.value);\n this._onChange(event.source.value);\n this._element.nativeElement.focus();\n this.autocomplete._emitSelectEvent(event.source);\n }\n\n this.closePanel();\n }\n\n /**\n * Clear any previous selected option and emit a selection change event for this option\n */\n private _clearPreviousSelectedOption(skip: MatOption) {\n this.autocomplete.options.forEach(option => {\n if (option != skip && option.selected) {\n option.deselect();\n }\n });\n }\n\n private _attachOverlay(): void {\n if (!this.autocomplete) {\n throw getMatAutocompleteMissingPanelError();\n }\n\n let overlayRef = this._overlayRef;\n\n if (!overlayRef) {\n this._portal = new TemplatePortal(this.autocomplete.template, this._viewContainerRef);\n overlayRef = this._overlay.create(this._getOverlayConfig());\n this._overlayRef = overlayRef;\n\n // Use the `keydownEvents` in order to take advantage of\n // the overlay event targeting provided by the CDK overlay.\n overlayRef.keydownEvents().subscribe(event => {\n // Close when pressing ESCAPE or ALT + UP_ARROW, based on the a11y guidelines.\n // See: https://www.w3.org/TR/wai-aria-practices-1.1/#textbox-keyboard-interaction\n if (event.keyCode === ESCAPE || (event.keyCode === UP_ARROW && event.altKey)) {\n this._resetActiveItem();\n this._closeKeyEventStream.next();\n\n // We need to stop propagation, otherwise the event will eventually\n // reach the input itself and cause the overlay to be reopened.\n event.stopPropagation();\n event.preventDefault();\n }\n });\n\n if (this._viewportRuler) {\n this._viewportSubscription = this._viewportRuler.change().subscribe(() => {\n if (this.panelOpen && overlayRef) {\n overlayRef.updateSize({width: this._getPanelWidth()});\n }\n });\n }\n } else {\n // Update the trigger, panel width and direction, in case anything has changed.\n this._positionStrategy.setOrigin(this._getConnectedElement());\n overlayRef.updateSize({width: this._getPanelWidth()});\n }\n\n if (overlayRef && !overlayRef.hasAttached()) {\n overlayRef.attach(this._portal);\n this._closingActionsSubscription = this._subscribeToClosingActions();\n }\n\n const wasOpen = this.panelOpen;\n\n this.autocomplete._setVisibility();\n this.autocomplete._isOpen = this._overlayAttached = true;\n\n // We need to do an extra `panelOpen` check in here, because the\n // autocomplete won't be shown if there are no options.\n if (this.panelOpen && wasOpen !== this.panelOpen) {\n this.autocomplete.opened.emit();\n }\n }\n\n private _getOverlayConfig(): OverlayConfig {\n return new OverlayConfig({\n positionStrategy: this._getOverlayPosition(),\n scrollStrategy: this._scrollStrategy(),\n width: this._getPanelWidth(),\n direction: this._dir\n });\n }\n\n private _getOverlayPosition(): PositionStrategy {\n const strategy = this._overlay.position()\n .flexibleConnectedTo(this._getConnectedElement())\n .withFlexibleDimensions(false)\n .withPush(false);\n\n this._setStrategyPositions(strategy);\n this._positionStrategy = strategy;\n return strategy;\n }\n\n /** Sets the positions on a position strategy based on the directive's input state. */\n private _setStrategyPositions(positionStrategy: FlexibleConnectedPositionStrategy) {\n const belowPosition: ConnectedPosition = {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n };\n const abovePosition: ConnectedPosition = {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n\n // The overlay edge connected to the trigger should have squared corners, while\n // the opposite end has rounded corners. We apply a CSS class to swap the\n // border-radius based on the overlay position.\n panelClass: 'mat-autocomplete-panel-above'\n };\n\n let positions: ConnectedPosition[];\n\n if (this.position === 'above') {\n positions = [abovePosition];\n } else if (this.position === 'below') {\n positions = [belowPosition];\n } else {\n positions = [belowPosition, abovePosition];\n }\n\n positionStrategy.withPositions(positions);\n }\n\n private _getConnectedElement(): ElementRef {\n if (this.connectedTo) {\n return this.connectedTo.elementRef;\n }\n\n return this._formField ? this._formField.getConnectedOverlayOrigin() : this._element;\n }\n\n private _getPanelWidth(): number | string {\n return this.autocomplete.panelWidth || this._getHostWidth();\n }\n\n /** Returns the width of the input element, so the panel width can match it. */\n private _getHostWidth(): number {\n return this._getConnectedElement().nativeElement.getBoundingClientRect().width;\n }\n\n /**\n * Resets the active item to -1 so arrow events will activate the\n * correct options, or to 0 if the consumer opted into it.\n */\n private _resetActiveItem(): void {\n this.autocomplete._keyManager.setActiveItem(this.autocomplete.autoActiveFirstOption ? 0 : -1);\n }\n\n /** Determines whether the panel can be opened. */\n private _canOpen(): boolean {\n const element = this._element.nativeElement;\n return !element.readOnly && !element.disabled && !this._autocompleteDisabled;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * When constructing a Date, the month is zero-based. This can be confusing, since people are\n * used to seeing them one-based. So we create these aliases to make writing the tests easier.\n * @docs-private\n * @breaking-change 8.0.0 Remove this with V8 since it was only targeted for testing.\n */\nexport const JAN = 0, FEB = 1, MAR = 2, APR = 3, MAY = 4, JUN = 5, JUL = 6, AUG = 7, SEP = 8,\n OCT = 9, NOV = 10, DEC = 11;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n DOWN_ARROW,\n END,\n ENTER,\n HOME,\n LEFT_ARROW,\n PAGE_DOWN,\n PAGE_UP,\n RIGHT_ARROW,\n UP_ARROW,\n SPACE,\n} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n Optional,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {DateAdapter} from '@angular/material/core';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {MatCalendarBody, MatCalendarCell} from './calendar-body';\nimport {createMissingDateImplError} from './datepicker-errors';\n\nexport const yearsPerPage = 24;\n\nexport const yearsPerRow = 4;\n\n/**\n * An internal component used to display a year selector in the datepicker.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-multi-year-view',\n templateUrl: 'multi-year-view.html',\n exportAs: 'matMultiYearView',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatMultiYearView<D> implements AfterContentInit {\n /** The date to display in this multi-year view (everything other than the year is ignored). */\n @Input()\n get activeDate(): D { return this._activeDate; }\n set activeDate(value: D) {\n let oldActiveDate = this._activeDate;\n const validDate =\n this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n\n if (!isSameMultiYearView(\n this._dateAdapter, oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {\n this._init();\n }\n }\n private _activeDate: D;\n\n /** The currently selected date. */\n @Input()\n get selected(): D | null { return this._selected; }\n set selected(value: D | null) {\n this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n this._selectedYear = this._selected && this._dateAdapter.getYear(this._selected);\n }\n private _selected: D | null;\n\n /** The minimum selectable date. */\n @Input()\n get minDate(): D | null { return this._minDate; }\n set minDate(value: D | null) {\n this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _minDate: D | null;\n\n /** The maximum selectable date. */\n @Input()\n get maxDate(): D | null { return this._maxDate; }\n set maxDate(value: D | null) {\n this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _maxDate: D | null;\n\n /** A function used to filter which dates are selectable. */\n @Input() dateFilter: (date: D) => boolean;\n\n /** Emits when a new year is selected. */\n @Output() readonly selectedChange: EventEmitter<D> = new EventEmitter<D>();\n\n /** Emits the selected year. This doesn't imply a change on the selected date */\n @Output() readonly yearSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /** Emits when any date is activated. */\n @Output() readonly activeDateChange: EventEmitter<D> = new EventEmitter<D>();\n\n /** The body of calendar table */\n @ViewChild(MatCalendarBody, {static: false}) _matCalendarBody: MatCalendarBody;\n\n /** Grid of calendar cells representing the currently displayed years. */\n _years: MatCalendarCell[][];\n\n /** The year that today falls on. */\n _todayYear: number;\n\n /** The year of the selected date. Null if the selected date is null. */\n _selectedYear: number | null;\n\n constructor(private _changeDetectorRef: ChangeDetectorRef,\n @Optional() public _dateAdapter: DateAdapter<D>,\n @Optional() private _dir?: Directionality) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n\n this._activeDate = this._dateAdapter.today();\n }\n\n ngAfterContentInit() {\n this._init();\n }\n\n /** Initializes this multi-year view. */\n _init() {\n this._todayYear = this._dateAdapter.getYear(this._dateAdapter.today());\n\n // We want a range years such that we maximize the number of\n // enabled dates visible at once. This prevents issues where the minimum year\n // is the last item of a page OR the maximum year is the first item of a page.\n\n // The offset from the active year to the \"slot\" for the starting year is the\n // *actual* first rendered year in the multi-year view.\n const activeYear = this._dateAdapter.getYear(this._activeDate);\n const minYearOfPage = activeYear - getActiveOffset(\n this._dateAdapter, this.activeDate, this.minDate, this.maxDate);\n\n this._years = [];\n for (let i = 0, row: number[] = []; i < yearsPerPage; i++) {\n row.push(minYearOfPage + i);\n if (row.length == yearsPerRow) {\n this._years.push(row.map(year => this._createCellForYear(year)));\n row = [];\n }\n }\n this._changeDetectorRef.markForCheck();\n }\n\n /** Handles when a new year is selected. */\n _yearSelected(year: number) {\n this.yearSelected.emit(this._dateAdapter.createDate(year, 0, 1));\n let month = this._dateAdapter.getMonth(this.activeDate);\n let daysInMonth =\n this._dateAdapter.getNumDaysInMonth(this._dateAdapter.createDate(year, month, 1));\n this.selectedChange.emit(this._dateAdapter.createDate(year, month,\n Math.min(this._dateAdapter.getDate(this.activeDate), daysInMonth)));\n }\n\n /** Handles keydown events on the calendar body when calendar is in multi-year view. */\n _handleCalendarBodyKeydown(event: KeyboardEvent): void {\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, -yearsPerRow);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, yearsPerRow);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate,\n -getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate,\n yearsPerPage - getActiveOffset(\n this._dateAdapter, this.activeDate, this.minDate, this.maxDate) - 1);\n break;\n case PAGE_UP:\n this.activeDate =\n this._dateAdapter.addCalendarYears(\n this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);\n break;\n case PAGE_DOWN:\n this.activeDate =\n this._dateAdapter.addCalendarYears(\n this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);\n break;\n case ENTER:\n case SPACE:\n this._yearSelected(this._dateAdapter.getYear(this._activeDate));\n break;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n\n this._focusActiveCell();\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n\n _getActiveCell(): number {\n return getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate);\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._matCalendarBody._focusActiveCell();\n }\n\n /** Creates an MatCalendarCell for the given year. */\n private _createCellForYear(year: number) {\n let yearName = this._dateAdapter.getYearName(this._dateAdapter.createDate(year, 0, 1));\n return new MatCalendarCell(year, yearName, yearName, this._shouldEnableYear(year));\n }\n\n /** Whether the given year is enabled. */\n private _shouldEnableYear(year: number) {\n // disable if the year is greater than maxDate lower than minDate\n if (year === undefined || year === null ||\n (this.maxDate && year > this._dateAdapter.getYear(this.maxDate)) ||\n (this.minDate && year < this._dateAdapter.getYear(this.minDate))) {\n return false;\n }\n\n // enable if it reaches here and there's no filter defined\n if (!this.dateFilter) {\n return true;\n }\n\n const firstOfYear = this._dateAdapter.createDate(year, 0, 1);\n\n // If any date in the year is enabled count the year as enabled.\n for (let date = firstOfYear; this._dateAdapter.getYear(date) == year;\n date = this._dateAdapter.addCalendarDays(date, 1)) {\n if (this.dateFilter(date)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n\n /** Determines whether the user has the RTL layout direction. */\n private _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n}\n\nexport function isSameMultiYearView<D>(\n dateAdapter: DateAdapter<D>, date1: D, date2: D, minDate: D | null, maxDate: D | null): boolean {\n const year1 = dateAdapter.getYear(date1);\n const year2 = dateAdapter.getYear(date2);\n const startingYear = getStartingYear(dateAdapter, minDate, maxDate);\n return Math.floor((year1 - startingYear) / yearsPerPage) ===\n Math.floor((year2 - startingYear) / yearsPerPage);\n}\n\n/**\n * When the multi-year view is first opened, the active year will be in view.\n * So we compute how many years are between the active year and the *slot* where our\n * \"startingYear\" will render when paged into view.\n */\nexport function getActiveOffset<D>(\n dateAdapter: DateAdapter<D>, activeDate: D, minDate: D | null, maxDate: D | null): number {\n const activeYear = dateAdapter.getYear(activeDate);\n return euclideanModulo((activeYear - getStartingYear(dateAdapter, minDate, maxDate)),\n yearsPerPage);\n}\n\n/**\n * We pick a \"starting\" year such that either the maximum year would be at the end\n * or the minimum year would be at the beginning of a page.\n */\nfunction getStartingYear<D>(\n dateAdapter: DateAdapter<D>, minDate: D | null, maxDate: D | null): number {\n let startingYear = 0;\n if (maxDate) {\n const maxYear = dateAdapter.getYear(maxDate);\n startingYear = maxYear - yearsPerPage + 1;\n } else if (minDate) {\n startingYear = dateAdapter.getYear(minDate);\n }\n return startingYear;\n}\n\n/** Gets remainder that is non-negative, even if first number is negative */\nfunction euclideanModulo (a: number, b: number): number {\n return (a % b + b) % b;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n animateChild,\n group,\n state,\n style,\n transition,\n trigger,\n query,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/** Time and timing curve for expansion panel animations. */\nexport const EXPANSION_PANEL_ANIMATION_TIMING = '225ms cubic-bezier(0.4,0.0,0.2,1)';\n\n/**\n * Animations used by the Material expansion panel.\n *\n * A bug in angular animation's `state` when ViewContainers are moved using ViewContainerRef.move()\n * causes the animation state of moved components to become `void` upon exit, and not update again\n * upon reentry into the DOM. This can lead a to situation for the expansion panel where the state\n * of the panel is `expanded` or `collapsed` but the animation state is `void`.\n *\n * To correctly handle animating to the next state, we animate between `void` and `collapsed` which\n * are defined to have the same styles. Since angular animates from the current styles to the\n * destination state's style definition, in situations where we are moving from `void`'s styles to\n * `collapsed` this acts a noop since no style values change.\n *\n * In the case where angular's animation state is out of sync with the expansion panel's state, the\n * expansion panel being `expanded` and angular animations being `void`, the animation from the\n * `expanded`'s effective styles (though in a `void` animation state) to the collapsed state will\n * occur as expected.\n *\n * Angular Bug: https://github.com/angular/angular/issues/18847\n *\n * @docs-private\n */\nexport const matExpansionAnimations: {\n readonly indicatorRotate: AnimationTriggerMetadata;\n readonly expansionHeaderHeight: AnimationTriggerMetadata;\n readonly bodyExpansion: AnimationTriggerMetadata;\n} = {\n /** Animation that rotates the indicator arrow. */\n indicatorRotate: trigger('indicatorRotate', [\n state('collapsed, void', style({transform: 'rotate(0deg)'})),\n state('expanded', style({transform: 'rotate(180deg)'})),\n transition('expanded <=> collapsed, void => collapsed',\n animate(EXPANSION_PANEL_ANIMATION_TIMING)),\n ]),\n\n /** Animation that expands and collapses the panel header height. */\n expansionHeaderHeight: trigger('expansionHeight', [\n state('collapsed, void', style({\n height: '{{collapsedHeight}}',\n }), {\n params: {collapsedHeight: '48px'},\n }),\n state('expanded', style({\n height: '{{expandedHeight}}'\n }), {\n params: {expandedHeight: '64px'}\n }),\n transition('expanded <=> collapsed, void => collapsed', group([\n query('@indicatorRotate', animateChild(), {optional: true}),\n animate(EXPANSION_PANEL_ANIMATION_TIMING),\n ])),\n ]),\n\n /** Animation that expands and collapses the panel content. */\n bodyExpansion: trigger('bodyExpansion', [\n state('collapsed, void', style({height: '0px', visibility: 'hidden'})),\n state('expanded', style({height: '*', visibility: 'visible'})),\n transition('expanded <=> collapsed, void => collapsed',\n animate(EXPANSION_PANEL_ANIMATION_TIMING)),\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ActiveDescendantKeyManager, LiveAnnouncer} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {\n A,\n DOWN_ARROW,\n END,\n ENTER,\n HOME,\n LEFT_ARROW,\n RIGHT_ARROW,\n SPACE,\n UP_ARROW,\n hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {CdkConnectedOverlay, Overlay, ScrollStrategy} from '@angular/cdk/overlay';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n DoCheck,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n isDevMode,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Self,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {ControlValueAccessor, FormGroupDirective, NgControl, NgForm} from '@angular/forms';\nimport {\n _countGroupLabelsBeforeOption,\n _getOptionScrollPosition,\n CanDisable,\n CanDisableCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n CanUpdateErrorState,\n CanUpdateErrorStateCtor,\n ErrorStateMatcher,\n HasTabIndex,\n HasTabIndexCtor,\n MAT_OPTION_PARENT_COMPONENT,\n MatOptgroup,\n MatOption,\n MatOptionSelectionChange,\n mixinDisabled,\n mixinDisableRipple,\n mixinErrorState,\n mixinTabIndex,\n} from '@angular/material/core';\nimport {MatFormField, MatFormFieldControl} from '@angular/material/form-field';\nimport {defer, merge, Observable, Subject} from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n} from 'rxjs/operators';\nimport {matSelectAnimations} from './select-animations';\nimport {\n getMatSelectDynamicMultipleError,\n getMatSelectNonArrayValueError,\n getMatSelectNonFunctionValueError,\n} from './select-errors';\n\n\nlet nextUniqueId = 0;\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\n/** The max height of the select's overlay panel */\nexport const SELECT_PANEL_MAX_HEIGHT = 256;\n\n/** The panel's padding on the x-axis */\nexport const SELECT_PANEL_PADDING_X = 16;\n\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\n\n/** The height of the select items in `em` units. */\nexport const SELECT_ITEM_HEIGHT_EM = 3;\n\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\n/**\n * Distance between the panel edge and the option text in\n * multi-selection mode.\n *\n * Calculated as:\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\n * The checkbox width is 16px.\n */\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\n\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 */\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\n\n/** Injection token that determines the scroll handling while a select is open. */\nexport const MAT_SELECT_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-select-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay):\n () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const MAT_SELECT_SCROLL_STRATEGY_PROVIDER = {\n provide: MAT_SELECT_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n/** Change event object that is emitted when the select value has changed. */\nexport class MatSelectChange {\n constructor(\n /** Reference to the select that emitted the change event. */\n public source: MatSelect,\n /** Current value of the select that emitted the event. */\n public value: any) { }\n}\n\n// Boilerplate for applying mixins to MatSelect.\n/** @docs-private */\nclass MatSelectBase {\n constructor(public _elementRef: ElementRef,\n public _defaultErrorStateMatcher: ErrorStateMatcher,\n public _parentForm: NgForm,\n public _parentFormGroup: FormGroupDirective,\n public ngControl: NgControl) {}\n}\nconst _MatSelectMixinBase:\n CanDisableCtor &\n HasTabIndexCtor &\n CanDisableRippleCtor &\n CanUpdateErrorStateCtor &\n typeof MatSelectBase =\n mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(MatSelectBase))));\n\n\n/**\n * Allows the user to customize the trigger that is displayed when the select has a value.\n */\n@Directive({\n selector: 'mat-select-trigger'\n})\nexport class MatSelectTrigger {}\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-select',\n exportAs: 'matSelect',\n templateUrl: 'select.html',\n styleUrls: ['select.css'],\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'listbox',\n '[attr.id]': 'id',\n '[attr.tabindex]': 'tabIndex',\n '[attr.aria-label]': '_getAriaLabel()',\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\n '[attr.aria-required]': 'required.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\n '[attr.aria-multiselectable]': 'multiple',\n '[attr.aria-describedby]': '_ariaDescribedby || null',\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\n '[class.mat-select-disabled]': 'disabled',\n '[class.mat-select-invalid]': 'errorState',\n '[class.mat-select-required]': 'required',\n '[class.mat-select-empty]': 'empty',\n 'class': 'mat-select',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': '_onFocus()',\n '(blur)': '_onBlur()',\n },\n animations: [\n matSelectAnimations.transformPanelWrap,\n matSelectAnimations.transformPanel\n ],\n providers: [\n {provide: MatFormFieldControl, useExisting: MatSelect},\n {provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatSelect}\n ],\n})\nexport class MatSelect extends _MatSelectMixinBase implements AfterContentInit, OnChanges,\n OnDestroy, OnInit, DoCheck, ControlValueAccessor, CanDisable, HasTabIndex,\n MatFormFieldControl<any>, CanUpdateErrorState, CanDisableRipple {\n private _scrollStrategyFactory: () => ScrollStrategy;\n\n /** Whether or not the overlay panel is open. */\n private _panelOpen = false;\n\n /** Whether filling out the select is required in the form. */\n private _required: boolean = false;\n\n /** The scroll position of the overlay panel, calculated to center the selected option. */\n private _scrollTop = 0;\n\n /** The placeholder displayed in the trigger of the select. */\n private _placeholder: string;\n\n /** Whether the component is in multiple selection mode. */\n private _multiple: boolean = false;\n\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\n private _compareWith = (o1: any, o2: any) => o1 === o2;\n\n /** Unique id for this input. */\n private _uid = `mat-select-${nextUniqueId++}`;\n\n /** Emits whenever the component is destroyed. */\n private readonly _destroy = new Subject<void>();\n\n /** The last measured value for the trigger's client bounding rect. */\n _triggerRect: ClientRect;\n\n /** The aria-describedby attribute on the select for improved a11y. */\n _ariaDescribedby: string;\n\n /** The cached font-size of the trigger element. */\n _triggerFontSize = 0;\n\n /** Deals with the selection logic. */\n _selectionModel: SelectionModel<MatOption>;\n\n /** Manages keyboard events for options in the panel. */\n _keyManager: ActiveDescendantKeyManager<MatOption>;\n\n /** `View -> model callback called when value changes` */\n _onChange: (value: any) => void = () => {};\n\n /** `View -> model callback called when select has been touched` */\n _onTouched = () => {};\n\n /** The IDs of child options to be passed to the aria-owns attribute. */\n _optionIds: string = '';\n\n /** The value of the select panel's transform-origin property. */\n _transformOrigin: string = 'top';\n\n /** Emits when the panel element is finished transforming in. */\n _panelDoneAnimatingStream = new Subject<string>();\n\n /** Strategy that will be used to handle scrolling while the select panel is open. */\n _scrollStrategy: ScrollStrategy;\n\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 _offsetY = 0;\n\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 _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\n /** Whether the component is disabling centering of the active option over the trigger. */\n private _disableOptionCentering: boolean = false;\n\n /** Whether the select is focused. */\n get focused(): boolean {\n return this._focused || this._panelOpen;\n }\n /**\n * @deprecated Setter to be removed as this property is intended to be readonly.\n * @breaking-change 8.0.0\n */\n set focused(value: boolean) {\n this._focused = value;\n }\n private _focused = false;\n\n /** A name for this control that can be used by `mat-form-field`. */\n controlType = 'mat-select';\n\n /** Trigger that opens the select. */\n @ViewChild('trigger', {static: false}) trigger: ElementRef;\n\n /** Panel containing the select options. */\n @ViewChild('panel', {static: false}) panel: ElementRef;\n\n /** Overlay pane containing the options. */\n @ViewChild(CdkConnectedOverlay, {static: false}) overlayDir: CdkConnectedOverlay;\n\n /** All of the defined select options. */\n @ContentChildren(MatOption, { descendants: true }) options: QueryList<MatOption>;\n\n /** All of the defined groups of options. */\n @ContentChildren(MatOptgroup) optionGroups: QueryList<MatOptgroup>;\n\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string|string[]|Set<string>|{[key: string]: any};\n\n /** User-supplied override of the trigger element. */\n @ContentChild(MatSelectTrigger, {static: false}) customTrigger: MatSelectTrigger;\n\n /** Placeholder to be shown if no value has been selected. */\n @Input()\n get placeholder(): string { return this._placeholder; }\n set placeholder(value: string) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n\n /** Whether the component is required. */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n\n /** Whether the user should be allowed to select multiple options. */\n @Input()\n get multiple(): boolean { return this._multiple; }\n set multiple(value: boolean) {\n if (this._selectionModel) {\n throw getMatSelectDynamicMultipleError();\n }\n\n this._multiple = coerceBooleanProperty(value);\n }\n\n /** Whether to center the active option over the trigger. */\n @Input()\n get disableOptionCentering(): boolean { return this._disableOptionCentering; }\n set disableOptionCentering(value: boolean) {\n this._disableOptionCentering = coerceBooleanProperty(value);\n }\n\n /**\n * Function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n @Input()\n get compareWith() { return this._compareWith; }\n set compareWith(fn: (o1: any, o2: any) => boolean) {\n if (typeof fn !== 'function') {\n throw getMatSelectNonFunctionValueError();\n }\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n\n /** Value of the select control. */\n @Input()\n get value(): any { return this._value; }\n set value(newValue: any) {\n if (newValue !== this._value) {\n this.writeValue(newValue);\n this._value = newValue;\n }\n }\n private _value: any;\n\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\n @Input('aria-label') ariaLabel: string = '';\n\n /** Input that can be used to specify the `aria-labelledby` attribute. */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** Object used to control when error messages are shown. */\n @Input() errorStateMatcher: ErrorStateMatcher;\n\n /**\n * Function used to sort the values in a select in multiple mode.\n * Follows the same logic as `Array.prototype.sort`.\n */\n @Input() sortComparator: (a: MatOption, b: MatOption, options: MatOption[]) => number;\n\n /** Unique id of the element. */\n @Input()\n get id(): string { return this._id; }\n set id(value: string) {\n this._id = value || this._uid;\n this.stateChanges.next();\n }\n private _id: string;\n\n /** Combined stream of all of the child options' change events. */\n readonly optionSelectionChanges: Observable<MatOptionSelectionChange> = defer(() => {\n const options = this.options;\n\n if (options) {\n return options.changes.pipe(\n startWith(options),\n switchMap(() => merge(...options.map(option => option.onSelectionChange)))\n );\n }\n\n return this._ngZone.onStable\n .asObservable()\n .pipe(take(1), switchMap(() => this.optionSelectionChanges));\n }) as Observable<MatOptionSelectionChange>;\n\n /** Event emitted when the select panel has been toggled. */\n @Output() readonly openedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted when the select has been opened. */\n @Output('opened') readonly _openedStream: Observable<void> =\n this.openedChange.pipe(filter(o => o), map(() => {}));\n\n /** Event emitted when the select has been closed. */\n @Output('closed') readonly _closedStream: Observable<void> =\n this.openedChange.pipe(filter(o => !o), map(() => {}));\n\n /** Event emitted when the selected value has been changed by the user. */\n @Output() readonly selectionChange: EventEmitter<MatSelectChange> =\n new EventEmitter<MatSelectChange>();\n\n /**\n * Event that emits whenever the raw value of the select changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n @Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();\n\n constructor(\n private _viewportRuler: ViewportRuler,\n private _changeDetectorRef: ChangeDetectorRef,\n private _ngZone: NgZone,\n _defaultErrorStateMatcher: ErrorStateMatcher,\n elementRef: ElementRef,\n @Optional() private _dir: Directionality,\n @Optional() _parentForm: NgForm,\n @Optional() _parentFormGroup: FormGroupDirective,\n @Optional() private _parentFormField: MatFormField,\n @Self() @Optional() public ngControl: NgControl,\n @Attribute('tabindex') tabIndex: string,\n @Inject(MAT_SELECT_SCROLL_STRATEGY) scrollStrategyFactory: any,\n /**\n * @deprecated _liveAnnouncer to be turned into a required parameter.\n * @breaking-change 8.0.0\n */\n private _liveAnnouncer?: LiveAnnouncer) {\n super(elementRef, _defaultErrorStateMatcher, _parentForm,\n _parentFormGroup, ngControl);\n\n if (this.ngControl) {\n // Note: we provide the value accessor through here, instead of\n // the `providers` to avoid running into a circular import.\n this.ngControl.valueAccessor = this;\n }\n\n this._scrollStrategyFactory = scrollStrategyFactory;\n this._scrollStrategy = this._scrollStrategyFactory();\n this.tabIndex = parseInt(tabIndex) || 0;\n\n // Force setter to be called in case id was not specified.\n this.id = this.id;\n }\n\n ngOnInit() {\n this._selectionModel = new SelectionModel<MatOption>(this.multiple);\n this.stateChanges.next();\n\n // We need `distinctUntilChanged` here, because some browsers will\n // fire the animation end event twice for the same animation. See:\n // https://github.com/angular/angular/issues/24084\n this._panelDoneAnimatingStream\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\n .subscribe(() => {\n if (this.panelOpen) {\n this._scrollTop = 0;\n this.openedChange.emit(true);\n } else {\n this.openedChange.emit(false);\n this.overlayDir.offsetX = 0;\n this._changeDetectorRef.markForCheck();\n }\n });\n\n this._viewportRuler.change()\n .pipe(takeUntil(this._destroy))\n .subscribe(() => {\n if (this._panelOpen) {\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n this._changeDetectorRef.markForCheck();\n }\n });\n }\n\n ngAfterContentInit() {\n this._initKeyManager();\n\n this._selectionModel.onChange.pipe(takeUntil(this._destroy)).subscribe(event => {\n event.added.forEach(option => option.select());\n event.removed.forEach(option => option.deselect());\n });\n\n this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {\n this._resetOptions();\n this._initializeSelection();\n });\n }\n\n ngDoCheck() {\n if (this.ngControl) {\n this.updateErrorState();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\n // the parent form field know to run change detection when the disabled state changes.\n if (changes['disabled']) {\n this.stateChanges.next();\n }\n }\n\n ngOnDestroy() {\n this._destroy.next();\n this._destroy.complete();\n this.stateChanges.complete();\n }\n\n /** Toggles the overlay panel open or closed. */\n toggle(): void {\n this.panelOpen ? this.close() : this.open();\n }\n\n /** Opens the overlay panel. */\n open(): void {\n if (this.disabled || !this.options || !this.options.length || this._panelOpen) {\n return;\n }\n\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n // Note: The computed font-size will be a string pixel value (e.g. \"16px\").\n // `parseInt` ignores the trailing 'px' and converts this to a number.\n this._triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement).fontSize || '0');\n\n this._panelOpen = true;\n this._keyManager.withHorizontalOrientation(null);\n this._calculateOverlayPosition();\n this._highlightCorrectOption();\n this._changeDetectorRef.markForCheck();\n\n // Set the font size on the panel element once it exists.\n this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n if (this._triggerFontSize && this.overlayDir.overlayRef &&\n this.overlayDir.overlayRef.overlayElement) {\n this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;\n }\n });\n }\n\n /** Closes the overlay panel and focuses the host element. */\n close(): void {\n if (this._panelOpen) {\n this._panelOpen = false;\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\n this._changeDetectorRef.markForCheck();\n this._onTouched();\n }\n }\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 writeValue(value: any): void {\n if (this.options) {\n this._setSelectionByValue(value);\n }\n }\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 registerOnChange(fn: (value: any) => void): void {\n this._onChange = fn;\n }\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 registerOnTouched(fn: () => {}): void {\n this._onTouched = fn;\n }\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 setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n\n /** Whether or not the overlay panel is open. */\n get panelOpen(): boolean {\n return this._panelOpen;\n }\n\n /** The currently selected option. */\n get selected(): MatOption | MatOption[] {\n return this.multiple ? this._selectionModel.selected : this._selectionModel.selected[0];\n }\n\n /** The value displayed in the trigger. */\n get triggerValue(): string {\n if (this.empty) {\n return '';\n }\n\n if (this._multiple) {\n const selectedOptions = this._selectionModel.selected.map(option => option.viewValue);\n\n if (this._isRtl()) {\n selectedOptions.reverse();\n }\n\n // TODO(crisbeto): delimiter should be configurable for proper localization.\n return selectedOptions.join(', ');\n }\n\n return this._selectionModel.selected[0].viewValue;\n }\n\n /** Whether the element is in RTL mode. */\n _isRtl(): boolean {\n return this._dir ? this._dir.value === 'rtl' : false;\n }\n\n /** Handles all keydown events on the select. */\n _handleKeydown(event: KeyboardEvent): void {\n if (!this.disabled) {\n this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n }\n }\n\n /** Handles keyboard events while the select is closed. */\n private _handleClosedKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW ||\n keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\n const manager = this._keyManager;\n\n // Open the select on ALT + arrow key to match the native <select>\n if ((isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {\n event.preventDefault(); // prevents the page from scrolling down when pressing space\n this.open();\n } else if (!this.multiple) {\n const previouslySelectedOption = this.selected;\n\n if (keyCode === HOME || keyCode === END) {\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n event.preventDefault();\n } else {\n manager.onKeydown(event);\n }\n\n const selectedOption = this.selected;\n\n // Since the value has changed, we need to announce it ourselves.\n // @breaking-change 8.0.0 remove null check for _liveAnnouncer.\n if (this._liveAnnouncer && selectedOption && previouslySelectedOption !== selectedOption) {\n // We set a duration on the live announcement, because we want the live element to be\n // cleared after a while so that users can't navigate to it using the arrow keys.\n this._liveAnnouncer.announce((selectedOption as MatOption).viewValue, 10000);\n }\n }\n }\n\n /** Handles keyboard events when the selected is open. */\n private _handleOpenKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;\n const manager = this._keyManager;\n\n if (keyCode === HOME || keyCode === END) {\n event.preventDefault();\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n } else if (isArrowKey && event.altKey) {\n // Close the select on ALT + arrow key to match the native <select>\n event.preventDefault();\n this.close();\n } else if ((keyCode === ENTER || keyCode === SPACE) && manager.activeItem &&\n !hasModifierKey(event)) {\n event.preventDefault();\n manager.activeItem._selectViaInteraction();\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\n event.preventDefault();\n const hasDeselectedOptions = this.options.some(opt => !opt.disabled && !opt.selected);\n\n this.options.forEach(option => {\n if (!option.disabled) {\n hasDeselectedOptions ? option.select() : option.deselect();\n }\n });\n } else {\n const previouslyFocusedIndex = manager.activeItemIndex;\n\n manager.onKeydown(event);\n\n if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem &&\n manager.activeItemIndex !== previouslyFocusedIndex) {\n manager.activeItem._selectViaInteraction();\n }\n }\n }\n\n _onFocus() {\n if (!this.disabled) {\n this._focused = true;\n this.stateChanges.next();\n }\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 _onBlur() {\n this._focused = false;\n\n if (!this.disabled && !this.panelOpen) {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n }\n\n /**\n * Callback that is invoked when the overlay panel has been attached.\n */\n _onAttached(): void {\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\n this._setPseudoCheckboxPaddingSize();\n this._changeDetectorRef.detectChanges();\n this._calculateOverlayOffsetX();\n this.panel.nativeElement.scrollTop = this._scrollTop;\n });\n }\n\n /** Returns the theme to be used on the panel. */\n _getPanelTheme(): string {\n return this._parentFormField ? `mat-${this._parentFormField.color}` : '';\n }\n\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\n private _setPseudoCheckboxPaddingSize() {\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\n const pseudoCheckbox = this.panel.nativeElement.querySelector('.mat-pseudo-checkbox');\n if (pseudoCheckbox) {\n SELECT_MULTIPLE_PANEL_PADDING_X = SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\n }\n }\n }\n\n /** Whether the select has a value. */\n get empty(): boolean {\n return !this._selectionModel || this._selectionModel.isEmpty();\n }\n\n private _initializeSelection(): void {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value);\n this.stateChanges.next();\n });\n }\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 private _setSelectionByValue(value: any | any[]): void {\n if (this.multiple && value) {\n if (!Array.isArray(value)) {\n throw getMatSelectNonArrayValueError();\n }\n\n this._selectionModel.clear();\n value.forEach((currentValue: any) => this._selectValue(currentValue));\n this._sortValues();\n } else {\n this._selectionModel.clear();\n const correspondingOption = this._selectValue(value);\n\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what option the user interacted with last.\n if (correspondingOption) {\n this._keyManager.setActiveItem(correspondingOption);\n }\n }\n\n this._changeDetectorRef.markForCheck();\n }\n\n /**\n * Finds and selects and option based on its value.\n * @returns Option that has the corresponding value.\n */\n private _selectValue(value: any): MatOption | undefined {\n const correspondingOption = this.options.find((option: MatOption) => {\n try {\n // Treat null as a special reset value.\n return option.value != null && this._compareWith(option.value, value);\n } catch (error) {\n if (isDevMode()) {\n // Notify developers of errors in their comparator.\n console.warn(error);\n }\n return false;\n }\n });\n\n if (correspondingOption) {\n this._selectionModel.select(correspondingOption);\n }\n\n return correspondingOption;\n }\n\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n private _initKeyManager() {\n this._keyManager = new ActiveDescendantKeyManager<MatOption>(this.options)\n .withTypeAhead()\n .withVerticalOrientation()\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\n .withAllowedModifierKeys(['shiftKey']);\n\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\n // Restore focus to the trigger before closing. Ensures that the focus\n // position won't be lost if the user got focus into the overlay.\n this.focus();\n this.close();\n });\n\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\n if (this._panelOpen && this.panel) {\n this._scrollActiveOptionIntoView();\n } else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {\n this._keyManager.activeItem._selectViaInteraction();\n }\n });\n }\n\n /** Drops current option subscriptions and IDs and resets from scratch. */\n private _resetOptions(): void {\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\n\n this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe(event => {\n this._onSelect(event.source, event.isUserInput);\n\n if (event.isUserInput && !this.multiple && this._panelOpen) {\n this.close();\n this.focus();\n }\n });\n\n // Listen to changes in the internal state of the options and react accordingly.\n // Handles cases like the labels of the selected options changing.\n merge(...this.options.map(option => option._stateChanges))\n .pipe(takeUntil(changedOrDestroyed))\n .subscribe(() => {\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n });\n\n this._setOptionIds();\n }\n\n /** Invoked when an option is clicked. */\n private _onSelect(option: MatOption, isUserInput: boolean): void {\n const wasSelected = this._selectionModel.isSelected(option);\n\n if (option.value == null && !this._multiple) {\n option.deselect();\n this._selectionModel.clear();\n this._propagateChanges(option.value);\n } else {\n option.selected ? this._selectionModel.select(option) : this._selectionModel.deselect(option);\n\n if (isUserInput) {\n this._keyManager.setActiveItem(option);\n }\n\n if (this.multiple) {\n this._sortValues();\n\n if (isUserInput) {\n // In case the user selected the option with their mouse, we\n // want to restore focus back to the trigger, in order to\n // prevent the select keyboard controls from clashing with\n // the ones from `mat-option`.\n this.focus();\n }\n }\n }\n\n if (wasSelected !== this._selectionModel.isSelected(option)) {\n this._propagateChanges();\n }\n\n this.stateChanges.next();\n }\n\n /** Sorts the selected values in the selected based on their order in the panel. */\n private _sortValues() {\n if (this.multiple) {\n const options = this.options.toArray();\n\n this._selectionModel.sort((a, b) => {\n return this.sortComparator ? this.sortComparator(a, b, options) :\n options.indexOf(a) - options.indexOf(b);\n });\n this.stateChanges.next();\n }\n }\n\n /** Emits change event to set the model value. */\n private _propagateChanges(fallbackValue?: any): void {\n let valueToEmit: any = null;\n\n if (this.multiple) {\n valueToEmit = (this.selected as MatOption[]).map(option => option.value);\n } else {\n valueToEmit = this.selected ? (this.selected as MatOption).value : fallbackValue;\n }\n\n this._value = valueToEmit;\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this.selectionChange.emit(new MatSelectChange(this, valueToEmit));\n this._changeDetectorRef.markForCheck();\n }\n\n /** Records option IDs to pass to the aria-owns property. */\n private _setOptionIds() {\n this._optionIds = this.options.map(option => option.id).join(' ');\n }\n\n /**\n * Highlights the selected item. If no option is selected, it will highlight\n * the first item instead.\n */\n private _highlightCorrectOption(): void {\n if (this._keyManager) {\n if (this.empty) {\n this._keyManager.setFirstItemActive();\n } else {\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\n }\n }\n }\n\n /** Scrolls the active option into view. */\n private _scrollActiveOptionIntoView(): void {\n const activeOptionIndex = this._keyManager.activeItemIndex || 0;\n const labelCount = _countGroupLabelsBeforeOption(activeOptionIndex, this.options,\n this.optionGroups);\n\n this.panel.nativeElement.scrollTop = _getOptionScrollPosition(\n activeOptionIndex + labelCount,\n this._getItemHeight(),\n this.panel.nativeElement.scrollTop,\n SELECT_PANEL_MAX_HEIGHT\n );\n }\n\n /** Focuses the select element. */\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n\n /** Gets the index of the provided option in the option list. */\n private _getOptionIndex(option: MatOption): number | undefined {\n return this.options.reduce((result: number | undefined, current: MatOption, index: number) => {\n return result === undefined ? (option === current ? index : undefined) : result;\n }, undefined);\n }\n\n /** Calculates the scroll position and x- and y-offsets of the overlay panel. */\n private _calculateOverlayPosition(): void {\n const itemHeight = this._getItemHeight();\n const items = this._getItemCount();\n const panelHeight = Math.min(items * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const scrollContainerHeight = items * itemHeight;\n\n // The farthest the panel can be scrolled before it hits the bottom\n const maxScroll = scrollContainerHeight - panelHeight;\n\n // If no value is selected we open the popup to the first item.\n let selectedOptionOffset =\n this.empty ? 0 : this._getOptionIndex(this._selectionModel.selected[0])!;\n\n selectedOptionOffset += _countGroupLabelsBeforeOption(selectedOptionOffset, this.options,\n this.optionGroups);\n\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 const scrollBuffer = panelHeight / 2;\n this._scrollTop = this._calculateOverlayScroll(selectedOptionOffset, scrollBuffer, maxScroll);\n this._offsetY = this._calculateOverlayOffsetY(selectedOptionOffset, scrollBuffer, maxScroll);\n\n this._checkOverlayWithinViewport(maxScroll);\n }\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 _calculateOverlayScroll(selectedIndex: number, scrollBuffer: number,\n maxScroll: number): number {\n const itemHeight = this._getItemHeight();\n const optionOffsetFromScrollTop = itemHeight * selectedIndex;\n const halfOptionHeight = itemHeight / 2;\n\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 const optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;\n return Math.min(Math.max(0, optimalScrollPosition), maxScroll);\n }\n\n /** Returns the aria-label of the select component. */\n _getAriaLabel(): string | null {\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\n }\n\n /** Returns the aria-labelledby of the select component. */\n _getAriaLabelledby(): string | null {\n if (this.ariaLabelledby) {\n return this.ariaLabelledby;\n }\n\n // Note: we use `_getAriaLabel` here, because we want to check whether there's a\n // computed label. `this.ariaLabel` is only the user-specified label.\n if (!this._parentFormField || !this._parentFormField._hasFloatingLabel() ||\n this._getAriaLabel()) {\n return null;\n }\n\n return this._parentFormField._labelId || null;\n }\n\n /** Determines the `aria-activedescendant` to be set on the host. */\n _getAriaActiveDescendant(): string | null {\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\n return this._keyManager.activeItem.id;\n }\n\n return null;\n }\n\n /**\n * Sets 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. Note that the offset\n * can't be calculated until the panel has been attached, because we need to know the\n * content width in order to constrain the panel within the viewport.\n */\n private _calculateOverlayOffsetX(): void {\n const overlayRect = this.overlayDir.overlayRef.overlayElement.getBoundingClientRect();\n const viewportSize = this._viewportRuler.getViewportSize();\n const isRtl = this._isRtl();\n const paddingWidth = this.multiple ? SELECT_MULTIPLE_PANEL_PADDING_X + SELECT_PANEL_PADDING_X :\n SELECT_PANEL_PADDING_X * 2;\n let offsetX: number;\n\n // Adjust the offset, depending on the option padding.\n if (this.multiple) {\n offsetX = SELECT_MULTIPLE_PANEL_PADDING_X;\n } else {\n let selected = this._selectionModel.selected[0] || this.options.first;\n offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;\n }\n\n // Invert the offset in LTR.\n if (!isRtl) {\n offsetX *= -1;\n }\n\n // Determine how much the select overflows on each side.\n const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));\n const rightOverflow = overlayRect.right + offsetX - viewportSize.width\n + (isRtl ? 0 : paddingWidth);\n\n // If the element overflows on either side, reduce the offset to allow it to fit.\n if (leftOverflow > 0) {\n offsetX += leftOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n } else if (rightOverflow > 0) {\n offsetX -= rightOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n }\n\n // Set the offset directly in order to avoid having to go through change detection and\n // potentially triggering \"changed after it was checked\" errors. Round the value to avoid\n // blurry content in some browsers.\n this.overlayDir.offsetX = Math.round(offsetX);\n this.overlayDir.overlayRef.updatePosition();\n }\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 private _calculateOverlayOffsetY(selectedIndex: number, scrollBuffer: number,\n maxScroll: number): number {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const maxOptionsDisplayed = Math.floor(SELECT_PANEL_MAX_HEIGHT / itemHeight);\n let optionOffsetFromPanelTop: number;\n\n // Disable offset if requested by user by returning 0 as value to offset\n if (this._disableOptionCentering) {\n return 0;\n }\n\n if (this._scrollTop === 0) {\n optionOffsetFromPanelTop = selectedIndex * itemHeight;\n } else if (this._scrollTop === maxScroll) {\n const firstDisplayedIndex = this._getItemCount() - maxOptionsDisplayed;\n const selectedDisplayIndex = selectedIndex - firstDisplayedIndex;\n\n // The first item is partially out of the viewport. Therefore we need to calculate what\n // portion of it is shown in the viewport and account for it in our offset.\n let partialItemHeight =\n itemHeight - (this._getItemCount() * itemHeight - SELECT_PANEL_MAX_HEIGHT) % itemHeight;\n\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 = selectedDisplayIndex * itemHeight + partialItemHeight;\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 - itemHeight / 2;\n }\n\n // The final offset is the option's offset from the top, adjusted for the height difference,\n // multiplied by -1 to ensure that the overlay moves in the correct direction up the page.\n // The value is rounded to prevent some browsers from blurring the content.\n return Math.round(optionOffsetFromPanelTop * -1 - optionHeightAdjustment);\n }\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 private _checkOverlayWithinViewport(maxScroll: number): void {\n const itemHeight = this._getItemHeight();\n const viewportSize = this._viewportRuler.getViewportSize();\n\n const topSpaceAvailable = this._triggerRect.top - SELECT_PANEL_VIEWPORT_PADDING;\n const bottomSpaceAvailable =\n viewportSize.height - this._triggerRect.bottom - SELECT_PANEL_VIEWPORT_PADDING;\n\n const panelHeightTop = Math.abs(this._offsetY);\n const totalPanelHeight =\n Math.min(this._getItemCount() * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const panelHeightBottom = totalPanelHeight - panelHeightTop - this._triggerRect.height;\n\n if (panelHeightBottom > bottomSpaceAvailable) {\n this._adjustPanelUp(panelHeightBottom, bottomSpaceAvailable);\n } else if (panelHeightTop > topSpaceAvailable) {\n this._adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll);\n } else {\n this._transformOrigin = this._getOriginBasedOnOption();\n }\n }\n\n /** Adjusts the overlay panel up to fit in the viewport. */\n private _adjustPanelUp(panelHeightBottom: number, bottomSpaceAvailable: number) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceBelowViewport = Math.round(panelHeightBottom - bottomSpaceAvailable);\n\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\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\n /** Adjusts the overlay panel down to fit in the viewport. */\n private _adjustPanelDown(panelHeightTop: number, topSpaceAvailable: number,\n maxScroll: number) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceAboveViewport = Math.round(panelHeightTop - topSpaceAvailable);\n\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\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\n /** Sets the transform origin point based on the selected option. */\n private _getOriginBasedOnOption(): string {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const originY = Math.abs(this._offsetY) - optionHeightAdjustment + itemHeight / 2;\n return `50% ${originY}px 0px`;\n }\n\n /** Calculates the amount of items in the select. This includes options and group labels. */\n private _getItemCount(): number {\n return this.options.length + this.optionGroups.length;\n }\n\n /** Calculates the height of the select's options. */\n private _getItemHeight(): number {\n return this._triggerFontSize * SELECT_ITEM_HEIGHT_EM;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids: string[]) {\n this._ariaDescribedby = ids.join(' ');\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick() {\n this.focus();\n this.open();\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat(): boolean {\n return this._panelOpen || !this.empty;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {AnimationEvent} from '@angular/animations';\nimport {AriaDescriber, FocusMonitor} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {BreakpointObserver, Breakpoints, BreakpointState} from '@angular/cdk/layout';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n OriginConnectionPosition,\n Overlay,\n OverlayConnectionPosition,\n OverlayRef,\n ScrollStrategy,\n VerticalConnectionPos,\n} from '@angular/cdk/overlay';\nimport {Platform} from '@angular/cdk/platform';\nimport {ComponentPortal} from '@angular/cdk/portal';\nimport {ScrollDispatcher} from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Optional,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport {HAMMER_LOADER, HammerLoader} from '@angular/platform-browser';\nimport {Observable, Subject} from 'rxjs';\nimport {take, takeUntil} from 'rxjs/operators';\n\nimport {matTooltipAnimations} from './tooltip-animations';\n\n\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below' | 'before' | 'after';\n\n/** Time in ms to throttle repositioning after scroll events. */\nexport const SCROLL_THROTTLE_MS = 20;\n\n/** CSS class that will be attached to the overlay panel. */\nexport const TOOLTIP_PANEL_CLASS = 'mat-tooltip-panel';\n\n/**\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\n * @docs-private\n */\nexport function getMatTooltipInvalidPositionError(position: string) {\n return Error(`Tooltip position \"${position}\" is invalid.`);\n}\n\n/** Injection token that determines the scroll handling while a tooltip is visible. */\nexport const MAT_TOOLTIP_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-tooltip-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition({scrollThrottle: SCROLL_THROTTLE_MS});\n}\n\n/** @docs-private */\nexport const MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default `matTooltip` options that can be overridden. */\nexport interface MatTooltipDefaultOptions {\n showDelay: number;\n hideDelay: number;\n touchendHideDelay: number;\n position?: TooltipPosition;\n}\n\n/** Injection token to be used to override the default options for `matTooltip`. */\nexport const MAT_TOOLTIP_DEFAULT_OPTIONS =\n new InjectionToken<MatTooltipDefaultOptions>('mat-tooltip-default-options', {\n providedIn: 'root',\n factory: MAT_TOOLTIP_DEFAULT_OPTIONS_FACTORY\n });\n\n/** @docs-private */\nexport function MAT_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): MatTooltipDefaultOptions {\n return {\n showDelay: 0,\n hideDelay: 0,\n touchendHideDelay: 1500,\n };\n}\n\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.io/design/components/tooltips.html\n */\n@Directive({\n selector: '[matTooltip]',\n exportAs: 'matTooltip',\n host: {\n '(longpress)': 'show()',\n '(keydown)': '_handleKeydown($event)',\n '(touchend)': '_handleTouchend()',\n },\n})\nexport class MatTooltip implements OnDestroy, OnInit {\n _overlayRef: OverlayRef | null;\n _tooltipInstance: TooltipComponent | null;\n\n private _portal: ComponentPortal<TooltipComponent>;\n private _position: TooltipPosition = 'below';\n private _disabled: boolean = false;\n private _tooltipClass: string|string[]|Set<string>|{[key: string]: any};\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Allows the user to define the position of the tooltip relative to the parent element */\n @Input('matTooltipPosition')\n get position(): TooltipPosition { return this._position; }\n set position(value: TooltipPosition) {\n if (value !== this._position) {\n this._position = value;\n\n if (this._overlayRef) {\n this._updatePosition();\n\n if (this._tooltipInstance) {\n this._tooltipInstance!.show(0);\n }\n\n this._overlayRef.updatePosition();\n }\n }\n }\n\n /** Disables the display of the tooltip. */\n @Input('matTooltipDisabled')\n get disabled(): boolean { return this._disabled; }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n // If tooltip is disabled, hide immediately.\n if (this._disabled) {\n this.hide(0);\n }\n }\n\n /** The default delay in ms before showing the tooltip after show is called */\n @Input('matTooltipShowDelay') showDelay = this._defaultOptions.showDelay;\n\n /** The default delay in ms before hiding the tooltip after hide is called */\n @Input('matTooltipHideDelay') hideDelay = this._defaultOptions.hideDelay;\n\n private _message = '';\n\n /** The message to be displayed in the tooltip */\n @Input('matTooltip')\n get message() { return this._message; }\n set message(value: string) {\n this._ariaDescriber.removeDescription(this._elementRef.nativeElement, this._message);\n\n // If the message is not a string (e.g. number), convert it to a string and trim it.\n this._message = value != null ? `${value}`.trim() : '';\n\n if (!this._message && this._isTooltipVisible()) {\n this.hide(0);\n } else {\n this._updateTooltipMessage();\n this._ariaDescriber.describe(this._elementRef.nativeElement, this.message);\n }\n }\n\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\n @Input('matTooltipClass')\n get tooltipClass() { return this._tooltipClass; }\n set tooltipClass(value: string|string[]|Set<string>|{[key: string]: any}) {\n this._tooltipClass = value;\n if (this._tooltipInstance) {\n this._setTooltipClass(this._tooltipClass);\n }\n }\n\n private _manualListeners = new Map<string, EventListenerOrEventListenerObject>();\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n constructor(\n private _overlay: Overlay,\n private _elementRef: ElementRef<HTMLElement>,\n private _scrollDispatcher: ScrollDispatcher,\n private _viewContainerRef: ViewContainerRef,\n private _ngZone: NgZone,\n platform: Platform,\n private _ariaDescriber: AriaDescriber,\n private _focusMonitor: FocusMonitor,\n @Inject(MAT_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(MAT_TOOLTIP_DEFAULT_OPTIONS)\n private _defaultOptions: MatTooltipDefaultOptions,\n @Optional() @Inject(HAMMER_LOADER) hammerLoader?: HammerLoader) {\n\n this._scrollStrategy = scrollStrategy;\n const element: HTMLElement = _elementRef.nativeElement;\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer || hammerLoader;\n\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\n // first tap from firing its click event or can cause the tooltip to open for clicks.\n if (!platform.IOS && !platform.ANDROID) {\n this._manualListeners\n .set('mouseenter', () => this.show())\n .set('mouseleave', () => this.hide());\n } else if (!hasGestures) {\n // If Hammerjs isn't loaded, fall back to showing on `touchstart`, otherwise\n // there's no way for the user to trigger the tooltip on a touch device.\n this._manualListeners.set('touchstart', () => this.show());\n }\n\n this._manualListeners.forEach((listener, event) => element.addEventListener(event, listener));\n\n _focusMonitor.monitor(_elementRef).pipe(takeUntil(this._destroyed)).subscribe(origin => {\n // Note that the focus monitor runs outside the Angular zone.\n if (!origin) {\n _ngZone.run(() => this.hide(0));\n } else if (origin === 'keyboard') {\n _ngZone.run(() => this.show());\n }\n });\n\n if (_defaultOptions && _defaultOptions.position) {\n this.position = _defaultOptions.position;\n }\n }\n\n /**\n * Setup styling-specific things\n */\n ngOnInit() {\n const element = this._elementRef.nativeElement;\n const elementStyle = element.style as CSSStyleDeclaration & {webkitUserDrag: string};\n\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n // When we bind a gesture event on an element (in this case `longpress`), HammerJS\n // will add some inline styles by default, including `user-select: none`. This is\n // problematic on iOS and in Safari, because it will prevent users from typing in inputs.\n // Since `user-select: none` is not needed for the `longpress` event and can cause unexpected\n // behavior for text fields, we always clear the `user-select` to avoid such issues.\n elementStyle.webkitUserSelect = elementStyle.userSelect = elementStyle.msUserSelect = '';\n }\n\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\n // which breaks the native drag&drop. If the consumer explicitly made\n // the element draggable, clear the `-webkit-user-drag`.\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\n elementStyle.webkitUserDrag = '';\n }\n }\n\n /**\n * Dispose the tooltip when destroyed.\n */\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._tooltipInstance = null;\n }\n\n // Clean up the event listeners set in the constructor\n this._manualListeners.forEach((listener, event) => {\n this._elementRef.nativeElement.removeEventListener(event, listener);\n });\n this._manualListeners.clear();\n\n this._destroyed.next();\n this._destroyed.complete();\n\n this._ariaDescriber.removeDescription(this._elementRef.nativeElement, this.message);\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n show(delay: number = this.showDelay): void {\n if (this.disabled || !this.message || (this._isTooltipVisible() &&\n !this._tooltipInstance!._showTimeoutId && !this._tooltipInstance!._hideTimeoutId)) {\n return;\n }\n\n const overlayRef = this._createOverlay();\n\n this._detach();\n this._portal = this._portal || new ComponentPortal(TooltipComponent, this._viewContainerRef);\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\n this._tooltipInstance.afterHidden()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n this._setTooltipClass(this._tooltipClass);\n this._updateTooltipMessage();\n this._tooltipInstance!.show(delay);\n }\n\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n hide(delay: number = this.hideDelay): void {\n if (this._tooltipInstance) {\n this._tooltipInstance.hide(delay);\n }\n }\n\n /** Shows/hides the tooltip */\n toggle(): void {\n this._isTooltipVisible() ? this.hide() : this.show();\n }\n\n /** Returns true if the tooltip is currently visible to the user */\n _isTooltipVisible(): boolean {\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\n }\n\n /** Handles the keydown events on the host element. */\n _handleKeydown(e: KeyboardEvent) {\n if (this._isTooltipVisible() && e.keyCode === ESCAPE && !hasModifierKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n this.hide(0);\n }\n }\n\n /** Handles the touchend events on the host element. */\n _handleTouchend() {\n this.hide(this._defaultOptions.touchendHideDelay);\n }\n\n /** Create the overlay config and position strategy */\n private _createOverlay(): OverlayRef {\n if (this._overlayRef) {\n return this._overlayRef;\n }\n\n const scrollableAncestors =\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\n\n // Create connected position strategy that listens for scroll events to reposition.\n const strategy = this._overlay.position()\n .flexibleConnectedTo(this._elementRef)\n .withTransformOriginOn('.mat-tooltip')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withScrollableContainers(scrollableAncestors);\n\n strategy.positionChanges.pipe(takeUntil(this._destroyed)).subscribe(change => {\n if (this._tooltipInstance) {\n if (change.scrollableViewProperties.isOverlayClipped && this._tooltipInstance.isVisible()) {\n // After position changes occur and the overlay is clipped by\n // a parent scrollable then close the tooltip.\n this._ngZone.run(() => this.hide(0));\n }\n }\n });\n\n this._overlayRef = this._overlay.create({\n direction: this._dir,\n positionStrategy: strategy,\n panelClass: TOOLTIP_PANEL_CLASS,\n scrollStrategy: this._scrollStrategy()\n });\n\n this._updatePosition();\n\n this._overlayRef.detachments()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n\n return this._overlayRef;\n }\n\n /** Detaches the currently-attached tooltip. */\n private _detach() {\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n }\n\n this._tooltipInstance = null;\n }\n\n /** Updates the position of the current tooltip. */\n private _updatePosition() {\n const position =\n this._overlayRef!.getConfig().positionStrategy as FlexibleConnectedPositionStrategy;\n const origin = this._getOrigin();\n const overlay = this._getOverlayPosition();\n\n position.withPositions([\n {...origin.main, ...overlay.main},\n {...origin.fallback, ...overlay.fallback}\n ]);\n }\n\n /**\n * Returns the origin position and a fallback position based on the user's position preference.\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n */\n _getOrigin(): {main: OriginConnectionPosition, fallback: OriginConnectionPosition} {\n const isLtr = !this._dir || this._dir.value == 'ltr';\n const position = this.position;\n let originPosition: OriginConnectionPosition;\n\n if (position == 'above' || position == 'below') {\n originPosition = {originX: 'center', originY: position == 'above' ? 'top' : 'bottom'};\n } else if (\n position == 'before' ||\n (position == 'left' && isLtr) ||\n (position == 'right' && !isLtr)) {\n originPosition = {originX: 'start', originY: 'center'};\n } else if (\n position == 'after' ||\n (position == 'right' && isLtr) ||\n (position == 'left' && !isLtr)) {\n originPosition = {originX: 'end', originY: 'center'};\n } else {\n throw getMatTooltipInvalidPositionError(position);\n }\n\n const {x, y} = this._invertPosition(originPosition.originX, originPosition.originY);\n\n return {\n main: originPosition,\n fallback: {originX: x, originY: y}\n };\n }\n\n /** Returns the overlay position and a fallback position based on the user's preference */\n _getOverlayPosition(): {main: OverlayConnectionPosition, fallback: OverlayConnectionPosition} {\n const isLtr = !this._dir || this._dir.value == 'ltr';\n const position = this.position;\n let overlayPosition: OverlayConnectionPosition;\n\n if (position == 'above') {\n overlayPosition = {overlayX: 'center', overlayY: 'bottom'};\n } else if (position == 'below') {\n overlayPosition = {overlayX: 'center', overlayY: 'top'};\n } else if (\n position == 'before' ||\n (position == 'left' && isLtr) ||\n (position == 'right' && !isLtr)) {\n overlayPosition = {overlayX: 'end', overlayY: 'center'};\n } else if (\n position == 'after' ||\n (position == 'right' && isLtr) ||\n (position == 'left' && !isLtr)) {\n overlayPosition = {overlayX: 'start', overlayY: 'center'};\n } else {\n throw getMatTooltipInvalidPositionError(position);\n }\n\n const {x, y} = this._invertPosition(overlayPosition.overlayX, overlayPosition.overlayY);\n\n return {\n main: overlayPosition,\n fallback: {overlayX: x, overlayY: y}\n };\n }\n\n /** Updates the tooltip message and repositions the overlay according to the new message length */\n private _updateTooltipMessage() {\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 if (this._tooltipInstance) {\n this._tooltipInstance.message = this.message;\n this._tooltipInstance._markForCheck();\n\n this._ngZone.onMicrotaskEmpty.asObservable().pipe(\n take(1),\n takeUntil(this._destroyed)\n ).subscribe(() => {\n if (this._tooltipInstance) {\n this._overlayRef!.updatePosition();\n }\n });\n }\n }\n\n /** Updates the tooltip class */\n private _setTooltipClass(tooltipClass: string|string[]|Set<string>|{[key: string]: any}) {\n if (this._tooltipInstance) {\n this._tooltipInstance.tooltipClass = tooltipClass;\n this._tooltipInstance._markForCheck();\n }\n }\n\n /** Inverts an overlay position. */\n private _invertPosition(x: HorizontalConnectionPos, y: VerticalConnectionPos) {\n if (this.position === 'above' || this.position === 'below') {\n if (y === 'top') {\n y = 'bottom';\n } else if (y === 'bottom') {\n y = 'top';\n }\n } else {\n if (x === 'end') {\n x = 'start';\n } else if (x === 'start') {\n x = 'end';\n }\n }\n\n return {x, y};\n }\n}\n\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\n\n/**\n * Internal component that wraps the tooltip's content.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tooltip-component',\n templateUrl: 'tooltip.html',\n styleUrls: ['tooltip.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [matTooltipAnimations.tooltipState],\n host: {\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\n '(body:click)': 'this._handleBodyInteraction()',\n 'aria-hidden': 'true',\n }\n})\nexport class TooltipComponent implements OnDestroy {\n /** Message to display in the tooltip */\n message: string;\n\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\n tooltipClass: string|string[]|Set<string>|{[key: string]: any};\n\n /** The timeout ID of any current timer set to show the tooltip */\n _showTimeoutId: number | null;\n\n /** The timeout ID of any current timer set to hide the tooltip */\n _hideTimeoutId: number | null;\n\n /** Property watched by the animation framework to show or hide the tooltip */\n _visibility: TooltipVisibility = 'initial';\n\n /** Whether interactions on the page should close the tooltip */\n private _closeOnInteraction: boolean = false;\n\n /** Subject for notifying that the tooltip has been hidden from the view */\n private readonly _onHide: Subject<any> = new Subject();\n\n /** Stream that emits whether the user has a handset-sized display. */\n _isHandset: Observable<BreakpointState> = this._breakpointObserver.observe(Breakpoints.Handset);\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _breakpointObserver: BreakpointObserver) {}\n\n /**\n * Shows the tooltip with an animation originating from the provided origin\n * @param delay Amount of milliseconds to the delay showing the tooltip.\n */\n show(delay: number): void {\n // Cancel the delayed hide if it is scheduled\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId);\n this._hideTimeoutId = null;\n }\n\n // Body interactions should cancel the tooltip if there is a delay in showing.\n this._closeOnInteraction = true;\n this._showTimeoutId = setTimeout(() => {\n this._visibility = 'visible';\n this._showTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, delay);\n }\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 hide(delay: number): void {\n // Cancel the delayed show if it is scheduled\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId);\n this._showTimeoutId = null;\n }\n\n this._hideTimeoutId = setTimeout(() => {\n this._visibility = 'hidden';\n this._hideTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, delay);\n }\n\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\n afterHidden(): Observable<void> {\n return this._onHide.asObservable();\n }\n\n /** Whether the tooltip is being displayed. */\n isVisible(): boolean {\n return this._visibility === 'visible';\n }\n\n ngOnDestroy() {\n this._onHide.complete();\n }\n\n _animationStart() {\n this._closeOnInteraction = false;\n }\n\n _animationDone(event: AnimationEvent): void {\n const toState = event.toState as TooltipVisibility;\n\n if (toState === 'hidden' && !this.isVisible()) {\n this._onHide.next();\n }\n\n if (toState === 'visible' || toState === 'hidden') {\n this._closeOnInteraction = true;\n }\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.io/design/components/tooltips.html#behavior\n */\n _handleBodyInteraction(): void {\n if (this._closeOnInteraction) {\n this.hide(0);\n }\n }\n\n /**\n * Marks that the tooltip needs to be checked in the next change detection run.\n * Mainly used for rendering the initial text before positioning a tooltip, which\n * can be problematic in components with OnPush change detection.\n */\n _markForCheck(): void {\n this._changeDetectorRef.markForCheck();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {_isNumberValue} from '@angular/cdk/coercion';\nimport {DataSource} from '@angular/cdk/table';\nimport {\n BehaviorSubject,\n combineLatest,\n merge,\n Observable,\n of as observableOf,\n Subscription,\n Subject,\n} from 'rxjs';\nimport {MatPaginator, PageEvent} from '@angular/material/paginator';\nimport {MatSort, Sort} from '@angular/material/sort';\nimport {map} from 'rxjs/operators';\n\n/**\n * Corresponds to `Number.MAX_SAFE_INTEGER`. Moved out into a variable here due to\n * flaky browser support and the value not being defined in Closure's typings.\n */\nconst MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Data source that accepts a client-side data array and includes native support of filtering,\n * sorting (using MatSort), and pagination (using MatPaginator).\n *\n * Allows for sort customization by overriding sortingDataAccessor, which defines how data\n * properties are accessed. Also allows for filter customization by overriding filterTermAccessor,\n * which defines how row data is converted to a string for filter matching.\n */\nexport class MatTableDataSource<T> extends DataSource<T> {\n /** Stream that emits when a new data array is set on the data source. */\n private readonly _data: BehaviorSubject<T[]>;\n\n /** Stream emitting render data to the table (depends on ordered data changes). */\n private readonly _renderData = new BehaviorSubject<T[]>([]);\n\n /** Stream that emits when a new filter string is set on the data source. */\n private readonly _filter = new BehaviorSubject<string>('');\n\n /** Used to react to internal changes of the paginator that are made by the data source itself. */\n private readonly _internalPageChanges = new Subject<void>();\n\n /**\n * Subscription to the changes that should trigger an update to the table's rendered rows, such\n * as filtering, sorting, pagination, or base data changes.\n */\n _renderChangesSubscription = Subscription.EMPTY;\n\n /**\n * The filtered set of data that has been matched by the filter string, or all the data if there\n * is no filter. Useful for knowing the set of data the table represents.\n * For example, a 'selectAll()' function would likely want to select the set of filtered data\n * shown to the user rather than all the data.\n */\n filteredData: T[];\n\n /** Array of data that should be rendered by the table, where each object represents one row. */\n get data() { return this._data.value; }\n set data(data: T[]) { this._data.next(data); }\n\n /**\n * Filter term that should be used to filter out objects from the data array. To override how\n * data objects match to this filter string, provide a custom function for filterPredicate.\n */\n get filter(): string { return this._filter.value; }\n set filter(filter: string) { this._filter.next(filter); }\n\n /**\n * Instance of the MatSort directive used by the table to control its sorting. Sort changes\n * emitted by the MatSort will trigger an update to the table's rendered data.\n */\n get sort(): MatSort | null { return this._sort; }\n set sort(sort: MatSort|null) {\n this._sort = sort;\n this._updateChangeSubscription();\n }\n private _sort: MatSort|null;\n\n /**\n * Instance of the MatPaginator component used by the table to control what page of the data is\n * displayed. Page changes emitted by the MatPaginator will trigger an update to the\n * table's rendered data.\n *\n * Note that the data source uses the paginator's properties to calculate which page of data\n * should be displayed. If the paginator receives its properties as template inputs,\n * e.g. `[pageLength]=100` or `[pageIndex]=1`, then be sure that the paginator's view has been\n * initialized before assigning it to this data source.\n */\n get paginator(): MatPaginator | null { return this._paginator; }\n set paginator(paginator: MatPaginator|null) {\n this._paginator = paginator;\n this._updateChangeSubscription();\n }\n private _paginator: MatPaginator|null;\n\n /**\n * Data accessor function that is used for accessing data properties for sorting through\n * the default sortData function.\n * This default function assumes that the sort header IDs (which defaults to the column name)\n * matches the data's properties (e.g. column Xyz represents data['Xyz']).\n * May be set to a custom function for different behavior.\n * @param data Data object that is being accessed.\n * @param sortHeaderId The name of the column that represents the data.\n */\n sortingDataAccessor: ((data: T, sortHeaderId: string) => string|number) =\n (data: T, sortHeaderId: string): string|number => {\n const value = (data as {[key: string]: any})[sortHeaderId];\n\n if (_isNumberValue(value)) {\n const numberValue = Number(value);\n\n // Numbers beyond `MAX_SAFE_INTEGER` can't be compared reliably so we\n // leave them as strings. For more info: https://goo.gl/y5vbSg\n return numberValue < MAX_SAFE_INTEGER ? numberValue : value;\n }\n\n return value;\n }\n\n /**\n * Gets a sorted copy of the data array based on the state of the MatSort. Called\n * after changes are made to the filtered data or when sort changes are emitted from MatSort.\n * By default, the function retrieves the active sort and its direction and compares data\n * by retrieving data using the sortingDataAccessor. May be overridden for a custom implementation\n * of data ordering.\n * @param data The array of data that should be sorted.\n * @param sort The connected MatSort that holds the current sort state.\n */\n sortData: ((data: T[], sort: MatSort) => T[]) = (data: T[], sort: MatSort): T[] => {\n const active = sort.active;\n const direction = sort.direction;\n if (!active || direction == '') { return data; }\n\n return data.sort((a, b) => {\n let valueA = this.sortingDataAccessor(a, active);\n let valueB = this.sortingDataAccessor(b, active);\n\n // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if\n // one value exists while the other doesn't. In this case, existing value should come first.\n // This avoids inconsistent results when comparing values to undefined/null.\n // If neither value exists, return 0 (equal).\n let comparatorResult = 0;\n if (valueA != null && valueB != null) {\n // Check if one value is greater than the other; if equal, comparatorResult should remain 0.\n if (valueA > valueB) {\n comparatorResult = 1;\n } else if (valueA < valueB) {\n comparatorResult = -1;\n }\n } else if (valueA != null) {\n comparatorResult = 1;\n } else if (valueB != null) {\n comparatorResult = -1;\n }\n\n return comparatorResult * (direction == 'asc' ? 1 : -1);\n });\n }\n\n /**\n * Checks if a data object matches the data source's filter string. By default, each data object\n * is converted to a string of its properties and returns true if the filter has\n * at least one occurrence in that string. By default, the filter string has its whitespace\n * trimmed and the match is case-insensitive. May be overridden for a custom implementation of\n * filter matching.\n * @param data Data object used to check against the filter.\n * @param filter Filter string that has been set on the data source.\n * @returns Whether the filter matches against the data\n */\n filterPredicate: ((data: T, filter: string) => boolean) = (data: T, filter: string): boolean => {\n // Transform the data into a lowercase string of all property values.\n const dataStr = Object.keys(data).reduce((currentTerm: string, key: string) => {\n // Use an obscure Unicode character to delimit the words in the concatenated string.\n // This avoids matches where the values of two columns combined will match the user's query\n // (e.g. `Flute` and `Stop` will match `Test`). The character is intended to be something\n // that has a very low chance of being typed in by somebody in a text field. This one in\n // particular is \"White up-pointing triangle with dot\" from\n // https://en.wikipedia.org/wiki/List_of_Unicode_characters\n return currentTerm + (data as {[key: string]: any})[key] + 'â—¬';\n }, '').toLowerCase();\n\n // Transform the filter by converting it to lowercase and removing whitespace.\n const transformedFilter = filter.trim().toLowerCase();\n\n return dataStr.indexOf(transformedFilter) != -1;\n }\n\n constructor(initialData: T[] = []) {\n super();\n this._data = new BehaviorSubject<T[]>(initialData);\n this._updateChangeSubscription();\n }\n\n /**\n * Subscribe to changes that should trigger an update to the table's rendered rows. When the\n * changes occur, process the current state of the filter, sort, and pagination along with\n * the provided base data and send it to the table for rendering.\n */\n _updateChangeSubscription() {\n // Sorting and/or pagination should be watched if MatSort and/or MatPaginator are provided.\n // The events should emit whenever the component emits a change or initializes, or if no\n // component is provided, a stream with just a null event should be provided.\n // The `sortChange` and `pageChange` acts as a signal to the combineLatests below so that the\n // pipeline can progress to the next step. Note that the value from these streams are not used,\n // they purely act as a signal to progress in the pipeline.\n const sortChange: Observable<Sort|null|void> = this._sort ?\n merge(this._sort.sortChange, this._sort.initialized) as Observable<Sort|void> :\n observableOf(null);\n const pageChange: Observable<PageEvent|null|void> = this._paginator ?\n merge(\n this._paginator.page,\n this._internalPageChanges,\n this._paginator.initialized\n ) as Observable<PageEvent|void> :\n observableOf(null);\n const dataStream = this._data;\n // Watch for base data or filter changes to provide a filtered set of data.\n const filteredData = combineLatest(dataStream, this._filter)\n .pipe(map(([data]) => this._filterData(data)));\n // Watch for filtered data or sort changes to provide an ordered set of data.\n const orderedData = combineLatest(filteredData, sortChange)\n .pipe(map(([data]) => this._orderData(data)));\n // Watch for ordered data or page changes to provide a paged set of data.\n const paginatedData = combineLatest(orderedData, pageChange)\n .pipe(map(([data]) => this._pageData(data)));\n // Watched for paged data changes and send the result to the table to render.\n this._renderChangesSubscription.unsubscribe();\n this._renderChangesSubscription = paginatedData.subscribe(data => this._renderData.next(data));\n }\n\n /**\n * Returns a filtered data array where each filter object contains the filter string within\n * the result of the filterTermAccessor function. If no filter is set, returns the data array\n * as provided.\n */\n _filterData(data: T[]) {\n // If there is a filter string, filter out data that does not contain it.\n // Each data object is converted to a string using the function defined by filterTermAccessor.\n // May be overridden for customization.\n this.filteredData =\n !this.filter ? data : data.filter(obj => this.filterPredicate(obj, this.filter));\n\n if (this.paginator) { this._updatePaginator(this.filteredData.length); }\n\n return this.filteredData;\n }\n\n /**\n * Returns a sorted copy of the data if MatSort has a sort applied, otherwise just returns the\n * data array as provided. Uses the default data accessor for data lookup, unless a\n * sortDataAccessor function is defined.\n */\n _orderData(data: T[]): T[] {\n // If there is no active sort or direction, return the data without trying to sort.\n if (!this.sort) { return data; }\n\n return this.sortData(data.slice(), this.sort);\n }\n\n /**\n * Returns a paged splice of the provided data array according to the provided MatPaginator's page\n * index and length. If there is no paginator provided, returns the data array as provided.\n */\n _pageData(data: T[]): T[] {\n if (!this.paginator) { return data; }\n\n const startIndex = this.paginator.pageIndex * this.paginator.pageSize;\n return data.slice().splice(startIndex, this.paginator.pageSize);\n }\n\n /**\n * Updates the paginator to reflect the length of the filtered data, and makes sure that the page\n * index does not exceed the paginator's last page. Values are changed in a resolved promise to\n * guard against making property changes within a round of change detection.\n */\n _updatePaginator(filteredDataLength: number) {\n Promise.resolve().then(() => {\n const paginator = this.paginator;\n\n if (!paginator) { return; }\n\n paginator.length = filteredDataLength;\n\n // If the page index is set beyond the page, reduce it to the last page.\n if (paginator.pageIndex > 0) {\n const lastPageIndex = Math.ceil(paginator.length / paginator.pageSize) - 1 || 0;\n const newPageIndex = Math.min(paginator.pageIndex, lastPageIndex);\n\n if (newPageIndex !== paginator.pageIndex) {\n paginator.pageIndex = newPageIndex;\n\n // Since the paginator only emits after user-generated changes,\n // we need our own stream so we know to should re-render the data.\n this._internalPageChanges.next();\n }\n }\n });\n }\n\n /**\n * Used by the MatTable. Called when it connects to the data source.\n * @docs-private\n */\n connect() { return this._renderData; }\n\n /**\n * Used by the MatTable. Called when it is destroyed. No-op.\n * @docs-private\n */\n disconnect() { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef, Inject, InjectionToken, NgZone, Optional} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/**\n * Interface for a a MatInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\n// tslint:disable-next-line class-name Using leading underscore to denote internal interface.\nexport interface _MatInkBarPositioner {\n (element: HTMLElement): { left: string, width: string };\n}\n\n/** Injection token for the MatInkBar's Positioner. */\nexport const _MAT_INK_BAR_POSITIONER =\n new InjectionToken<_MatInkBarPositioner>('MatInkBarPositioner', {\n providedIn: 'root',\n factory: _MAT_INK_BAR_POSITIONER_FACTORY\n });\n\n/**\n * The default positioner function for the MatInkBar.\n * @docs-private\n */\nexport function _MAT_INK_BAR_POSITIONER_FACTORY(): _MatInkBarPositioner {\n const method = (element: HTMLElement) => ({\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/**\n * The ink-bar is used to display and animate the line underneath the current active tab label.\n * @docs-private\n */\n@Directive({\n selector: 'mat-ink-bar',\n host: {\n 'class': 'mat-ink-bar',\n '[class._mat-animation-noopable]': `_animationMode === 'NoopAnimations'`,\n },\n})\nexport class MatInkBar {\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n private _ngZone: NgZone,\n @Inject(_MAT_INK_BAR_POSITIONER) private _inkBarPositioner: _MatInkBarPositioner,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) { }\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 alignToElement(element: HTMLElement) {\n this.show();\n\n if (typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => this._setStyles(element));\n });\n } else {\n this._setStyles(element);\n }\n }\n\n /** Shows the ink bar. */\n show(): void {\n this._elementRef.nativeElement.style.visibility = 'visible';\n }\n\n /** Hides the ink bar. */\n hide(): void {\n this._elementRef.nativeElement.style.visibility = 'hidden';\n }\n\n /**\n * Sets the proper styles to the ink bar element.\n * @param element\n */\n private _setStyles(element: HTMLElement) {\n const positions = this._inkBarPositioner(element);\n const inkBar: HTMLElement = this._elementRef.nativeElement;\n\n inkBar.style.left = positions.left;\n inkBar.style.width = positions.width;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, TemplateRef} from '@angular/core';\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({selector: '[matTabContent]'})\nexport class MatTabContent {\n constructor(public template: TemplateRef<any>) { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\nimport {CdkPortal} from '@angular/cdk/portal';\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[mat-tab-label], [matTabLabel]',\n})\nexport class MatTabLabel extends CdkPortal {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {MatTabContent} from './tab-content';\nimport {MatTabLabel} from './tab-label';\n\n\n// Boilerplate for applying mixins to MatTab.\n/** @docs-private */\nclass MatTabBase {}\nconst _MatTabMixinBase: CanDisableCtor & typeof MatTabBase =\n mixinDisabled(MatTabBase);\n\n@Component({\n moduleId: module.id,\n selector: 'mat-tab',\n templateUrl: 'tab.html',\n inputs: ['disabled'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matTab',\n})\nexport class MatTab extends _MatTabMixinBase implements OnInit, CanDisable, OnChanges, OnDestroy {\n /** Content for the tab label given by `<ng-template mat-tab-label>`. */\n @ContentChild(MatTabLabel, {static: false}) templateLabel: MatTabLabel;\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n @ContentChild(MatTabContent, {read: TemplateRef, static: true})\n _explicitContent: TemplateRef<any>;\n\n /** Template inside the MatTab view that contains an `<ng-content>`. */\n @ViewChild(TemplateRef, {static: true}) _implicitContent: TemplateRef<any>;\n\n /** Plain text label for the tab, used when there is no template label. */\n @Input('label') textLabel: string = '';\n\n /** Aria label for the tab. */\n @Input('aria-label') ariaLabel: string;\n\n /**\n * Reference to the element that the tab is labelled by.\n * Will be cleared if `aria-label` is set at the same time.\n */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** Portal that will be the hosted content of the tab */\n private _contentPortal: TemplatePortal | null = null;\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this._contentPortal;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly _stateChanges = new Subject<void>();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\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 origin: number | null = null;\n\n /**\n * Whether the tab is currently active.\n */\n isActive = false;\n\n constructor(private _viewContainerRef: ViewContainerRef) {\n super();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.hasOwnProperty('textLabel') || changes.hasOwnProperty('disabled')) {\n this._stateChanges.next();\n }\n }\n\n ngOnDestroy(): void {\n this._stateChanges.complete();\n }\n\n ngOnInit(): void {\n this._contentPortal = new TemplatePortal(\n this._explicitContent || this._implicitContent, this._viewContainerRef);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material tabs.\n * @docs-private\n */\nexport const matTabsAnimations: {\n readonly translateTab: AnimationTriggerMetadata;\n} = {\n /** Animation translates a tab along the X axis. */\n translateTab: trigger('translateTab', [\n // Note: transitions to `none` instead of 0, because some browsers might blur the content.\n state('center, void, left-origin-center, right-origin-center', style({transform: 'none'})),\n\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state('left', style({transform: 'translate3d(-100%, 0, 0)', minHeight: '1px'})),\n state('right', style({transform: 'translate3d(100%, 0, 0)', minHeight: '1px'})),\n\n transition('* => left, * => right, left => center, right => center',\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')),\n transition('void => left-origin-center', [\n style({transform: 'translate3d(-100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ]),\n transition('void => right-origin-center', [\n style({transform: 'translate3d(100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ])\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ChangeDetectorRef,\n Input,\n Inject,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n ElementRef,\n Directive,\n Optional,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n ComponentFactoryResolver,\n ViewContainerRef,\n forwardRef,\n ViewChild,\n} from '@angular/core';\nimport {AnimationEvent} from '@angular/animations';\nimport {TemplatePortal, CdkPortalOutlet, PortalHostDirective} from '@angular/cdk/portal';\nimport {Directionality, Direction} from '@angular/cdk/bidi';\nimport {Subscription, Subject} from 'rxjs';\nimport {matTabsAnimations} from './tabs-animations';\nimport {startWith, distinctUntilChanged} from 'rxjs/operators';\n\n/**\n * These position states are used internally as animation states for the tab body. Setting the\n * position state to left, right, or center will transition the tab body from its current\n * position to its respective state. If there is not current position (void, in the case of a new\n * tab body), then there will be no transition animation to its state.\n *\n * In the case of a new tab body that should immediately be centered with an animating transition,\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\n * psuedo-prior state.\n */\nexport type MatTabBodyPositionState =\n 'left' | 'center' | 'right' | 'left-origin-center' | 'right-origin-center';\n\n/**\n * The origin state is an internally used state that is set on a new tab body indicating if it\n * began to the left or right of the prior selected index. For example, if the selected index was\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\n * origin of right because its index was greater than the prior selected index.\n */\nexport type MatTabBodyOriginState = 'left' | 'right';\n\n/**\n * The portal host directive for the contents of the tab.\n * @docs-private\n */\n@Directive({\n selector: '[matTabBodyHost]'\n})\nexport class MatTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestroy {\n /** Subscription to events for when the tab body begins centering. */\n private _centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n private _leavingSub = Subscription.EMPTY;\n\n constructor(\n componentFactoryResolver: ComponentFactoryResolver,\n viewContainerRef: ViewContainerRef,\n @Inject(forwardRef(() => MatTabBody)) private _host: MatTabBody) {\n super(componentFactoryResolver, viewContainerRef);\n }\n\n /** Set initial visibility or set up subscription for changing visibility. */\n ngOnInit(): void {\n super.ngOnInit();\n\n this._centeringSub = this._host._beforeCentering\n .pipe(startWith(this._host._isCenterPosition(this._host._position)))\n .subscribe((isCentering: boolean) => {\n if (isCentering && !this.hasAttached()) {\n this.attach(this._host._content);\n }\n });\n\n this._leavingSub = this._host._afterLeavingCenter.subscribe(() => {\n this.detach();\n });\n }\n\n /** Clean up centering subscription. */\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this._centeringSub.unsubscribe();\n this._leavingSub.unsubscribe();\n }\n}\n\n/**\n * Wrapper for the contents of a tab.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-body',\n templateUrl: 'tab-body.html',\n styleUrls: ['tab-body.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [matTabsAnimations.translateTab],\n host: {\n 'class': 'mat-tab-body',\n },\n})\nexport class MatTabBody implements OnInit, OnDestroy {\n\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\n private _positionIndex: number;\n\n /** Subscription to the directionality change observable. */\n private _dirChangeSubscription = Subscription.EMPTY;\n\n /** Tab body position state. Used by the animation trigger for the current state. */\n _position: MatTabBodyPositionState;\n\n /** Emits when an animation on the tab is complete. */\n _translateTabComplete = new Subject<AnimationEvent>();\n\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n @Output() readonly _onCentering: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _beforeCentering: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _afterLeavingCenter: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted when the tab completes its animation towards the center. */\n @Output() readonly _onCentered: EventEmitter<void> = new EventEmitter<void>(true);\n\n /** The portal host inside of this container into which the tab body content will be loaded. */\n @ViewChild(PortalHostDirective, {static: false}) _portalHost: PortalHostDirective;\n\n /** The tab body content to display. */\n @Input('content') _content: TemplatePortal;\n\n /** Position that will be used when the tab is immediately becoming visible after creation. */\n @Input() origin: number;\n\n // Note that the default value will always be overwritten by `MatTabBody`, but we need one\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\n /** Duration for the tab's animation. */\n @Input() animationDuration: string = '500ms';\n\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n @Input()\n set position(position: number) {\n this._positionIndex = position;\n this._computePositionAnimationState();\n }\n\n constructor(private _elementRef: ElementRef<HTMLElement>,\n @Optional() private _dir: Directionality,\n changeDetectorRef: ChangeDetectorRef) {\n\n if (_dir) {\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\n this._computePositionAnimationState(dir);\n changeDetectorRef.markForCheck();\n });\n }\n\n // Ensure that we get unique animation events, because the `.done` callback can get\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\n this._translateTabComplete.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe(event => {\n // If the transition to the center is complete, emit an event.\n if (this._isCenterPosition(event.toState) && this._isCenterPosition(this._position)) {\n this._onCentered.emit();\n }\n\n if (this._isCenterPosition(event.fromState) && !this._isCenterPosition(this._position)) {\n this._afterLeavingCenter.emit();\n }\n });\n }\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 ngOnInit() {\n if (this._position == 'center' && this.origin != null) {\n this._position = this._computePositionFromOrigin();\n }\n }\n\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._translateTabComplete.complete();\n }\n\n _onTranslateTabStarted(event: AnimationEvent): void {\n const isCentering = this._isCenterPosition(event.toState);\n this._beforeCentering.emit(isCentering);\n if (isCentering) {\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\n }\n }\n\n /** The text direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the provided position state is considered center, regardless of origin. */\n _isCenterPosition(position: MatTabBodyPositionState|string): boolean {\n return position == 'center' ||\n position == 'left-origin-center' ||\n position == 'right-origin-center';\n }\n\n /** Computes the position state that will be used for the tab-body animation trigger. */\n private _computePositionAnimationState(dir: Direction = this._getLayoutDirection()) {\n if (this._positionIndex < 0) {\n this._position = dir == 'ltr' ? 'left' : 'right';\n } else if (this._positionIndex > 0) {\n this._position = dir == 'ltr' ? 'right' : 'left';\n } else {\n this._position = 'center';\n }\n }\n\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n private _computePositionFromOrigin(): MatTabBodyPositionState {\n const dir = this._getLayoutDirection();\n\n if ((dir == 'ltr' && this.origin <= 0) || (dir == 'rtl' && this.origin > 0)) {\n return 'left-origin-center';\n }\n\n return 'right-origin-center';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '@angular/material/core';\n\n\n// Boilerplate for applying mixins to MatTabLabelWrapper.\n/** @docs-private */\nclass MatTabLabelWrapperBase {}\nconst _MatTabLabelWrapperMixinBase: CanDisableCtor & typeof MatTabLabelWrapperBase =\n mixinDisabled(MatTabLabelWrapperBase);\n\n/**\n * Used in the `mat-tab-group` view to display tab labels.\n * @docs-private\n */\n@Directive({\n selector: '[matTabLabelWrapper]',\n inputs: ['disabled'],\n host: {\n '[class.mat-tab-disabled]': 'disabled',\n '[attr.aria-disabled]': '!!disabled',\n }\n})\nexport class MatTabLabelWrapper extends _MatTabLabelWrapperMixinBase implements CanDisable {\n constructor(public elementRef: ElementRef) {\n super();\n }\n\n /** Sets focus on the wrapper element */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ChangeDetectorRef,\n ElementRef,\n NgZone,\n Optional,\n QueryList,\n EventEmitter,\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {FocusKeyManager, FocusableOption} from '@angular/cdk/a11y';\nimport {END, ENTER, HOME, SPACE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {merge, of as observableOf, Subject, timer, fromEvent} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {MatInkBar} from './ink-bar';\nimport {Platform, normalizePassiveListenerOptions} from '@angular/cdk/platform';\n\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions =\n normalizePassiveListenerOptions({passive: true}) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\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 */\nconst EXAGGERATED_OVERSCROLL = 60;\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Item inside a paginated tab header. */\ntype MatPaginatedTabHeaderItem = FocusableOption & {elementRef: ElementRef};\n\n/**\n * Base class for a tab header that supported pagination.\n */\nexport abstract class MatPaginatedTabHeader implements AfterContentChecked, AfterContentInit,\n AfterViewInit, OnDestroy {\n abstract _items: QueryList<MatPaginatedTabHeaderItem>;\n abstract _inkBar: MatInkBar;\n abstract _tabListContainer: ElementRef<HTMLElement>;\n abstract _tabList: ElementRef<HTMLElement>;\n abstract _nextPaginator: ElementRef<HTMLElement>;\n abstract _previousPaginator: ElementRef<HTMLElement>;\n\n /** The distance in pixels that the tab labels should be translated to the left. */\n private _scrollDistance = 0;\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private _selectedIndexChanged = false;\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n /** Whether the controls for pagination should be displayed */\n _showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n _disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n _disableScrollBefore = true;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private _tabLabelCount: number;\n\n /** Whether the scroll distance has changed and should be applied after the view is checked. */\n private _scrollDistanceChanged: boolean;\n\n /** Used to manage focus between the tabs. */\n private _keyManager: FocusKeyManager<MatPaginatedTabHeaderItem>;\n\n /** Cached text content of the header. */\n private _currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private _stopScrolling = new Subject<void>();\n\n /** The index of the active tab. */\n get selectedIndex(): number { return this._selectedIndex; }\n set selectedIndex(value: number) {\n value = coerceNumberProperty(value);\n\n if (this._selectedIndex != value) {\n this._selectedIndexChanged = true;\n this._selectedIndex = value;\n\n if (this._keyManager) {\n this._keyManager.updateActiveItemIndex(value);\n }\n }\n }\n private _selectedIndex: number = 0;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter<number> = new EventEmitter<number>();\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _changeDetectorRef: ChangeDetectorRef,\n private _viewportRuler: ViewportRuler,\n @Optional() private _dir: Directionality,\n private _ngZone: NgZone,\n /**\n * @deprecated @breaking-change 9.0.0 `_platform` and `_animationMode`\n * parameters to become required.\n */\n private _platform?: Platform,\n public _animationMode?: string) {\n\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave')\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._stopInterval();\n });\n });\n }\n\n /** Called when the user has selected an item via the keyboard. */\n protected abstract _itemSelected(event: KeyboardEvent): void;\n\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('before');\n });\n\n fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : observableOf(null);\n const resize = this._viewportRuler.change(150);\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n\n this._keyManager = new FocusKeyManager<MatPaginatedTabHeaderItem>(this._items)\n .withHorizontalOrientation(this._getLayoutDirection())\n .withWrap();\n\n this._keyManager.updateActiveItem(0);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame(realign) : realign();\n\n // On dir change or window resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, resize, this._items.changes).pipe(takeUntil(this._destroyed)).subscribe(() => {\n realign();\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this._keyManager.change.pipe(takeUntil(this._destroyed)).subscribe(newFocusIndex => {\n this.indexFocused.emit(newFocusIndex);\n this._setTabFocus(newFocusIndex);\n });\n }\n\n ngAfterContentChecked(): void {\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this._tabLabelCount != this._items.length) {\n this.updatePagination();\n this._tabLabelCount = this._items.length;\n this._changeDetectorRef.markForCheck();\n }\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._alignInkBarToSelectedTab();\n this._selectedIndexChanged = false;\n this._changeDetectorRef.markForCheck();\n }\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 this._changeDetectorRef.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this._stopScrolling.complete();\n }\n\n /** Handles keyboard events on the header. */\n _handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n switch (event.keyCode) {\n case HOME:\n this._keyManager.setFirstItemActive();\n event.preventDefault();\n break;\n case END:\n this._keyManager.setLastItemActive();\n event.preventDefault();\n break;\n case ENTER:\n case SPACE:\n this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\n break;\n default:\n this._keyManager.onKeydown(event);\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n _onContentChanges() {\n const textContent = this._elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this._currentTextContent) {\n this._currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this._ngZone.run(() => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n this._checkPaginationEnabled();\n this._checkScrollingControls();\n this._updateTabScrollPosition();\n }\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n return this._keyManager ? this._keyManager.activeItemIndex! : 0;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (!this._isValidIndex(value) || this.focusIndex === value || !this._keyManager) {\n return;\n }\n\n this._keyManager.setActiveItem(value);\n }\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 _isValidIndex(index: number): boolean {\n if (!this._items) { return true; }\n\n const tab = this._items ? this._items.toArray()[index] : null;\n return !!tab && !tab.disabled;\n }\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 _setTabFocus(tabIndex: number) {\n if (this._showPaginationControls) {\n this._scrollToLabel(tabIndex);\n }\n\n if (this._items && this._items.length) {\n this._items.toArray()[tabIndex].focus();\n\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 const containerEl = this._tabListContainer.nativeElement;\n const dir = this._getLayoutDirection();\n\n if (dir == 'ltr') {\n containerEl.scrollLeft = 0;\n } else {\n containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;\n }\n }\n }\n\n /** The layout direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n _updateTabScrollPosition() {\n const scrollDistance = this.scrollDistance;\n const platform = this._platform;\n const translateX = this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\n\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\n // and ripples will exceed the boundaries of the visible tab bar.\n // See: https://github.com/angular/components/issues/10276\n // We round the `transform` here, because transforms with sub-pixel precision cause some\n // browsers to blur the content of the element.\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;\n\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\n // @breaking-change 9.0.0 Remove null check for `platform` after it can no longer be undefined.\n if (platform && (platform.TRIDENT || platform.EDGE)) {\n this._tabListContainer.nativeElement.scrollLeft = 0;\n }\n }\n\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n get scrollDistance(): number { return this._scrollDistance; }\n set scrollDistance(value: number) {\n this._scrollTo(value);\n }\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 _scrollHeader(direction: ScrollDirection) {\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n\n // Move the scroll distance one-third the length of the tab list's viewport.\n const scrollAmount = (direction == 'before' ? -1 : 1) * viewLength / 3;\n\n return this._scrollTo(this._scrollDistance + scrollAmount);\n }\n\n /** Handles click events on the pagination arrows. */\n _handlePaginatorClick(direction: ScrollDirection) {\n this._stopInterval();\n this._scrollHeader(direction);\n }\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 _scrollToLabel(labelIndex: number) {\n const selectedLabel = this._items ? this._items.toArray()[labelIndex] : null;\n\n if (!selectedLabel) { return; }\n\n // The view length is the visible width of the tab labels.\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n const {offsetLeft, offsetWidth} = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number, labelAfterPos: number;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + offsetWidth;\n } else {\n labelAfterPos = this._tabList.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const beforeVisiblePos = this.scrollDistance;\n const afterVisiblePos = this.scrollDistance + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Scroll header to move label to the before direction\n this.scrollDistance -= beforeVisiblePos - labelBeforePos + EXAGGERATED_OVERSCROLL;\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 /**\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 _checkPaginationEnabled() {\n const isEnabled =\n this._tabList.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;\n\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n\n if (isEnabled !== this._showPaginationControls) {\n this._changeDetectorRef.markForCheck();\n }\n\n this._showPaginationControls = isEnabled;\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 _checkScrollingControls() {\n // Check if the pagination arrows should be activated.\n this._disableScrollBefore = this.scrollDistance == 0;\n this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();\n this._changeDetectorRef.markForCheck();\n }\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 _getMaxScrollDistance(): number {\n const lengthOfTabList = this._tabList.nativeElement.scrollWidth;\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n return (lengthOfTabList - viewLength) || 0;\n }\n\n /** Tells the ink-bar to align itself to the current label wrapper */\n _alignInkBarToSelectedTab(): void {\n const selectedItem = this._items && this._items.length ?\n this._items.toArray()[this.selectedIndex] : null;\n const selectedLabelWrapper = selectedItem ? selectedItem.elementRef.nativeElement : null;\n\n if (selectedLabelWrapper) {\n this._inkBar.alignToElement(selectedLabelWrapper);\n } else {\n this._inkBar.hide();\n }\n }\n\n /** Stops the currently-running paginator interval. */\n _stopInterval() {\n this._stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n * @param direction In which direction the paginator should be scrolled.\n */\n _handlePaginatorPress(direction: ScrollDirection) {\n // Avoid overlapping timers.\n this._stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))\n .subscribe(() => {\n const {maxScrollDistance, distance} = this._scrollHeader(direction);\n\n // Stop the timer if we've reached the start or the end.\n if (distance === 0 || distance >= maxScrollDistance) {\n this._stopInterval();\n }\n });\n }\n\n /**\n * Scrolls the header to a given position.\n * @param position Position to which to scroll.\n * @returns Information on the current scroll distance and the maximum.\n */\n private _scrollTo(position: number) {\n const maxScrollDistance = this._getMaxScrollDistance();\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\n\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 return {maxScrollDistance, distance: this._scrollDistance};\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n AfterViewInit,\n Input,\n Inject,\n} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatInkBar} from './ink-bar';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {Platform} from '@angular/cdk/platform';\nimport {MatPaginatedTabHeader} from './paginated-tab-header';\n\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 * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-header',\n templateUrl: 'tab-header.html',\n styleUrls: ['tab-header.css'],\n inputs: ['selectedIndex'],\n outputs: ['selectFocusedIndex', 'indexFocused'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n },\n})\nexport class MatTabHeader extends MatPaginatedTabHeader implements AfterContentChecked,\n AfterContentInit, AfterViewInit, OnDestroy {\n\n @ContentChildren(MatTabLabelWrapper) _items: QueryList<MatTabLabelWrapper>;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator', {static: false}) _nextPaginator: ElementRef<HTMLElement>;\n @ViewChild('previousPaginator', {static: false}) _previousPaginator: ElementRef<HTMLElement>;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n constructor(elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n platform: Platform,\n // @breaking-change 9.0.0 `_animationMode` parameter to be made required.\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected(event: KeyboardEvent) {\n event.preventDefault();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n Optional,\n Inject,\n InjectionToken,\n} from '@angular/core';\nimport {\n CanColor,\n CanColorCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '@angular/material/core';\nimport {merge, Subscription} from 'rxjs';\nimport {MatTab} from './tab';\nimport {MatTabHeader} from './tab-header';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n/** A simple change event emitted on focus or selection changes. */\nexport class MatTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: MatTab;\n}\n\n/** Possible positions for the tab header. */\nexport type MatTabHeaderPosition = 'above' | 'below';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface MatTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const MAT_TABS_CONFIG = new InjectionToken('MAT_TABS_CONFIG');\n\n// Boilerplate for applying mixins to MatTabGroup.\n/** @docs-private */\nclass MatTabGroupBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatTabGroupMixinBase: CanColorCtor & CanDisableRippleCtor & typeof MatTabGroupBase =\n mixinColor(mixinDisableRipple(MatTabGroupBase), 'primary');\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://material.io/design/components/tabs.html\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-group',\n exportAs: 'matTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['color', 'disableRipple'],\n host: {\n 'class': 'mat-tab-group',\n '[class.mat-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.mat-tab-group-inverted-header]': 'headerPosition === \"below\"',\n },\n})\nexport class MatTabGroup extends _MatTabGroupMixinBase implements AfterContentInit,\n AfterContentChecked, OnDestroy, CanColor, CanDisableRipple {\n\n @ContentChildren(MatTab) _tabs: QueryList<MatTab>;\n\n @ViewChild('tabBodyWrapper', {static: false}) _tabBodyWrapper: ElementRef;\n\n @ViewChild('tabHeader', {static: false}) _tabHeader: MatTabHeader;\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight: number = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean { return this._dynamicHeight; }\n set dynamicHeight(value: boolean) { this._dynamicHeight = coerceBooleanProperty(value); }\n private _dynamicHeight: boolean = false;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null { return this._selectedIndex; }\n set selectedIndex(value: number | null) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: MatTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string { return this._animationDuration; }\n set animationDuration(value: string) {\n this._animationDuration = /^\\d+$/.test(value) ? value + 'ms' : value;\n }\n private _animationDuration: string;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const nativeElement: HTMLElement = this._elementRef.nativeElement;\n\n nativeElement.classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n nativeElement.classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter<MatTabChangeEvent> =\n new EventEmitter<MatTabChangeEvent>();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter<void> = new EventEmitter<void>();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter<MatTabChangeEvent> =\n new EventEmitter<MatTabChangeEvent>(true);\n\n private _groupId: number;\n\n constructor(elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_TABS_CONFIG) @Optional() defaultConfig?: MatTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration = defaultConfig && defaultConfig.animationDuration ?\n defaultConfig.animationDuration : '500ms';\n }\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 ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this._indexToSelect = this._clampTabIndex(this._indexToSelect);\n\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 != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach((tab, index) => tab.isActive = index === indexToSelect);\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n }\n });\n }\n\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: MatTab, index: number) => {\n tab.position = index - indexToSelect;\n\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 = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n this._subscribeToTabLabels();\n\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n break;\n }\n }\n }\n\n this._subscribeToTabLabels();\n this._changeDetectorRef.markForCheck();\n });\n }\n\n ngOnDestroy() {\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n _focusChanged(index: number) {\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): MatTabChangeEvent {\n const event = new MatTabChangeEvent;\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 /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the MatTab component, whereas the data binding is inside the MatTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._stateChanges))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `mat-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `mat-tab-content-${this._groupId}-${i}`;\n }\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 _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) { return; }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\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 wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: MatTab, tabHeader: MatTabHeader, index: number) {\n if (!tab.disabled) {\n this.selectedIndex = tabHeader.focusIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(tab: MatTab, idx: number): number | null {\n if (tab.disabled) {\n return null;\n }\n return this.selectedIndex === idx ? 0 : -1;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewEncapsulation,\n Inject,\n} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '@angular/material/core';\nimport {merge, Subscription} from 'rxjs';\nimport {MatSort, MatSortable} from './sort';\nimport {matSortAnimations} from './sort-animations';\nimport {SortDirection} from './sort-direction';\nimport {getSortHeaderNotContainedWithinSortError} from './sort-errors';\nimport {MatSortHeaderIntl} from './sort-header-intl';\n\n\n// Boilerplate for applying mixins to the sort header.\n/** @docs-private */\nclass MatSortHeaderBase {}\nconst _MatSortHeaderMixinBase: CanDisableCtor & typeof MatSortHeaderBase =\n mixinDisabled(MatSortHeaderBase);\n\n/**\n * Valid positions for the arrow to be in for its opacity and translation. If the state is a\n * sort direction, the position of the arrow will be above/below and opacity 0. If the state is\n * hint, the arrow will be in the center with a slight opacity. Active state means the arrow will\n * be fully opaque in the center.\n *\n * @docs-private\n */\nexport type ArrowViewState = SortDirection | 'hint' | 'active';\n\n/**\n * States describing the arrow's animated position (animating fromState to toState).\n * If the fromState is not defined, there will be no animated transition to the toState.\n * @docs-private\n */\nexport interface ArrowViewStateTransition {\n fromState?: ArrowViewState;\n toState: ArrowViewState;\n}\n\n/** Column definition associated with a `MatSortHeader`. */\ninterface MatSortHeaderColumnDef {\n name: string;\n}\n\n/**\n * Applies sorting behavior (click to change sort) and styles to an element, including an\n * arrow to display the current sort direction.\n *\n * Must be provided with an id and contained within a parent MatSort directive.\n *\n * If used on header cells in a CdkTable, it will automatically default its id from its containing\n * column definition.\n */\n@Component({\n moduleId: module.id,\n selector: '[mat-sort-header]',\n exportAs: 'matSortHeader',\n templateUrl: 'sort-header.html',\n styleUrls: ['sort-header.css'],\n host: {\n '(click)': '_handleClick()',\n '(mouseenter)': '_setIndicatorHintVisible(true)',\n '(longpress)': '_setIndicatorHintVisible(true)',\n '(mouseleave)': '_setIndicatorHintVisible(false)',\n '[attr.aria-sort]': '_getAriaSortAttribute()',\n '[class.mat-sort-header-disabled]': '_isDisabled()',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['disabled'],\n animations: [\n matSortAnimations.indicator,\n matSortAnimations.leftPointer,\n matSortAnimations.rightPointer,\n matSortAnimations.arrowOpacity,\n matSortAnimations.arrowPosition,\n matSortAnimations.allowChildren,\n ]\n})\nexport class MatSortHeader extends _MatSortHeaderMixinBase\n implements CanDisable, MatSortable, OnDestroy, OnInit {\n private _rerenderSubscription: Subscription;\n\n /**\n * Flag set to true when the indicator should be displayed while the sort is not active. Used to\n * provide an affordance that the header is sortable by showing on focus and hover.\n */\n _showIndicatorHint: boolean = false;\n\n /**\n * The view transition state of the arrow (translation/ opacity) - indicates its `from` and `to`\n * position through the animation. If animations are currently disabled, the fromState is removed\n * so that there is no animation displayed.\n */\n _viewState: ArrowViewStateTransition;\n\n /** The direction the arrow should be facing according to the current state. */\n _arrowDirection: SortDirection = '';\n\n /**\n * Whether the view state animation should show the transition between the `from` and `to` states.\n */\n _disableViewStateAnimation = false;\n\n /**\n * ID of this sort header. If used within the context of a CdkColumnDef, this will default to\n * the column's name.\n */\n @Input('mat-sort-header') id: string;\n\n /** Sets the position of the arrow that displays when sorted. */\n @Input() arrowPosition: 'before' | 'after' = 'after';\n\n /** Overrides the sort start value of the containing MatSort for this MatSortable. */\n @Input() start: 'asc' | 'desc';\n\n /** Overrides the disable clear value of the containing MatSort for this MatSortable. */\n @Input()\n get disableClear(): boolean { return this._disableClear; }\n set disableClear(v) { this._disableClear = coerceBooleanProperty(v); }\n private _disableClear: boolean;\n\n constructor(public _intl: MatSortHeaderIntl,\n changeDetectorRef: ChangeDetectorRef,\n @Optional() public _sort: MatSort,\n @Inject('MAT_SORT_HEADER_COLUMN_DEF') @Optional()\n public _columnDef: MatSortHeaderColumnDef) {\n // Note that we use a string token for the `_columnDef`, because the value is provided both by\n // `material/table` and `cdk/table` and we can't have the CDK depending on Material,\n // and we want to avoid having the sort header depending on the CDK table because\n // of this single reference.\n super();\n\n if (!_sort) {\n throw getSortHeaderNotContainedWithinSortError();\n }\n\n this._rerenderSubscription = merge(_sort.sortChange, _sort._stateChanges, _intl.changes)\n .subscribe(() => {\n if (this._isSorted()) {\n this._updateArrowDirection();\n }\n\n // If this header was recently active and now no longer sorted, animate away the arrow.\n if (!this._isSorted() && this._viewState && this._viewState.toState === 'active') {\n this._disableViewStateAnimation = false;\n this._setAnimationTransitionState({fromState: 'active', toState: this._arrowDirection});\n }\n\n changeDetectorRef.markForCheck();\n });\n }\n\n ngOnInit() {\n if (!this.id && this._columnDef) {\n this.id = this._columnDef.name;\n }\n\n // Initialize the direction of the arrow and set the view state to be immediately that state.\n this._updateArrowDirection();\n this._setAnimationTransitionState(\n {toState: this._isSorted() ? 'active' : this._arrowDirection});\n\n this._sort.register(this);\n }\n\n ngOnDestroy() {\n this._sort.deregister(this);\n this._rerenderSubscription.unsubscribe();\n }\n\n /**\n * Sets the \"hint\" state such that the arrow will be semi-transparently displayed as a hint to the\n * user showing what the active sort will become. If set to false, the arrow will fade away.\n */\n _setIndicatorHintVisible(visible: boolean) {\n // No-op if the sort header is disabled - should not make the hint visible.\n if (this._isDisabled() && visible) { return; }\n\n this._showIndicatorHint = visible;\n\n if (!this._isSorted()) {\n this._updateArrowDirection();\n if (this._showIndicatorHint) {\n this._setAnimationTransitionState({fromState: this._arrowDirection, toState: 'hint'});\n } else {\n this._setAnimationTransitionState({fromState: 'hint', toState: this._arrowDirection});\n }\n }\n }\n\n /**\n * Sets the animation transition view state for the arrow's position and opacity. If the\n * `disableViewStateAnimation` flag is set to true, the `fromState` will be ignored so that\n * no animation appears.\n */\n _setAnimationTransitionState(viewState: ArrowViewStateTransition) {\n this._viewState = viewState;\n\n // If the animation for arrow position state (opacity/translation) should be disabled,\n // remove the fromState so that it jumps right to the toState.\n if (this._disableViewStateAnimation) {\n this._viewState = {toState: viewState.toState};\n }\n }\n\n /** Triggers the sort on this sort header and removes the indicator hint. */\n _handleClick() {\n if (this._isDisabled()) { return; }\n\n this._sort.sort(this);\n\n // Do not show the animation if the header was already shown in the right position.\n if (this._viewState.toState === 'hint' || this._viewState.toState === 'active') {\n this._disableViewStateAnimation = true;\n }\n\n // If the arrow is now sorted, animate the arrow into place. Otherwise, animate it away into\n // the direction it is facing.\n const viewState: ArrowViewStateTransition = this._isSorted() ?\n {fromState: this._arrowDirection, toState: 'active'} :\n {fromState: 'active', toState: this._arrowDirection};\n this._setAnimationTransitionState(viewState);\n\n this._showIndicatorHint = false;\n }\n\n /** Whether this MatSortHeader is currently sorted in either ascending or descending order. */\n _isSorted() {\n return this._sort.active == this.id &&\n (this._sort.direction === 'asc' || this._sort.direction === 'desc');\n }\n\n /** Returns the animation state for the arrow direction (indicator and pointers). */\n _getArrowDirectionState() {\n return `${this._isSorted() ? 'active-' : ''}${this._arrowDirection}`;\n }\n\n /** Returns the arrow position state (opacity, translation). */\n _getArrowViewState() {\n const fromState = this._viewState.fromState;\n return (fromState ? `${fromState}-to-` : '') + this._viewState.toState;\n }\n\n /**\n * Updates the direction the arrow should be pointing. If it is not sorted, the arrow should be\n * facing the start direction. Otherwise if it is sorted, the arrow should point in the currently\n * active sorted direction. The reason this is updated through a function is because the direction\n * should only be changed at specific times - when deactivated but the hint is displayed and when\n * the sort is active and the direction changes. Otherwise the arrow's direction should linger\n * in cases such as the sort becoming deactivated but we want to animate the arrow away while\n * preserving its direction, even though the next sort direction is actually different and should\n * only be changed once the arrow displays again (hint or activation).\n */\n _updateArrowDirection() {\n this._arrowDirection = this._isSorted() ?\n this._sort.direction :\n (this.start || this._sort.start);\n }\n\n _isDisabled() {\n return this._sort.disabled || this.disabled;\n }\n\n /**\n * Gets the aria-sort attribute that should be applied to this sort header. If this header\n * is not sorted, returns null so that the attribute is removed from the host element. Aria spec\n * says that the aria-sort property should only be present on one header at a time, so removing\n * ensures this is true.\n */\n _getAriaSortAttribute() {\n if (!this._isSorted()) { return null; }\n\n return this._sort.direction == 'asc' ? 'ascending' : 'descending';\n }\n\n /** Whether the arrow inside the sort header should be rendered. */\n _renderArrow() {\n return !this._isDisabled() || this._isSorted();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatSortHeader} from './sort-header';\nimport {MatSort} from './sort';\nimport {MAT_SORT_HEADER_INTL_PROVIDER} from './sort-header-intl';\nimport {CommonModule} from '@angular/common';\n\n\n@NgModule({\n imports: [CommonModule],\n exports: [MatSort, MatSortHeader],\n declarations: [MatSort, MatSortHeader],\n providers: [MAT_SORT_HEADER_INTL_PROVIDER]\n})\nexport class MatSortModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\nimport {CdkStepLabel} from '@angular/cdk/stepper';\n\n@Directive({\n selector: '[matStepLabel]',\n})\nexport class MatStepLabel extends CdkStepLabel {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, Optional, SkipSelf} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n\n/** Stepper data that is required for internationalization. */\n@Injectable({providedIn: 'root'})\nexport class MatStepperIntl {\n /**\n * Stream that emits whenever the labels here are changed. Use this to notify\n * components if the labels have changed after initialization.\n */\n readonly changes: Subject<void> = new Subject<void>();\n\n /** Label that is rendered below optional steps. */\n optionalLabel: string = 'Optional';\n}\n\n\n/** @docs-private */\nexport function MAT_STEPPER_INTL_PROVIDER_FACTORY(parentIntl: MatStepperIntl) {\n return parentIntl || new MatStepperIntl();\n}\n\n/** @docs-private */\nexport const MAT_STEPPER_INTL_PROVIDER = {\n provide: MatStepperIntl,\n deps: [[new Optional(), new SkipSelf(), MatStepperIntl]],\n useFactory: MAT_STEPPER_INTL_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n ViewEncapsulation,\n TemplateRef,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {MatStepLabel} from './step-label';\nimport {MatStepperIntl} from './stepper-intl';\nimport {MatStepperIconContext} from './stepper-icon';\nimport {CdkStepHeader, StepState} from '@angular/cdk/stepper';\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-step-header',\n templateUrl: 'step-header.html',\n styleUrls: ['step-header.css'],\n host: {\n 'class': 'mat-step-header',\n 'role': 'tab',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatStepHeader extends CdkStepHeader implements OnDestroy {\n private _intlSubscription: Subscription;\n\n /** State of the given step. */\n @Input() state: StepState;\n\n /** Label of the given step. */\n @Input() label: MatStepLabel | string;\n\n /** Error message to display when there's an error. */\n @Input() errorMessage: string;\n\n /** Overrides for the header icons, passed in via the stepper. */\n @Input() iconOverrides: {[key: string]: TemplateRef<MatStepperIconContext>};\n\n /** Index of the given step. */\n @Input() index: number;\n\n /** Whether the given step is selected. */\n @Input() selected: boolean;\n\n /** Whether the given step label is active. */\n @Input() active: boolean;\n\n /** Whether the given step is optional. */\n @Input() optional: boolean;\n\n /** Whether the ripple should be disabled. */\n @Input() disableRipple: boolean;\n\n constructor(\n public _intl: MatStepperIntl,\n private _focusMonitor: FocusMonitor,\n _elementRef: ElementRef<HTMLElement>,\n changeDetectorRef: ChangeDetectorRef) {\n super(_elementRef);\n _focusMonitor.monitor(_elementRef, true);\n this._intlSubscription = _intl.changes.subscribe(() => changeDetectorRef.markForCheck());\n }\n\n ngOnDestroy() {\n this._intlSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Focuses the step header. */\n focus() {\n this._focusMonitor.focusVia(this._elementRef, 'program');\n }\n\n /** Returns string label of given step if it is a text label. */\n _stringLabel(): string | null {\n return this.label instanceof MatStepLabel ? null : this.label;\n }\n\n /** Returns MatStepLabel if the label of given step is a template label. */\n _templateLabel(): MatStepLabel | null {\n return this.label instanceof MatStepLabel ? this.label : null;\n }\n\n /** Returns the host HTML element. */\n _getHostElement() {\n return this._elementRef.nativeElement;\n }\n\n /** Template context variables that are exposed to the `matStepperIcon` instances. */\n _getIconContext(): MatStepperIconContext {\n return {\n index: this.index,\n active: this.active,\n optional: this.optional\n };\n }\n\n _getDefaultTextForState(state: StepState): string {\n if (state == 'number') {\n return `${this.index + 1}`;\n }\n if (state == 'edit') {\n return 'create';\n }\n if (state == 'error') {\n return 'warning';\n }\n return state;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material steppers.\n * @docs-private\n */\nexport const matStepperAnimations: {\n readonly horizontalStepTransition: AnimationTriggerMetadata;\n readonly verticalStepTransition: AnimationTriggerMetadata;\n} = {\n /** Animation that transitions the step along the X axis in a horizontal stepper. */\n horizontalStepTransition: trigger('stepTransition', [\n state('previous', style({transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden'})),\n state('current', style({transform: 'none', visibility: 'visible'})),\n state('next', style({transform: 'translate3d(100%, 0, 0)', visibility: 'hidden'})),\n transition('* => *', animate('500ms cubic-bezier(0.35, 0, 0.25, 1)'))\n ]),\n\n /** Animation that transitions the step along the Y axis in a vertical stepper. */\n verticalStepTransition: trigger('stepTransition', [\n state('previous', style({height: '0px', visibility: 'hidden'})),\n state('next', style({height: '0px', visibility: 'hidden'})),\n state('current', style({height: '*', visibility: 'visible'})),\n transition('* <=> current', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, Input, TemplateRef} from '@angular/core';\nimport {StepState} from '@angular/cdk/stepper';\n\n/** Template context available to an attached `matStepperIcon`. */\nexport interface MatStepperIconContext {\n /** Index of the step. */\n index: number;\n /** Whether the step is currently active. */\n active: boolean;\n /** Whether the step is optional. */\n optional: boolean;\n}\n\n/**\n * Template to be used to override the icons inside the step header.\n */\n@Directive({\n selector: 'ng-template[matStepperIcon]',\n})\nexport class MatStepperIcon {\n /** Name of the icon to be overridden. */\n @Input('matStepperIcon') name: StepState;\n\n constructor(public templateRef: TemplateRef<MatStepperIconContext>) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {\n CdkStep,\n CdkStepper,\n StepContentPositionState,\n STEPPER_GLOBAL_OPTIONS,\n StepperOptions\n} from '@angular/cdk/stepper';\nimport {AnimationEvent} from '@angular/animations';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n Optional,\n Output,\n QueryList,\n SkipSelf,\n TemplateRef,\n ViewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport {FormControl, FormGroupDirective, NgForm} from '@angular/forms';\nimport {DOCUMENT} from '@angular/common';\nimport {ErrorStateMatcher} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {takeUntil, distinctUntilChanged} from 'rxjs/operators';\n\nimport {MatStepHeader} from './step-header';\nimport {MatStepLabel} from './step-label';\nimport {matStepperAnimations} from './stepper-animations';\nimport {MatStepperIcon, MatStepperIconContext} from './stepper-icon';\n\n@Component({\n moduleId: module.id,\n selector: 'mat-step',\n templateUrl: 'step.html',\n providers: [{provide: ErrorStateMatcher, useExisting: MatStep}],\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matStep',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatStep extends CdkStep implements ErrorStateMatcher {\n /** Content for step label given by `<ng-template matStepLabel>`. */\n @ContentChild(MatStepLabel, {static: false}) stepLabel: MatStepLabel;\n\n /** @breaking-change 8.0.0 remove the `?` after `stepperOptions` */\n constructor(@Inject(forwardRef(() => MatStepper)) stepper: MatStepper,\n @SkipSelf() private _errorStateMatcher: ErrorStateMatcher,\n @Optional() @Inject(STEPPER_GLOBAL_OPTIONS) stepperOptions?: StepperOptions) {\n super(stepper, stepperOptions);\n }\n\n /** Custom error state matcher that additionally checks for validity of interacted form. */\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n const originalErrorState = this._errorStateMatcher.isErrorState(control, form);\n\n // Custom error state checks for the validity of form that is not submitted or touched\n // since user can trigger a form change by calling for another step without directly\n // interacting with the current form.\n const customErrorState = !!(control && control.invalid && this.interacted);\n\n return originalErrorState || customErrorState;\n }\n}\n\n\n@Directive({selector: '[matStepper]', providers: [{provide: CdkStepper, useExisting: MatStepper}]})\nexport class MatStepper extends CdkStepper implements AfterContentInit {\n /** The list of step headers of the steps in the stepper. */\n @ViewChildren(MatStepHeader) _stepHeader: QueryList<MatStepHeader>;\n\n /** Steps that the stepper holds. */\n @ContentChildren(MatStep) _steps: QueryList<MatStep>;\n\n /** Custom icon overrides passed in by the consumer. */\n @ContentChildren(MatStepperIcon) _icons: QueryList<MatStepperIcon>;\n\n /** Event emitted when the current step is done transitioning in. */\n @Output() readonly animationDone: EventEmitter<void> = new EventEmitter<void>();\n\n /** Whether ripples should be disabled for the step headers. */\n @Input() disableRipple: boolean;\n\n /** Consumer-specified template-refs to be used to override the header icons. */\n _iconOverrides: {[key: string]: TemplateRef<MatStepperIconContext>} = {};\n\n /** Stream of animation `done` events when the body expands/collapses. */\n _animationDone = new Subject<AnimationEvent>();\n\n ngAfterContentInit() {\n this._icons.forEach(({name, templateRef}) => this._iconOverrides[name] = templateRef);\n\n // Mark the component for change detection whenever the content children query changes\n this._steps.changes.pipe(takeUntil(this._destroyed)).subscribe(() => this._stateChanged());\n\n this._animationDone.pipe(\n // This needs a `distinctUntilChanged` in order to avoid emitting the same event twice due\n // to a bug in animations where the `.done` callback gets invoked twice on some browsers.\n // See https://github.com/angular/angular/issues/24084\n distinctUntilChanged((x, y) => x.fromState === y.fromState && x.toState === y.toState),\n takeUntil(this._destroyed)\n ).subscribe(event => {\n if ((event.toState as StepContentPositionState) === 'current') {\n this.animationDone.emit();\n }\n });\n }\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-horizontal-stepper',\n exportAs: 'matHorizontalStepper',\n templateUrl: 'stepper-horizontal.html',\n styleUrls: ['stepper.css'],\n inputs: ['selectedIndex'],\n host: {\n 'class': 'mat-stepper-horizontal',\n '[class.mat-stepper-label-position-end]': 'labelPosition == \"end\"',\n '[class.mat-stepper-label-position-bottom]': 'labelPosition == \"bottom\"',\n 'aria-orientation': 'horizontal',\n 'role': 'tablist',\n },\n animations: [matStepperAnimations.horizontalStepTransition],\n providers: [\n {provide: MatStepper, useExisting: MatHorizontalStepper},\n {provide: CdkStepper, useExisting: MatHorizontalStepper}\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatHorizontalStepper extends MatStepper {\n /** Whether the label should display in bottom or end position. */\n @Input()\n labelPosition: 'bottom' | 'end' = 'end';\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-vertical-stepper',\n exportAs: 'matVerticalStepper',\n templateUrl: 'stepper-vertical.html',\n styleUrls: ['stepper.css'],\n inputs: ['selectedIndex'],\n host: {\n 'class': 'mat-stepper-vertical',\n 'aria-orientation': 'vertical',\n 'role': 'tablist',\n },\n animations: [matStepperAnimations.verticalStepTransition],\n providers: [\n {provide: MatStepper, useExisting: MatVerticalStepper},\n {provide: CdkStepper, useExisting: MatVerticalStepper}\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatVerticalStepper extends MatStepper {\n constructor(\n @Optional() dir: Directionality,\n changeDetectorRef: ChangeDetectorRef,\n // @breaking-change 8.0.0 `elementRef` and `_document` parameters to become required.\n elementRef?: ElementRef<HTMLElement>,\n @Inject(DOCUMENT) _document?: any) {\n super(dir, changeDetectorRef, elementRef, _document);\n this._orientation = 'vertical';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkStepperNext, CdkStepperPrevious} from '@angular/cdk/stepper';\nimport {Directive} from '@angular/core';\n\n/** Button that moves to the next step in a stepper workflow. */\n@Directive({\n selector: 'button[matStepperNext]',\n host: {\n '[type]': 'type',\n },\n inputs: ['type']\n})\nexport class MatStepperNext extends CdkStepperNext {\n}\n\n/** Button that moves to the previous step in a stepper workflow. */\n@Directive({\n selector: 'button[matStepperPrevious]',\n host: {\n '[type]': 'type',\n },\n inputs: ['type']\n})\nexport class MatStepperPrevious extends CdkStepperPrevious {\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CdkStepperModule} from '@angular/cdk/stepper';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ErrorStateMatcher, MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatStepHeader} from './step-header';\nimport {MatStepLabel} from './step-label';\nimport {MatHorizontalStepper, MatStep, MatStepper, MatVerticalStepper} from './stepper';\nimport {MatStepperNext, MatStepperPrevious} from './stepper-button';\nimport {MatStepperIcon} from './stepper-icon';\nimport {MAT_STEPPER_INTL_PROVIDER} from './stepper-intl';\n\n\n@NgModule({\n imports: [\n MatCommonModule,\n CommonModule,\n PortalModule,\n MatButtonModule,\n CdkStepperModule,\n MatIconModule,\n MatRippleModule,\n ],\n exports: [\n MatCommonModule,\n MatHorizontalStepper,\n MatVerticalStepper,\n MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n ],\n declarations: [\n MatHorizontalStepper,\n MatVerticalStepper,\n MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n ],\n providers: [MAT_STEPPER_INTL_PROVIDER, ErrorStateMatcher],\n})\nexport class MatStepperModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CDK_TABLE_TEMPLATE, CdkTable} from '@angular/cdk/table';\nimport {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core';\n\n/**\n * Wrapper for the CdkTable with Material design styles.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-table, table[mat-table]',\n exportAs: 'matTable',\n template: CDK_TABLE_TEMPLATE,\n styleUrls: ['table.css'],\n host: {\n 'class': 'mat-table',\n },\n providers: [{provide: CdkTable, useExisting: MatTable}],\n encapsulation: ViewEncapsulation.None,\n // See note on CdkTable for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class MatTable<T> extends CdkTable<T> {\n /** Overrides the sticky CSS class set by the `CdkTable`. */\n protected stickyCssClass = 'mat-table-sticky';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef, Input} from '@angular/core';\nimport {\n CdkCell,\n CdkCellDef,\n CdkColumnDef, CdkFooterCell, CdkFooterCellDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n} from '@angular/cdk/table';\n\n/**\n * Cell definition for the mat-table.\n * Captures the template of a column's data row cell as well as cell-specific properties.\n */\n@Directive({\n selector: '[matCellDef]',\n providers: [{provide: CdkCellDef, useExisting: MatCellDef}]\n})\nexport class MatCellDef extends CdkCellDef {}\n\n/**\n * Header cell definition for the mat-table.\n * Captures the template of a column's header cell and as well as cell-specific properties.\n */\n@Directive({\n selector: '[matHeaderCellDef]',\n providers: [{provide: CdkHeaderCellDef, useExisting: MatHeaderCellDef}]\n})\nexport class MatHeaderCellDef extends CdkHeaderCellDef {}\n\n/**\n * Footer cell definition for the mat-table.\n * Captures the template of a column's footer cell and as well as cell-specific properties.\n */\n@Directive({\n selector: '[matFooterCellDef]',\n providers: [{provide: CdkFooterCellDef, useExisting: MatFooterCellDef}]\n})\nexport class MatFooterCellDef extends CdkFooterCellDef {}\n\n/**\n * Column definition for the mat-table.\n * Defines a set of cells available for a table column.\n */\n@Directive({\n selector: '[matColumnDef]',\n providers: [\n {provide: CdkColumnDef, useExisting: MatColumnDef},\n {provide: 'MAT_SORT_HEADER_COLUMN_DEF', useExisting: MatColumnDef}\n ],\n})\nexport class MatColumnDef extends CdkColumnDef {\n /** Unique name for this column. */\n @Input('matColumnDef') name: string;\n\n /** Whether this column should be sticky positioned at the start of the row */\n @Input() sticky: boolean;\n\n /** Whether this column should be sticky positioned on the end of the row */\n @Input() stickyEnd: boolean;\n}\n\n/** Header cell template container that adds the right classes and role. */\n@Directive({\n selector: 'mat-header-cell, th[mat-header-cell]',\n host: {\n 'class': 'mat-header-cell',\n 'role': 'columnheader',\n },\n})\nexport class MatHeaderCell extends CdkHeaderCell {\n constructor(columnDef: CdkColumnDef,\n elementRef: ElementRef<HTMLElement>) {\n super(columnDef, elementRef);\n elementRef.nativeElement.classList.add(`mat-column-${columnDef.cssClassFriendlyName}`);\n }\n}\n\n/** Footer cell template container that adds the right classes and role. */\n@Directive({\n selector: 'mat-footer-cell, td[mat-footer-cell]',\n host: {\n 'class': 'mat-footer-cell',\n 'role': 'gridcell',\n },\n})\nexport class MatFooterCell extends CdkFooterCell {\n constructor(columnDef: CdkColumnDef,\n elementRef: ElementRef) {\n super(columnDef, elementRef);\n elementRef.nativeElement.classList.add(`mat-column-${columnDef.cssClassFriendlyName}`);\n }\n}\n\n/** Cell template container that adds the right classes and role. */\n@Directive({\n selector: 'mat-cell, td[mat-cell]',\n host: {\n 'class': 'mat-cell',\n 'role': 'gridcell',\n },\n})\nexport class MatCell extends CdkCell {\n constructor(columnDef: CdkColumnDef,\n elementRef: ElementRef<HTMLElement>) {\n super(columnDef, elementRef);\n elementRef.nativeElement.classList.add(`mat-column-${columnDef.cssClassFriendlyName}`);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n CDK_ROW_TEMPLATE,\n CdkFooterRow,\n CdkFooterRowDef,\n CdkHeaderRow,\n CdkHeaderRowDef,\n CdkRow,\n CdkRowDef\n} from '@angular/cdk/table';\nimport {ChangeDetectionStrategy, Component, Directive, ViewEncapsulation} from '@angular/core';\n\n/**\n * Header row definition for the mat-table.\n * Captures the header row's template and other header properties such as the columns to display.\n */\n@Directive({\n selector: '[matHeaderRowDef]',\n providers: [{provide: CdkHeaderRowDef, useExisting: MatHeaderRowDef}],\n inputs: ['columns: matHeaderRowDef', 'sticky: matHeaderRowDefSticky'],\n})\nexport class MatHeaderRowDef extends CdkHeaderRowDef {\n}\n\n/**\n * Footer row definition for the mat-table.\n * Captures the footer row's template and other footer properties such as the columns to display.\n */\n@Directive({\n selector: '[matFooterRowDef]',\n providers: [{provide: CdkFooterRowDef, useExisting: MatFooterRowDef}],\n inputs: ['columns: matFooterRowDef', 'sticky: matFooterRowDefSticky'],\n})\nexport class MatFooterRowDef extends CdkFooterRowDef {\n}\n\n/**\n * Data row definition for the mat-table.\n * Captures the data row's template and other properties such as the columns to display and\n * a when predicate that describes when this row should be used.\n */\n@Directive({\n selector: '[matRowDef]',\n providers: [{provide: CdkRowDef, useExisting: MatRowDef}],\n inputs: ['columns: matRowDefColumns', 'when: matRowDefWhen'],\n})\nexport class MatRowDef<T> extends CdkRowDef<T> {\n}\n\n/** Footer template container that contains the cell outlet. Adds the right class and role. */\n@Component({\n moduleId: module.id,\n selector: 'mat-header-row, tr[mat-header-row]',\n template: CDK_ROW_TEMPLATE,\n host: {\n 'class': 'mat-header-row',\n 'role': 'row',\n },\n // See note on CdkTable for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matHeaderRow',\n providers: [{provide: CdkHeaderRow, useExisting: MatHeaderRow}],\n})\nexport class MatHeaderRow extends CdkHeaderRow {\n}\n\n/** Footer template container that contains the cell outlet. Adds the right class and role. */\n@Component({\n moduleId: module.id,\n selector: 'mat-footer-row, tr[mat-footer-row]',\n template: CDK_ROW_TEMPLATE,\n host: {\n 'class': 'mat-footer-row',\n 'role': 'row',\n },\n // See note on CdkTable for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matFooterRow',\n providers: [{provide: CdkFooterRow, useExisting: MatFooterRow}],\n})\nexport class MatFooterRow extends CdkFooterRow {\n}\n\n/** Data row template container that contains the cell outlet. Adds the right class and role. */\n@Component({\n moduleId: module.id,\n selector: 'mat-row, tr[mat-row]',\n template: CDK_ROW_TEMPLATE,\n host: {\n 'class': 'mat-row',\n 'role': 'row',\n },\n // See note on CdkTable for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matRow',\n providers: [{provide: CdkRow, useExisting: MatRow}],\n})\nexport class MatRow extends CdkRow {\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkTextColumn} from '@angular/cdk/table';\nimport {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core';\n\n/**\n * Column that simply shows text content for the header and row cells. Assumes that the table\n * is using the native table implementation (`<table>`).\n *\n * By default, the name of this column will be the header text and data property accessor.\n * The header text can be overridden with the `headerText` input. Cell values can be overridden with\n * the `dataAccessor` input. Change the text justification to the start or end using the `justify`\n * input.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-text-column',\n template: `\n <ng-container matColumnDef>\n <th mat-header-cell *matHeaderCellDef [style.text-align]=\"justify\">\n {{headerText}}\n </th>\n <td mat-cell *matCellDef=\"let data\" [style.text-align]=\"justify\">\n {{dataAccessor(data, name)}}\n </td>\n </ng-container>\n `,\n encapsulation: ViewEncapsulation.None,\n // Change detection is intentionally not set to OnPush. This component's template will be provided\n // to the table to be inserted into its view. This is problematic when change detection runs since\n // the bindings in this template will be evaluated _after_ the table's view is evaluated, which\n // mean's the template in the table's view will not have the updated value (and in fact will cause\n // an ExpressionChangedAfterItHasBeenCheckedError).\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class MatTextColumn<T> extends CdkTextColumn<T> {\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatTable} from './table';\nimport {CdkTableModule} from '@angular/cdk/table';\nimport {\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFooterCell,\n MatFooterCellDef,\n MatHeaderCell,\n MatHeaderCellDef\n} from './cell';\nimport {\n MatFooterRow,\n MatFooterRowDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatRow,\n MatRowDef\n} from './row';\nimport {MatTextColumn} from './text-column';\nimport {CommonModule} from '@angular/common';\nimport {MatCommonModule} from '@angular/material/core';\n\nconst EXPORTED_DECLARATIONS = [\n // Table\n MatTable,\n\n // Template defs\n MatHeaderCellDef,\n MatHeaderRowDef,\n MatColumnDef,\n MatCellDef,\n MatRowDef,\n MatFooterCellDef,\n MatFooterRowDef,\n\n // Cell directives\n MatHeaderCell,\n MatCell,\n MatFooterCell,\n\n // Row directives\n MatHeaderRow,\n MatRow,\n MatFooterRow,\n\n MatTextColumn,\n];\n\n@NgModule({\n imports: [\n CdkTableModule,\n CommonModule,\n MatCommonModule,\n ],\n exports: EXPORTED_DECLARATIONS,\n declarations: EXPORTED_DECLARATIONS,\n})\nexport class MatTableModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion';\nimport {\n DOWN_ARROW,\n END,\n HOME,\n LEFT_ARROW,\n PAGE_DOWN,\n PAGE_UP,\n RIGHT_ARROW,\n UP_ARROW,\n hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n CanColor,\n CanColorCtor,\n CanDisable,\n CanDisableCtor,\n HammerInput,\n HasTabIndex,\n HasTabIndexCtor,\n mixinColor,\n mixinDisabled,\n mixinTabIndex,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {Subscription} from 'rxjs';\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 */\nconst MIN_AUTO_TICK_SEPARATION = 30;\n\n/** The thumb gap size for a disabled slider. */\nconst DISABLED_THUMB_GAP = 7;\n\n/** The thumb gap size for a non-active slider at its minimum value. */\nconst MIN_VALUE_NONACTIVE_THUMB_GAP = 7;\n\n/** The thumb gap size for an active slider at its minimum value. */\nconst MIN_VALUE_ACTIVE_THUMB_GAP = 10;\n\n/**\n * Provider Expression that allows mat-slider to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)] and [formControl].\n * @docs-private\n */\nexport const MAT_SLIDER_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSlider),\n multi: true\n};\n\n/** A simple change event emitted by the MatSlider component. */\nexport class MatSliderChange {\n /** The MatSlider that changed. */\n source: MatSlider;\n\n /** The new value of the source slider. */\n value: number | null;\n}\n\n\n// Boilerplate for applying mixins to MatSlider.\n/** @docs-private */\nclass MatSliderBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatSliderMixinBase:\n HasTabIndexCtor &\n CanColorCtor &\n CanDisableCtor &\n typeof MatSliderBase =\n mixinTabIndex(mixinColor(mixinDisabled(MatSliderBase), 'accent'));\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 */\n@Component({\n moduleId: module.id,\n selector: 'mat-slider',\n exportAs: 'matSlider',\n providers: [MAT_SLIDER_VALUE_ACCESSOR],\n host: {\n '(focus)': '_onFocus()',\n '(blur)': '_onBlur()',\n '(mousedown)': '_onMousedown($event)',\n '(keydown)': '_onKeydown($event)',\n '(keyup)': '_onKeyup()',\n '(mouseenter)': '_onMouseenter()',\n '(slide)': '_onSlide($event)',\n '(slideend)': '_onSlideEnd()',\n '(slidestart)': '_onSlideStart($event)',\n 'class': 'mat-slider',\n 'role': 'slider',\n '[tabIndex]': 'tabIndex',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-valuemax]': 'max',\n '[attr.aria-valuemin]': 'min',\n '[attr.aria-valuenow]': 'value',\n '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n '[class.mat-slider-disabled]': 'disabled',\n '[class.mat-slider-has-ticks]': 'tickInterval',\n '[class.mat-slider-horizontal]': '!vertical',\n '[class.mat-slider-axis-inverted]': '_invertAxis',\n '[class.mat-slider-sliding]': '_isSliding',\n '[class.mat-slider-thumb-label-showing]': 'thumbLabel',\n '[class.mat-slider-vertical]': 'vertical',\n '[class.mat-slider-min-value]': '_isMinValue',\n '[class.mat-slider-hide-last-tick]': 'disabled || _isMinValue && _thumbGap && _invertAxis',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n },\n templateUrl: 'slider.html',\n styleUrls: ['slider.css'],\n inputs: ['disabled', 'color', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatSlider extends _MatSliderMixinBase\n implements ControlValueAccessor, OnDestroy, CanDisable, CanColor, OnInit, HasTabIndex {\n /** Whether the slider is inverted. */\n @Input()\n get invert(): boolean { return this._invert; }\n set invert(value: boolean) {\n this._invert = coerceBooleanProperty(value);\n }\n private _invert = false;\n\n /** The maximum value that the slider can have. */\n @Input()\n get max(): number { return this._max; }\n set max(v: number) {\n this._max = coerceNumberProperty(v, this._max);\n this._percent = this._calculatePercentage(this._value);\n\n // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n private _max: number = 100;\n\n /** The minimum value that the slider can have. */\n @Input()\n get min(): number { return this._min; }\n set min(v: number) {\n this._min = coerceNumberProperty(v, this._min);\n\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 // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n private _min: number = 0;\n\n /** The values at which the thumb will snap. */\n @Input()\n get step(): number { return this._step; }\n set step(v: number) {\n this._step = coerceNumberProperty(v, this._step);\n\n if (this._step % 1 !== 0) {\n this._roundToDecimal = this._step.toString().split('.').pop()!.length;\n }\n\n // Since this could modify the label, we need to notify the change detection.\n this._changeDetectorRef.markForCheck();\n }\n private _step: number = 1;\n\n /** Whether or not to show the thumb label. */\n @Input()\n get thumbLabel(): boolean { return this._thumbLabel; }\n set thumbLabel(value: boolean) { this._thumbLabel = coerceBooleanProperty(value); }\n private _thumbLabel: boolean = false;\n\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 @Input()\n get tickInterval() { return this._tickInterval; }\n set tickInterval(value: 'auto' | number) {\n if (value === 'auto') {\n this._tickInterval = 'auto';\n } else if (typeof value === 'number' || typeof value === 'string') {\n this._tickInterval = coerceNumberProperty(value, this._tickInterval as number);\n } else {\n this._tickInterval = 0;\n }\n }\n private _tickInterval: 'auto' | number = 0;\n\n /** Value of the slider. */\n @Input()\n get value(): number | null {\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 value(v: number | null) {\n if (v !== this._value) {\n let value = coerceNumberProperty(v);\n\n // While incrementing by a decimal we can end up with values like 33.300000000000004.\n // Truncate it to ensure that it matches the label and to make it easier to work with.\n if (this._roundToDecimal) {\n value = parseFloat(value.toFixed(this._roundToDecimal));\n }\n\n this._value = value;\n this._percent = this._calculatePercentage(this._value);\n\n // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n }\n private _value: number | null = null;\n\n /**\n * Function that will be used to format the value before it is displayed\n * in the thumb label. Can be used to format very large number in order\n * for them to fit into the slider thumb.\n */\n @Input() displayWith: (value: number | null) => string | number;\n\n /** Whether the slider is vertical. */\n @Input()\n get vertical(): boolean { return this._vertical; }\n set vertical(value: boolean) {\n this._vertical = coerceBooleanProperty(value);\n }\n private _vertical = false;\n\n /** Event emitted when the slider value has changed. */\n @Output() readonly change: EventEmitter<MatSliderChange> = new EventEmitter<MatSliderChange>();\n\n /** Event emitted when the slider thumb moves. */\n @Output() readonly input: EventEmitter<MatSliderChange> = new EventEmitter<MatSliderChange>();\n\n /**\n * Emits when the raw value of the slider changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n @Output() readonly valueChange: EventEmitter<number | null> = new EventEmitter<number | null>();\n\n /** The value to be used for display purposes. */\n get displayValue(): string | number {\n if (this.displayWith) {\n return this.displayWith(this.value);\n }\n\n // Note that this could be improved further by rounding something like 0.999 to 1 or\n // 0.899 to 0.9, however it is very performance sensitive, because it gets called on\n // every change detection cycle.\n if (this._roundToDecimal && this.value && this.value % 1 !== 0) {\n return this.value.toFixed(this._roundToDecimal);\n }\n\n return this.value || 0;\n }\n\n /** set focus to the host element */\n focus() {\n this._focusHostElement();\n }\n\n /** blur the host element */\n blur() {\n this._blurHostElement();\n }\n\n /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n onTouched: () => any = () => {};\n\n /** The percentage of the slider that coincides with the value. */\n get percent(): number { return this._clamp(this._percent); }\n private _percent: number = 0;\n\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 _isSliding: boolean = false;\n\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 _isActive: boolean = false;\n\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 _invertAxis() {\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\n\n /** Whether the slider is at its minimum value. */\n get _isMinValue() {\n return this.percent === 0;\n }\n\n /**\n * The amount of space to leave between the slider thumb and the track fill & track background\n * elements.\n */\n get _thumbGap() {\n if (this.disabled) {\n return DISABLED_THUMB_GAP;\n }\n if (this._isMinValue && !this.thumbLabel) {\n return this._isActive ? MIN_VALUE_ACTIVE_THUMB_GAP : MIN_VALUE_NONACTIVE_THUMB_GAP;\n }\n return 0;\n }\n\n /** CSS styles for the track background element. */\n get _trackBackgroundStyles(): { [key: string]: string } {\n const axis = this.vertical ? 'Y' : 'X';\n const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;\n const sign = this._shouldInvertMouseCoords() ? '-' : '';\n\n return {\n // scale3d avoids some rendering issues in Chrome. See #12071.\n transform: `translate${axis}(${sign}${this._thumbGap}px) scale3d(${scale})`\n };\n }\n\n /** CSS styles for the track fill element. */\n get _trackFillStyles(): { [key: string]: string } {\n const axis = this.vertical ? 'Y' : 'X';\n const scale = this.vertical ? `1, ${this.percent}, 1` : `${this.percent}, 1, 1`;\n const sign = this._shouldInvertMouseCoords() ? '' : '-';\n\n return {\n // scale3d avoids some rendering issues in Chrome. See #12071.\n transform: `translate${axis}(${sign}${this._thumbGap}px) scale3d(${scale})`\n };\n }\n\n /** CSS styles for the ticks container element. */\n get _ticksContainerStyles(): { [key: string]: string } {\n let 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 let sign = !this.vertical && this._getDirection() == 'rtl' ? '' : '-';\n let offset = this._tickIntervalPercent / 2 * 100;\n return {\n 'transform': `translate${axis}(${sign}${offset}%)`\n };\n }\n\n /** CSS styles for the ticks element. */\n get _ticksStyles(): { [key: string]: string } {\n let tickSize = this._tickIntervalPercent * 100;\n let backgroundSize = this.vertical ? `2px ${tickSize}%` : `${tickSize}% 2px`;\n let 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 let sign = !this.vertical && this._getDirection() == 'rtl' ? '-' : '';\n let rotate = !this.vertical && this._getDirection() == 'rtl' ? ' rotate(180deg)' : '';\n let styles: { [key: string]: string } = {\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 if (this._isMinValue && this._thumbGap) {\n let side = this.vertical ?\n (this._invertAxis ? 'Bottom' : 'Top') :\n (this._invertAxis ? 'Right' : 'Left');\n styles[`padding${side}`] = `${this._thumbGap}px`;\n }\n\n return styles;\n }\n\n get _thumbContainerStyles(): { [key: string]: string } {\n let 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 let invertOffset =\n (this._getDirection() == 'rtl' && !this.vertical) ? !this._invertAxis : this._invertAxis;\n let offset = (invertOffset ? this.percent : 1 - this.percent) * 100;\n return {\n 'transform': `translate${axis}(-${offset}%)`\n };\n }\n\n /** The size of a tick interval as a percentage of the size of the track. */\n private _tickIntervalPercent: number = 0;\n\n /** The dimensions of the slider. */\n private _sliderDimensions: ClientRect | null = null;\n\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n /** Decimal places to round to, based on the step amount. */\n private _roundToDecimal: number;\n\n /** Subscription to the Directionality change EventEmitter. */\n private _dirChangeSubscription = Subscription.EMPTY;\n\n /** The value of the slider when the slide start event fires. */\n private _valueOnSlideStart: number | null;\n\n /** Reference to the inner slider wrapper element. */\n @ViewChild('sliderWrapper', {static: false}) private _sliderWrapper: ElementRef;\n\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 private _shouldInvertMouseCoords() {\n return (this._getDirection() == 'rtl' && !this.vertical) ? !this._invertAxis : this._invertAxis;\n }\n\n /** The language direction for this slider element. */\n private _getDirection() {\n return (this._dir && this._dir.value == 'rtl') ? 'rtl' : 'ltr';\n }\n\n constructor(elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _changeDetectorRef: ChangeDetectorRef,\n @Optional() private _dir: Directionality,\n @Attribute('tabindex') tabIndex: string,\n // @breaking-change 8.0.0 `_animationMode` parameter to be made required.\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n super(elementRef);\n\n this.tabIndex = parseInt(tabIndex) || 0;\n }\n\n ngOnInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe((origin: FocusOrigin) => {\n this._isActive = !!origin && origin !== 'keyboard';\n this._changeDetectorRef.detectChanges();\n });\n if (this._dir) {\n this._dirChangeSubscription = this._dir.change.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._dirChangeSubscription.unsubscribe();\n }\n\n _onMouseenter() {\n if (this.disabled) {\n return;\n }\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._getSliderDimensions();\n this._updateTickIntervalPercent();\n }\n\n _onMousedown(event: MouseEvent) {\n // Don't do anything if the slider is disabled or the\n // user is using anything other than the main mouse button.\n if (this.disabled || event.button !== 0) {\n return;\n }\n\n const oldValue = this.value;\n this._isSliding = false;\n this._focusHostElement();\n this._updateValueFromPosition({x: event.clientX, y: event.clientY});\n\n // Emit a change and input event if the value changed.\n if (oldValue != this.value) {\n this._emitInputEvent();\n this._emitChangeEvent();\n }\n }\n\n _onSlide(event: HammerInput) {\n if (this.disabled) {\n return;\n }\n\n // The slide start event sometimes fails to fire on iOS, so if we're not already in the sliding\n // state, call the slide start handler manually.\n if (!this._isSliding) {\n this._onSlideStart(null);\n }\n\n // Prevent the slide from selecting anything else.\n event.preventDefault();\n\n let oldValue = this.value;\n this._updateValueFromPosition({x: event.center.x, y: event.center.y});\n\n // Native range elements always emit `input` events when the value changed while sliding.\n if (oldValue != this.value) {\n this._emitInputEvent();\n }\n }\n\n _onSlideStart(event: HammerInput | null) {\n if (this.disabled || this._isSliding) {\n return;\n }\n\n // Simulate mouseenter in case this is a mobile device.\n this._onMouseenter();\n\n this._isSliding = true;\n this._focusHostElement();\n this._valueOnSlideStart = this.value;\n\n if (event) {\n this._updateValueFromPosition({x: event.center.x, y: event.center.y});\n event.preventDefault();\n }\n }\n\n _onSlideEnd() {\n this._isSliding = false;\n\n if (this._valueOnSlideStart != this.value && !this.disabled) {\n this._emitChangeEvent();\n }\n this._valueOnSlideStart = null;\n }\n\n _onFocus() {\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._getSliderDimensions();\n this._updateTickIntervalPercent();\n }\n\n _onBlur() {\n this.onTouched();\n }\n\n _onKeydown(event: KeyboardEvent) {\n if (this.disabled || hasModifierKey(event)) {\n return;\n }\n\n const oldValue = this.value;\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._getDirection() == '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._getDirection() == '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\n if (oldValue != this.value) {\n this._emitInputEvent();\n this._emitChangeEvent();\n }\n\n this._isSliding = true;\n event.preventDefault();\n }\n\n _onKeyup() {\n this._isSliding = false;\n }\n\n /** Increments the slider by the given number of steps (negative number decrements). */\n private _increment(numSteps: number) {\n this.value = this._clamp((this.value || 0) + this.step * numSteps, this.min, this.max);\n }\n\n /** Calculate the new value from the new physical location. The value will always be snapped. */\n private _updateValueFromPosition(pos: {x: number, y: number}) {\n if (!this._sliderDimensions) {\n return;\n }\n\n let offset = this.vertical ? this._sliderDimensions.top : this._sliderDimensions.left;\n let size = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n let posComponent = this.vertical ? pos.y : pos.x;\n\n // The exact value is calculated from the event and used to find the closest snap value.\n let percent = this._clamp((posComponent - offset) / size);\n\n if (this._shouldInvertMouseCoords()) {\n percent = 1 - percent;\n }\n\n // Since the steps may not divide cleanly into the max value, if the user\n // slid to 0 or 100 percent, we jump to the min/max value. This approach\n // is slightly more intuitive than using `Math.ceil` below, because it\n // follows the user's pointer closer.\n if (percent === 0) {\n this.value = this.min;\n } else if (percent === 1) {\n this.value = this.max;\n } else {\n const exactValue = this._calculateValue(percent);\n\n // This calculation finds the closest step by finding the closest\n // whole number divisible by the step relative to the min.\n const closestValue = Math.round((exactValue - this.min) / this.step) * this.step + this.min;\n\n // The value needs to snap to the min and max.\n this.value = this._clamp(closestValue, this.min, this.max);\n }\n }\n\n /** Emits a change event if the current value is different from the last emitted value. */\n private _emitChangeEvent() {\n this._controlValueAccessorChangeFn(this.value);\n this.valueChange.emit(this.value);\n this.change.emit(this._createChangeEvent());\n }\n\n /** Emits an input event when the current value is different from the last emitted value. */\n private _emitInputEvent() {\n this.input.emit(this._createChangeEvent());\n }\n\n /** Updates the amount of space between ticks as a percentage of the width of the slider. */\n private _updateTickIntervalPercent() {\n if (!this.tickInterval || !this._sliderDimensions) {\n return;\n }\n\n if (this.tickInterval == 'auto') {\n let trackSize = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n let pixelsPerStep = trackSize * this.step / (this.max - this.min);\n let stepsPerTick = Math.ceil(MIN_AUTO_TICK_SEPARATION / pixelsPerStep);\n let pixelsPerTick = stepsPerTick * this.step;\n this._tickIntervalPercent = pixelsPerTick / trackSize;\n } else {\n this._tickIntervalPercent = this.tickInterval * this.step / (this.max - this.min);\n }\n }\n\n /** Creates a slider change object from the specified value. */\n private _createChangeEvent(value = this.value): MatSliderChange {\n let event = new MatSliderChange();\n\n event.source = this;\n event.value = value;\n\n return event;\n }\n\n /** Calculates the percentage of the slider that a value is. */\n private _calculatePercentage(value: number | null) {\n return ((value || 0) - this.min) / (this.max - this.min);\n }\n\n /** Calculates the value a percentage of the slider corresponds to. */\n private _calculateValue(percentage: number) {\n return this.min + percentage * (this.max - this.min);\n }\n\n /** Return a number between two numbers. */\n private _clamp(value: number, min = 0, max = 1) {\n return Math.max(min, Math.min(value, max));\n }\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 private _getSliderDimensions() {\n return this._sliderWrapper ? this._sliderWrapper.nativeElement.getBoundingClientRect() : null;\n }\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 private _focusHostElement() {\n this._elementRef.nativeElement.focus();\n }\n\n /** Blurs the native element. */\n private _blurHostElement() {\n this._elementRef.nativeElement.blur();\n }\n\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value\n */\n writeValue(value: any) {\n this.value = value;\n }\n\n /**\n * Registers a callback to be triggered when the value has changed.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\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 registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n /**\n * Sets whether the component should be disabled.\n * Implemented as part of ControlValueAccessor.\n * @param isDisabled\n */\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {GestureConfig, MatCommonModule} from '@angular/material/core';\nimport {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';\nimport {MatSlider} from './slider';\n\n\n@NgModule({\n imports: [CommonModule, MatCommonModule],\n exports: [MatSlider, MatCommonModule],\n declarations: [MatSlider],\n providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}]\n})\nexport class MatSliderModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayRef} from '@angular/cdk/overlay';\nimport {Observable, Subject} from 'rxjs';\nimport {MatSnackBarContainer} from './snack-bar-container';\n\n\n/** Event that is emitted when a snack bar is dismissed. */\nexport interface MatSnackBarDismiss {\n /** Whether the snack bar was dismissed using the action button. */\n dismissedByAction: boolean;\n}\n\n/**\n * Reference to a snack bar dispatched from the snack bar service.\n */\nexport class MatSnackBarRef<T> {\n /** The instance of the component making up the content of the snack bar. */\n instance: T;\n\n /**\n * The instance of the component making up the content of the snack bar.\n * @docs-private\n */\n containerInstance: MatSnackBarContainer;\n\n /** Subject for notifying the user that the snack bar has been dismissed. */\n private readonly _afterDismissed = new Subject<MatSnackBarDismiss>();\n\n /** Subject for notifying the user that the snack bar has opened and appeared. */\n private readonly _afterOpened = new Subject<void>();\n\n /** Subject for notifying the user that the snack bar action was called. */\n private readonly _onAction = new Subject<void>();\n\n /**\n * Timeout ID for the duration setTimeout call. Used to clear the timeout if the snackbar is\n * dismissed before the duration passes.\n */\n private _durationTimeoutId: number;\n\n /** Whether the snack bar was dismissed using the action button. */\n private _dismissedByAction = false;\n\n constructor(containerInstance: MatSnackBarContainer,\n private _overlayRef: OverlayRef) {\n this.containerInstance = containerInstance;\n // Dismiss snackbar on action.\n this.onAction().subscribe(() => this.dismiss());\n containerInstance._onExit.subscribe(() => this._finishDismiss());\n }\n\n /** Dismisses the snack bar. */\n dismiss(): void {\n if (!this._afterDismissed.closed) {\n this.containerInstance.exit();\n }\n clearTimeout(this._durationTimeoutId);\n }\n\n /** Marks the snackbar action clicked. */\n dismissWithAction(): void {\n if (!this._onAction.closed) {\n this._dismissedByAction = true;\n this._onAction.next();\n this._onAction.complete();\n }\n }\n\n\n /**\n * Marks the snackbar action clicked.\n * @deprecated Use `dismissWithAction` instead.\n * @breaking-change 8.0.0\n */\n closeWithAction(): void {\n this.dismissWithAction();\n }\n\n /** Dismisses the snack bar after some duration */\n _dismissAfter(duration: number): void {\n this._durationTimeoutId = setTimeout(() => this.dismiss(), duration);\n }\n\n /** Marks the snackbar as opened */\n _open(): void {\n if (!this._afterOpened.closed) {\n this._afterOpened.next();\n this._afterOpened.complete();\n }\n }\n\n /** Cleans up the DOM after closing. */\n private _finishDismiss(): void {\n this._overlayRef.dispose();\n\n if (!this._onAction.closed) {\n this._onAction.complete();\n }\n\n this._afterDismissed.next({dismissedByAction: this._dismissedByAction});\n this._afterDismissed.complete();\n this._dismissedByAction = false;\n }\n\n /** Gets an observable that is notified when the snack bar is finished closing. */\n afterDismissed(): Observable<MatSnackBarDismiss> {\n return this._afterDismissed.asObservable();\n }\n\n /** Gets an observable that is notified when the snack bar has opened and appeared. */\n afterOpened(): Observable<void> {\n return this.containerInstance._onEnter;\n }\n\n /** Gets an observable that is notified when the snack bar action is called. */\n onAction(): Observable<void> {\n return this._onAction.asObservable();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ViewContainerRef, InjectionToken} from '@angular/core';\nimport {AriaLivePoliteness} from '@angular/cdk/a11y';\nimport {Direction} from '@angular/cdk/bidi';\n\n/** Injection token that can be used to access the data that was passed in to a snack bar. */\nexport const MAT_SNACK_BAR_DATA = new InjectionToken<any>('MatSnackBarData');\n\n/** Possible values for horizontalPosition on MatSnackBarConfig. */\nexport type MatSnackBarHorizontalPosition = 'start' | 'center' | 'end' | 'left' | 'right';\n\n/** Possible values for verticalPosition on MatSnackBarConfig. */\nexport type MatSnackBarVerticalPosition = 'top' | 'bottom';\n\n/**\n * Configuration used when opening a snack-bar.\n */\nexport class MatSnackBarConfig<D = any> {\n /** The politeness level for the MatAriaLiveAnnouncer announcement. */\n politeness?: AriaLivePoliteness = 'assertive';\n\n /**\n * Message to be announced by the LiveAnnouncer. When opening a snackbar without a custom\n * component or template, the announcement message will default to the specified message.\n */\n announcementMessage?: string = '';\n\n /** The view container to place the overlay for the snack bar into. */\n viewContainerRef?: ViewContainerRef;\n\n /** The length of time in milliseconds to wait before automatically dismissing the snack bar. */\n duration?: number = 0;\n\n /** Extra CSS classes to be added to the snack bar container. */\n panelClass?: string | string[];\n\n /** Text layout direction for the snack bar. */\n direction?: Direction;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n /** The horizontal position to place the snack bar. */\n horizontalPosition?: MatSnackBarHorizontalPosition = 'center';\n\n /** The vertical position to place the snack bar. */\n verticalPosition?: MatSnackBarVerticalPosition = 'bottom';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Component, ViewEncapsulation, Inject, ChangeDetectionStrategy} from '@angular/core';\nimport {MatSnackBarRef} from './snack-bar-ref';\nimport {MAT_SNACK_BAR_DATA} from './snack-bar-config';\n\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 */\n@Component({\n moduleId: module.id,\n selector: 'simple-snack-bar',\n templateUrl: 'simple-snack-bar.html',\n styleUrls: ['simple-snack-bar.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'mat-simple-snackbar',\n }\n})\nexport class SimpleSnackBar {\n /** Data that was injected into the snack bar. */\n data: {message: string, action: string};\n\n constructor(\n public snackBarRef: MatSnackBarRef<SimpleSnackBar>,\n @Inject(MAT_SNACK_BAR_DATA) data: any) {\n this.data = data;\n }\n\n /** Performs the action on the snack bar. */\n action(): void {\n this.snackBarRef.dismissWithAction();\n }\n\n /** If the action button should be shown. */\n get hasAction(): boolean {\n return !!this.data.action;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material snack bar.\n * @docs-private\n */\nexport const matSnackBarAnimations: {\n readonly snackBarState: AnimationTriggerMetadata;\n} = {\n /** Animation that shows and hides a snack bar. */\n snackBarState: trigger('state', [\n state('void, hidden', style({\n transform: 'scale(0.8)',\n opacity: 0,\n })),\n state('visible', style({\n transform: 'scale(1)',\n opacity: 1,\n })),\n transition('* => visible', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),\n transition('* => void, * => hidden', animate('75ms cubic-bezier(0.4, 0.0, 1, 1)', style({\n opacity: 0\n }))),\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {AnimationEvent} from '@angular/animations';\nimport {\n BasePortalOutlet,\n CdkPortalOutlet,\n ComponentPortal,\n TemplatePortal,\n} from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n NgZone,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {take} from 'rxjs/operators';\nimport {matSnackBarAnimations} from './snack-bar-animations';\nimport {MatSnackBarConfig} from './snack-bar-config';\n\n\n/**\n * Internal component that wraps user-provided snack bar content.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'snack-bar-container',\n templateUrl: 'snack-bar-container.html',\n styleUrls: ['snack-bar-container.css'],\n // In Ivy embedded views will be change detected from their declaration place, rather than\n // where they were stamped out. This means that we can't have the snack bar container be OnPush,\n // because it might cause snack bars that were opened from a template not to be out of date.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n animations: [matSnackBarAnimations.snackBarState],\n host: {\n '[attr.role]': '_role',\n 'class': 'mat-snack-bar-container',\n '[@state]': '_animationState',\n '(@state.done)': 'onAnimationEnd($event)'\n },\n})\nexport class MatSnackBarContainer extends BasePortalOutlet implements OnDestroy {\n /** Whether the component has been destroyed. */\n private _destroyed = false;\n\n /** The portal outlet inside of this container into which the snack bar content will be loaded. */\n @ViewChild(CdkPortalOutlet, {static: true}) _portalOutlet: CdkPortalOutlet;\n\n /** Subject for notifying that the snack bar has exited from view. */\n readonly _onExit: Subject<any> = new Subject();\n\n /** Subject for notifying that the snack bar has finished entering the view. */\n readonly _onEnter: Subject<any> = new Subject();\n\n /** The state of the snack bar animations. */\n _animationState = 'void';\n\n /** ARIA role for the snack bar container. */\n _role: 'alert' | 'status' | null;\n\n constructor(\n private _ngZone: NgZone,\n private _elementRef: ElementRef<HTMLElement>,\n private _changeDetectorRef: ChangeDetectorRef,\n /** The snack bar configuration. */\n public snackBarConfig: MatSnackBarConfig) {\n\n super();\n\n // Based on the ARIA spec, `alert` and `status` roles have an\n // implicit `assertive` and `polite` politeness respectively.\n if (snackBarConfig.politeness === 'assertive' && !snackBarConfig.announcementMessage) {\n this._role = 'alert';\n } else if (snackBarConfig.politeness === 'off') {\n this._role = null;\n } else {\n this._role = 'status';\n }\n }\n\n /** Attach a component portal as content to this snack bar container. */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n this._assertNotAttached();\n this._applySnackBarClasses();\n return this._portalOutlet.attachComponentPortal(portal);\n }\n\n /** Attach a template portal as content to this snack bar container. */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n this._assertNotAttached();\n this._applySnackBarClasses();\n return this._portalOutlet.attachTemplatePortal(portal);\n }\n\n /** Handle end of animations, updating the state of the snackbar. */\n onAnimationEnd(event: AnimationEvent) {\n const {fromState, toState} = event;\n\n if ((toState === 'void' && fromState !== 'void') || toState === 'hidden') {\n this._completeExit();\n }\n\n if (toState === 'visible') {\n // Note: we shouldn't use `this` inside the zone callback,\n // because it can cause a memory leak.\n const onEnter = this._onEnter;\n\n this._ngZone.run(() => {\n onEnter.next();\n onEnter.complete();\n });\n }\n }\n\n /** Begin animation of snack bar entrance into view. */\n enter(): void {\n if (!this._destroyed) {\n this._animationState = 'visible';\n this._changeDetectorRef.detectChanges();\n }\n }\n\n /** Begin animation of the snack bar exiting from view. */\n exit(): Observable<void> {\n // Note: this one transitions to `hidden`, rather than `void`, in order to handle the case\n // where multiple snack bars are opened in quick succession (e.g. two consecutive calls to\n // `MatSnackBar.open`).\n this._animationState = 'hidden';\n return this._onExit;\n }\n\n /** Makes sure the exit callbacks have been invoked when the element is destroyed. */\n ngOnDestroy() {\n this._destroyed = true;\n this._completeExit();\n }\n\n /**\n * Waits 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 */\n private _completeExit() {\n this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1)).subscribe(() => {\n this._onExit.next();\n this._onExit.complete();\n });\n }\n\n /** Applies the various positioning and user-configured CSS classes to the snack bar. */\n private _applySnackBarClasses() {\n const element: HTMLElement = this._elementRef.nativeElement;\n const panelClasses = this.snackBarConfig.panelClass;\n\n if (panelClasses) {\n if (Array.isArray(panelClasses)) {\n // Note that we can't use a spread here, because IE doesn't support multiple arguments.\n panelClasses.forEach(cssClass => element.classList.add(cssClass));\n } else {\n element.classList.add(panelClasses);\n }\n }\n\n if (this.snackBarConfig.horizontalPosition === 'center') {\n element.classList.add('mat-snack-bar-center');\n }\n\n if (this.snackBarConfig.verticalPosition === 'top') {\n element.classList.add('mat-snack-bar-top');\n }\n }\n\n /** Asserts that no content is already attached to the container. */\n private _assertNotAttached() {\n if (this._portalOutlet.hasAttached()) {\n throw Error('Attempting to attach snack bar content after content is already attached');\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {SimpleSnackBar} from './simple-snack-bar';\nimport {MatSnackBarContainer} from './snack-bar-container';\n\n\n@NgModule({\n imports: [\n OverlayModule,\n PortalModule,\n CommonModule,\n MatButtonModule,\n MatCommonModule,\n ],\n exports: [MatSnackBarContainer, MatCommonModule],\n declarations: [MatSnackBarContainer, SimpleSnackBar],\n entryComponents: [MatSnackBarContainer, SimpleSnackBar],\n})\nexport class MatSnackBarModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {LiveAnnouncer} from '@angular/cdk/a11y';\nimport {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';\nimport {Overlay, OverlayConfig, OverlayRef} from '@angular/cdk/overlay';\nimport {ComponentPortal, ComponentType, PortalInjector, TemplatePortal} from '@angular/cdk/portal';\nimport {\n ComponentRef,\n EmbeddedViewRef,\n Inject,\n Injectable,\n InjectionToken,\n Injector,\n Optional,\n SkipSelf,\n TemplateRef,\n OnDestroy,\n} from '@angular/core';\nimport {take, takeUntil} from 'rxjs/operators';\nimport {SimpleSnackBar} from './simple-snack-bar';\nimport {MAT_SNACK_BAR_DATA, MatSnackBarConfig} from './snack-bar-config';\nimport {MatSnackBarContainer} from './snack-bar-container';\nimport {MatSnackBarModule} from './snack-bar-module';\nimport {MatSnackBarRef} from './snack-bar-ref';\n\n\n/** Injection token that can be used to specify default snack bar. */\nexport const MAT_SNACK_BAR_DEFAULT_OPTIONS =\n new InjectionToken<MatSnackBarConfig>('mat-snack-bar-default-options', {\n providedIn: 'root',\n factory: MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY(): MatSnackBarConfig {\n return new MatSnackBarConfig();\n}\n\n/**\n * Service to dispatch Material Design snack bar messages.\n */\n@Injectable({providedIn: MatSnackBarModule})\nexport class MatSnackBar implements OnDestroy {\n /**\n * Reference to the current snack bar in the view *at this level* (in the Angular injector tree).\n * If there is a parent snack-bar service, all operations should delegate to that parent\n * via `_openedSnackBarRef`.\n */\n private _snackBarRefAtThisLevel: MatSnackBarRef<any> | null = null;\n\n /** Reference to the currently opened snackbar at *any* level. */\n get _openedSnackBarRef(): MatSnackBarRef<any> | null {\n const parent = this._parentSnackBar;\n return parent ? parent._openedSnackBarRef : this._snackBarRefAtThisLevel;\n }\n\n set _openedSnackBarRef(value: MatSnackBarRef<any> | null) {\n if (this._parentSnackBar) {\n this._parentSnackBar._openedSnackBarRef = value;\n } else {\n this._snackBarRefAtThisLevel = value;\n }\n }\n\n constructor(\n private _overlay: Overlay,\n private _live: LiveAnnouncer,\n private _injector: Injector,\n private _breakpointObserver: BreakpointObserver,\n @Optional() @SkipSelf() private _parentSnackBar: MatSnackBar,\n @Inject(MAT_SNACK_BAR_DEFAULT_OPTIONS) private _defaultConfig: MatSnackBarConfig) {}\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 openFromComponent<T>(component: ComponentType<T>, config?: MatSnackBarConfig):\n MatSnackBarRef<T> {\n return this._attach(component, config) as MatSnackBarRef<T>;\n }\n\n /**\n * Creates and dispatches a snack bar with a custom template for the content, removing any\n * currently opened snack bars.\n *\n * @param template Template to be instantiated.\n * @param config Extra configuration for the snack bar.\n */\n openFromTemplate(template: TemplateRef<any>, config?: MatSnackBarConfig):\n MatSnackBarRef<EmbeddedViewRef<any>> {\n return this._attach(template, config);\n }\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 open(message: string, action: string = '', config?: MatSnackBarConfig):\n MatSnackBarRef<SimpleSnackBar> {\n const _config = {...this._defaultConfig, ...config};\n\n // Since the user doesn't have access to the component, we can\n // override the data to pass in our own message and action.\n _config.data = {message, action};\n\n if (!_config.announcementMessage) {\n _config.announcementMessage = message;\n }\n\n return this.openFromComponent(SimpleSnackBar, _config);\n }\n\n /**\n * Dismisses the currently-visible snack bar.\n */\n dismiss(): void {\n if (this._openedSnackBarRef) {\n this._openedSnackBarRef.dismiss();\n }\n }\n\n ngOnDestroy() {\n // Only dismiss the snack bar at the current level on destroy.\n if (this._snackBarRefAtThisLevel) {\n this._snackBarRefAtThisLevel.dismiss();\n }\n }\n\n /**\n * Attaches the snack bar container component to the overlay.\n */\n private _attachSnackBarContainer(overlayRef: OverlayRef,\n config: MatSnackBarConfig): MatSnackBarContainer {\n\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n const injector = new PortalInjector(userInjector || this._injector, new WeakMap([\n [MatSnackBarConfig, config]\n ]));\n\n const containerPortal =\n new ComponentPortal(MatSnackBarContainer, config.viewContainerRef, injector);\n const containerRef: ComponentRef<MatSnackBarContainer> = overlayRef.attach(containerPortal);\n containerRef.instance.snackBarConfig = config;\n return containerRef.instance;\n }\n\n /**\n * Places a new component or a template as the content of the snack bar container.\n */\n private _attach<T>(content: ComponentType<T> | TemplateRef<T>, userConfig?: MatSnackBarConfig):\n MatSnackBarRef<T | EmbeddedViewRef<any>> {\n\n const config = {...new MatSnackBarConfig(), ...this._defaultConfig, ...userConfig};\n const overlayRef = this._createOverlay(config);\n const container = this._attachSnackBarContainer(overlayRef, config);\n const snackBarRef = new MatSnackBarRef<T | EmbeddedViewRef<any>>(container, overlayRef);\n\n if (content instanceof TemplateRef) {\n const portal = new TemplatePortal(content, null!, {\n $implicit: config.data,\n snackBarRef\n } as any);\n\n snackBarRef.instance = container.attachTemplatePortal(portal);\n } else {\n const injector = this._createInjector(config, snackBarRef);\n const portal = new ComponentPortal(content, undefined, injector);\n const contentRef = container.attachComponentPortal<T>(portal);\n\n // We can't pass this via the injector, because the injector is created earlier.\n snackBarRef.instance = contentRef.instance;\n }\n\n // Subscribe to the breakpoint observer and attach the mat-snack-bar-handset class as\n // appropriate. This class is applied to the overlay element because the overlay must expand to\n // fill the width of the screen for full width snackbars.\n this._breakpointObserver.observe(Breakpoints.Handset).pipe(\n takeUntil(overlayRef.detachments().pipe(take(1)))\n ).subscribe(state => {\n if (state.matches) {\n overlayRef.overlayElement.classList.add('mat-snack-bar-handset');\n } else {\n overlayRef.overlayElement.classList.remove('mat-snack-bar-handset');\n }\n });\n\n this._animateSnackBar(snackBarRef, config);\n this._openedSnackBarRef = snackBarRef;\n return this._openedSnackBarRef;\n }\n\n /** Animates the old snack bar out and the new one in. */\n private _animateSnackBar(snackBarRef: MatSnackBarRef<any>, config: MatSnackBarConfig) {\n // When the snackbar is dismissed, clear the reference to it.\n snackBarRef.afterDismissed().subscribe(() => {\n // Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.\n if (this._openedSnackBarRef == snackBarRef) {\n this._openedSnackBarRef = null;\n }\n\n if (config.announcementMessage) {\n this._live.clear();\n }\n });\n\n if (this._openedSnackBarRef) {\n // If a snack bar is already in view, dismiss it and enter the\n // new snack bar after exit animation is complete.\n this._openedSnackBarRef.afterDismissed().subscribe(() => {\n snackBarRef.containerInstance.enter();\n });\n this._openedSnackBarRef.dismiss();\n } else {\n // If no snack bar is in view, enter the new snack bar.\n snackBarRef.containerInstance.enter();\n }\n\n // If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.\n if (config.duration && config.duration > 0) {\n snackBarRef.afterOpened().subscribe(() => snackBarRef._dismissAfter(config.duration!));\n }\n\n if (config.announcementMessage) {\n this._live.announce(config.announcementMessage, config.politeness);\n }\n }\n\n /**\n * Creates a new overlay and places it in the correct location.\n * @param config The user-specified snack bar config.\n */\n private _createOverlay(config: MatSnackBarConfig): OverlayRef {\n const overlayConfig = new OverlayConfig();\n overlayConfig.direction = config.direction;\n\n let positionStrategy = this._overlay.position().global();\n // Set horizontal position.\n const isRtl = config.direction === 'rtl';\n const isLeft = (\n config.horizontalPosition === 'left' ||\n (config.horizontalPosition === 'start' && !isRtl) ||\n (config.horizontalPosition === 'end' && isRtl));\n const isRight = !isLeft && config.horizontalPosition !== 'center';\n if (isLeft) {\n positionStrategy.left('0');\n } else if (isRight) {\n positionStrategy.right('0');\n } else {\n positionStrategy.centerHorizontally();\n }\n // Set horizontal position.\n if (config.verticalPosition === 'top') {\n positionStrategy.top('0');\n } else {\n positionStrategy.bottom('0');\n }\n\n overlayConfig.positionStrategy = positionStrategy;\n return this._overlay.create(overlayConfig);\n }\n\n /**\n * Creates an injector to be used inside of a snack bar component.\n * @param config Config that was used to create the snack bar.\n * @param snackBarRef Reference to the snack bar.\n */\n private _createInjector<T>(\n config: MatSnackBarConfig,\n snackBarRef: MatSnackBarRef<T>): PortalInjector {\n\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n\n return new PortalInjector(userInjector || this._injector, new WeakMap<any, any>([\n [MatSnackBarRef, snackBarRef],\n [MAT_SNACK_BAR_DATA, config.data]\n ]));\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n Directive,\n EventEmitter,\n Input,\n isDevMode,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport {\n CanDisable,\n CanDisableCtor,\n HasInitialized,\n HasInitializedCtor,\n mixinDisabled,\n mixinInitialized,\n} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {SortDirection} from './sort-direction';\nimport {\n getSortDuplicateSortableIdError,\n getSortHeaderMissingIdError,\n getSortInvalidDirectionError,\n} from './sort-errors';\n\n/** Interface for a directive that holds sorting state consumed by `MatSortHeader`. */\nexport interface MatSortable {\n /** The id of the column being sorted. */\n id: string;\n\n /** Starting sort direction. */\n start: 'asc' | 'desc';\n\n /** Whether to disable clearing the sorting state. */\n disableClear: boolean;\n}\n\n/** The current sort state. */\nexport interface Sort {\n /** The id of the column being sorted. */\n active: string;\n\n /** The sort direction. */\n direction: SortDirection;\n}\n\n// Boilerplate for applying mixins to MatSort.\n/** @docs-private */\nclass MatSortBase {}\nconst _MatSortMixinBase: HasInitializedCtor & CanDisableCtor & typeof MatSortBase =\n mixinInitialized(mixinDisabled(MatSortBase));\n\n/** Container for MatSortables to manage the sort state and provide default sort parameters. */\n@Directive({\n selector: '[matSort]',\n exportAs: 'matSort',\n inputs: ['disabled: matSortDisabled']\n})\nexport class MatSort extends _MatSortMixinBase\n implements CanDisable, HasInitialized, OnChanges, OnDestroy, OnInit {\n /** Collection of all registered sortables that this directive manages. */\n sortables = new Map<string, MatSortable>();\n\n /** Used to notify any child components listening to state changes. */\n readonly _stateChanges = new Subject<void>();\n\n /** The id of the most recently sorted MatSortable. */\n @Input('matSortActive') active: string;\n\n /**\n * The direction to set when an MatSortable is initially sorted.\n * May be overriden by the MatSortable's sort start.\n */\n @Input('matSortStart') start: 'asc' | 'desc' = 'asc';\n\n /** The sort direction of the currently active MatSortable. */\n @Input('matSortDirection')\n get direction(): SortDirection { return this._direction; }\n set direction(direction: SortDirection) {\n if (isDevMode() && direction && direction !== 'asc' && direction !== 'desc') {\n throw getSortInvalidDirectionError(direction);\n }\n this._direction = direction;\n }\n private _direction: SortDirection = '';\n\n /**\n * Whether to disable the user from clearing the sort by finishing the sort direction cycle.\n * May be overriden by the MatSortable's disable clear input.\n */\n @Input('matSortDisableClear')\n get disableClear(): boolean { return this._disableClear; }\n set disableClear(v: boolean) { this._disableClear = coerceBooleanProperty(v); }\n private _disableClear: boolean;\n\n /** Event emitted when the user changes either the active sort or sort direction. */\n @Output('matSortChange') readonly sortChange: EventEmitter<Sort> = new EventEmitter<Sort>();\n\n /**\n * Register function to be used by the contained MatSortables. Adds the MatSortable to the\n * collection of MatSortables.\n */\n register(sortable: MatSortable): void {\n if (!sortable.id) {\n throw getSortHeaderMissingIdError();\n }\n\n if (this.sortables.has(sortable.id)) {\n throw getSortDuplicateSortableIdError(sortable.id);\n }\n this.sortables.set(sortable.id, sortable);\n }\n\n /**\n * Unregister function to be used by the contained MatSortables. Removes the MatSortable from the\n * collection of contained MatSortables.\n */\n deregister(sortable: MatSortable): void {\n this.sortables.delete(sortable.id);\n }\n\n /** Sets the active sort id and determines the new sort direction. */\n sort(sortable: MatSortable): void {\n if (this.active != sortable.id) {\n this.active = sortable.id;\n this.direction = sortable.start ? sortable.start : this.start;\n } else {\n this.direction = this.getNextSortDirection(sortable);\n }\n\n this.sortChange.emit({active: this.active, direction: this.direction});\n }\n\n /** Returns the next sort direction of the active sortable, checking for potential overrides. */\n getNextSortDirection(sortable: MatSortable): SortDirection {\n if (!sortable) { return ''; }\n\n // Get the sort direction cycle with the potential sortable overrides.\n const disableClear = sortable.disableClear != null ? sortable.disableClear : this.disableClear;\n let sortDirectionCycle = getSortDirectionCycle(sortable.start || this.start, disableClear);\n\n // Get and return the next direction in the cycle\n let nextDirectionIndex = sortDirectionCycle.indexOf(this.direction) + 1;\n if (nextDirectionIndex >= sortDirectionCycle.length) { nextDirectionIndex = 0; }\n return sortDirectionCycle[nextDirectionIndex];\n }\n\n ngOnInit() {\n this._markInitialized();\n }\n\n ngOnChanges() {\n this._stateChanges.next();\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n}\n\n/** Returns the sort direction cycle to use given the provided parameters of order and clear. */\nfunction getSortDirectionCycle(start: 'asc' | 'desc',\n disableClear: boolean): SortDirection[] {\n let sortOrder: SortDirection[] = ['asc', 'desc'];\n if (start == 'desc') { sortOrder.reverse(); }\n if (!disableClear) { sortOrder.push(''); }\n\n return sortOrder;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n keyframes,\n AnimationTriggerMetadata, query, animateChild,\n} from '@angular/animations';\nimport {AnimationCurves, AnimationDurations} from '@angular/material/core';\n\nconst SORT_ANIMATION_TRANSITION = AnimationDurations.ENTERING + ' ' +\n AnimationCurves.STANDARD_CURVE;\n\n/**\n * Animations used by MatSort.\n * @docs-private\n */\nexport const matSortAnimations: {\n readonly indicator: AnimationTriggerMetadata;\n readonly leftPointer: AnimationTriggerMetadata;\n readonly rightPointer: AnimationTriggerMetadata;\n readonly arrowOpacity: AnimationTriggerMetadata;\n readonly arrowPosition: AnimationTriggerMetadata;\n readonly allowChildren: AnimationTriggerMetadata;\n} = {\n /** Animation that moves the sort indicator. */\n indicator: trigger('indicator', [\n state('active-asc, asc', style({transform: 'translateY(0px)'})),\n // 10px is the height of the sort indicator, minus the width of the pointers\n state('active-desc, desc', style({transform: 'translateY(10px)'})),\n transition('active-asc <=> active-desc', animate(SORT_ANIMATION_TRANSITION))\n ]),\n\n /** Animation that rotates the left pointer of the indicator based on the sorting direction. */\n leftPointer: trigger('leftPointer', [\n state('active-asc, asc', style({transform: 'rotate(-45deg)'})),\n state('active-desc, desc', style({transform: 'rotate(45deg)'})),\n transition('active-asc <=> active-desc', animate(SORT_ANIMATION_TRANSITION))\n ]),\n\n /** Animation that rotates the right pointer of the indicator based on the sorting direction. */\n rightPointer: trigger('rightPointer', [\n state('active-asc, asc', style({transform: 'rotate(45deg)'})),\n state('active-desc, desc', style({transform: 'rotate(-45deg)'})),\n transition('active-asc <=> active-desc', animate(SORT_ANIMATION_TRANSITION))\n ]),\n\n /** Animation that controls the arrow opacity. */\n arrowOpacity: trigger('arrowOpacity', [\n state('desc-to-active, asc-to-active, active', style({opacity: 1})),\n state('desc-to-hint, asc-to-hint, hint', style({opacity: .54})),\n state('hint-to-desc, active-to-desc, desc, hint-to-asc, active-to-asc, asc, void',\n style({opacity: 0})),\n // Transition between all states except for immediate transitions\n transition('* => asc, * => desc, * => active, * => hint, * => void', animate('0ms')),\n transition('* <=> *', animate(SORT_ANIMATION_TRANSITION)),\n ]),\n\n /**\n * Animation for the translation of the arrow as a whole. States are separated into two\n * groups: ones with animations and others that are immediate. Immediate states are asc, desc,\n * peek, and active. The other states define a specific animation (source-to-destination)\n * and are determined as a function of their prev user-perceived state and what the next state\n * should be.\n */\n arrowPosition: trigger('arrowPosition', [\n // Hidden Above => Hint Center\n transition('* => desc-to-hint, * => desc-to-active',\n animate(SORT_ANIMATION_TRANSITION, keyframes([\n style({transform: 'translateY(-25%)'}),\n style({transform: 'translateY(0)'})\n ]))),\n // Hint Center => Hidden Below\n transition('* => hint-to-desc, * => active-to-desc',\n animate(SORT_ANIMATION_TRANSITION, keyframes([\n style({transform: 'translateY(0)'}),\n style({transform: 'translateY(25%)'})\n ]))),\n // Hidden Below => Hint Center\n transition('* => asc-to-hint, * => asc-to-active',\n animate(SORT_ANIMATION_TRANSITION, keyframes([\n style({transform: 'translateY(25%)'}),\n style({transform: 'translateY(0)'})\n ]))),\n // Hint Center => Hidden Above\n transition('* => hint-to-asc, * => active-to-asc',\n animate(SORT_ANIMATION_TRANSITION, keyframes([\n style({transform: 'translateY(0)'}),\n style({transform: 'translateY(-25%)'})\n ]))),\n state('desc-to-hint, asc-to-hint, hint, desc-to-active, asc-to-active, active',\n style({transform: 'translateY(0)'})),\n state('hint-to-desc, active-to-desc, desc',\n style({transform: 'translateY(-25%)'})),\n state('hint-to-asc, active-to-asc, asc',\n style({transform: 'translateY(25%)'})),\n ]),\n\n /** Necessary trigger that calls animate on children animations. */\n allowChildren: trigger('allowChildren', [\n transition('* <=> *', [\n query('@*', animateChild(), {optional: true})\n ])\n ]),\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, SkipSelf, Optional} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n/**\n * To modify the labels and text displayed, create a new instance of MatSortHeaderIntl and\n * include it in a custom provider.\n */\n@Injectable({providedIn: 'root'})\nexport class MatSortHeaderIntl {\n /**\n * Stream that emits whenever the labels here are changed. Use this to notify\n * components if the labels have changed after initialization.\n */\n readonly changes: Subject<void> = new Subject<void>();\n\n /** ARIA label for the sorting button. */\n sortButtonLabel = (id: string) => {\n return `Change sorting for ${id}`;\n }\n}\n/** @docs-private */\nexport function MAT_SORT_HEADER_INTL_PROVIDER_FACTORY(parentIntl: MatSortHeaderIntl) {\n return parentIntl || new MatSortHeaderIntl();\n}\n\n/** @docs-private */\nexport const MAT_SORT_HEADER_INTL_PROVIDER = {\n // If there is already an MatSortHeaderIntl available, use that. Otherwise, provide a new one.\n provide: MatSortHeaderIntl,\n deps: [[new Optional(), new SkipSelf(), MatSortHeaderIntl]],\n useFactory: MAT_SORT_HEADER_INTL_PROVIDER_FACTORY\n};\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {AnimationEvent} from '@angular/animations';\nimport {FocusMonitor, FocusOrigin, FocusTrap, FocusTrapFactory} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {Platform} from '@angular/cdk/platform';\nimport {CdkScrollable, ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling';\nimport {DOCUMENT} from '@angular/common';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n DoCheck,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n HostListener,\n HostBinding,\n} from '@angular/core';\nimport {fromEvent, merge, Observable, Subject} from 'rxjs';\nimport {\n debounceTime,\n filter,\n map,\n startWith,\n take,\n takeUntil,\n distinctUntilChanged,\n} from 'rxjs/operators';\nimport {matDrawerAnimations} from './drawer-animations';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/**\n * Throws an exception when two MatDrawer are matching the same position.\n * @docs-private\n */\nexport function throwMatDuplicatedDrawerError(position: string) {\n throw Error(`A drawer was already declared for 'position=\"${position}\"'`);\n}\n\n\n/** Result of the toggle promise that indicates the state of the drawer. */\nexport type MatDrawerToggleResult = 'open' | 'close';\n\n/** Configures whether drawers should use auto sizing by default. */\nexport const MAT_DRAWER_DEFAULT_AUTOSIZE =\n new InjectionToken<boolean>('MAT_DRAWER_DEFAULT_AUTOSIZE', {\n providedIn: 'root',\n factory: MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY,\n });\n\n/** @docs-private */\nexport function MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY(): boolean {\n return false;\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-drawer-content',\n template: '<ng-content></ng-content>',\n host: {\n 'class': 'mat-drawer-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatDrawerContent extends CdkScrollable implements AfterContentInit {\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(forwardRef(() => MatDrawerContainer)) public _container: MatDrawerContainer,\n elementRef: ElementRef<HTMLElement>,\n scrollDispatcher: ScrollDispatcher,\n ngZone: NgZone) {\n super(elementRef, scrollDispatcher, ngZone);\n }\n\n ngAfterContentInit() {\n this._container._contentMarginChanges.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\n\n\n/**\n * This component corresponds to a drawer that can be opened on the drawer container.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-drawer',\n exportAs: 'matDrawer',\n templateUrl: 'drawer.html',\n animations: [matDrawerAnimations.transformDrawer],\n host: {\n 'class': 'mat-drawer',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n 'tabIndex': '-1',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatDrawer implements AfterContentInit, AfterContentChecked, OnDestroy {\n private _focusTrap: FocusTrap;\n private _elementFocusedBeforeDrawerWasOpened: HTMLElement | null = null;\n\n /** Whether the drawer is initialized. Used for disabling the initial animation. */\n private _enableAnimations = false;\n\n /** The side that the drawer is attached to. */\n @Input()\n get position(): 'start' | 'end' { return this._position; }\n set position(value: 'start' | 'end') {\n // Make sure we have a valid value.\n value = value === 'end' ? 'end' : 'start';\n if (value != this._position) {\n this._position = value;\n this.onPositionChanged.emit();\n }\n }\n private _position: 'start' | 'end' = 'start';\n\n /** Mode of the drawer; one of 'over', 'push' or 'side'. */\n @Input()\n get mode(): 'over' | 'push' | 'side' { return this._mode; }\n set mode(value: 'over' | 'push' | 'side') {\n this._mode = value;\n this._modeChanged.next();\n }\n private _mode: 'over' | 'push' | 'side' = 'over';\n\n /** Whether the drawer can be closed with the escape key or by clicking on the backdrop. */\n @Input()\n get disableClose(): boolean { return this._disableClose; }\n set disableClose(value: boolean) { this._disableClose = coerceBooleanProperty(value); }\n private _disableClose: boolean = false;\n\n /** Whether the drawer should focus the first focusable element automatically when opened. */\n @Input()\n get autoFocus(): boolean { return this._autoFocus; }\n set autoFocus(value: boolean) { this._autoFocus = coerceBooleanProperty(value); }\n private _autoFocus: boolean = true;\n\n /** How the sidenav was opened (keypress, mouse click etc.) */\n private _openedVia: FocusOrigin | null;\n\n /** Emits whenever the drawer has started animating. */\n _animationStarted = new Subject<AnimationEvent>();\n\n /** Emits whenever the drawer is done animating. */\n _animationEnd = new Subject<AnimationEvent>();\n\n /** Current state of the sidenav animation. */\n // @HostBinding is used in the class as it is expected to be extended. Since @Component decorator\n // metadata is not inherited by child classes, instead the host binding data is defined in a way\n // that can be inherited.\n // tslint:disable:no-host-decorator-in-concrete\n @HostBinding('@transform')\n _animationState: 'open-instant' | 'open' | 'void' = 'void';\n\n /** Event emitted when the drawer open state is changed. */\n @Output() readonly openedChange: EventEmitter<boolean> =\n // Note this has to be async in order to avoid some issues with two-bindings (see #8872).\n new EventEmitter<boolean>(/* isAsync */true);\n\n /** Event emitted when the drawer has been opened. */\n @Output('opened')\n get _openedStream(): Observable<void> {\n return this.openedChange.pipe(filter(o => o), map(() => {}));\n }\n\n /** Event emitted when the drawer has started opening. */\n @Output()\n get openedStart(): Observable<void> {\n return this._animationStarted.pipe(\n filter(e => e.fromState !== e.toState && e.toState.indexOf('open') === 0),\n map(() => {})\n );\n }\n\n /** Event emitted when the drawer has been closed. */\n @Output('closed')\n get _closedStream(): Observable<void> {\n return this.openedChange.pipe(filter(o => !o), map(() => {}));\n }\n\n /** Event emitted when the drawer has started closing. */\n @Output()\n get closedStart(): Observable<void> {\n return this._animationStarted.pipe(\n filter(e => e.fromState !== e.toState && e.toState === 'void'),\n map(() => {})\n );\n }\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n /** Event emitted when the drawer's position changes. */\n // tslint:disable-next-line:no-output-on-prefix\n @Output('positionChanged') onPositionChanged: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * An observable that emits when the drawer mode changes. This is used by the drawer container to\n * to know when to when the mode changes so it can adapt the margins on the content.\n */\n readonly _modeChanged = new Subject();\n\n get _isFocusTrapEnabled(): boolean {\n // The focus trap is only enabled when the drawer is open in any mode other than side.\n return this.opened && this.mode !== 'side';\n }\n\n constructor(private _elementRef: ElementRef<HTMLElement>,\n private _focusTrapFactory: FocusTrapFactory,\n private _focusMonitor: FocusMonitor,\n private _platform: Platform,\n private _ngZone: NgZone,\n @Optional() @Inject(DOCUMENT) private _doc: any) {\n\n this.openedChange.subscribe((opened: boolean) => {\n if (opened) {\n if (this._doc) {\n this._elementFocusedBeforeDrawerWasOpened = this._doc.activeElement as HTMLElement;\n }\n\n if (this._isFocusTrapEnabled && this._focusTrap) {\n this._trapFocus();\n }\n } else {\n this._restoreFocus();\n }\n });\n\n /**\n * Listen to `keydown` events outside the zone so that change detection is not run every\n * time a key is pressed. Instead we re-enter the zone only if the `ESC` key is pressed\n * and we don't have close disabled.\n */\n this._ngZone.runOutsideAngular(() => {\n (fromEvent(this._elementRef.nativeElement, 'keydown') as Observable<KeyboardEvent>).pipe(\n filter(event => {\n return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);\n }),\n takeUntil(this._destroyed)\n ).subscribe(event => this._ngZone.run(() => {\n this.close();\n event.stopPropagation();\n event.preventDefault();\n }));\n });\n\n // We need a Subject with distinctUntilChanged, because the `done` event\n // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\n this._animationEnd.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe((event: AnimationEvent) => {\n const {fromState, toState} = event;\n\n if ((toState.indexOf('open') === 0 && fromState === 'void') ||\n (toState === 'void' && fromState.indexOf('open') === 0)) {\n this.openedChange.emit(this._opened);\n }\n });\n }\n\n /** Traps focus inside the drawer. */\n private _trapFocus() {\n if (!this.autoFocus) {\n return;\n }\n\n this._focusTrap.focusInitialElementWhenReady().then(hasMovedFocus => {\n // If there were no focusable elements, focus the sidenav itself so the keyboard navigation\n // still works. We need to check that `focus` is a function due to Universal.\n if (!hasMovedFocus && typeof this._elementRef.nativeElement.focus === 'function') {\n this._elementRef.nativeElement.focus();\n }\n });\n }\n\n /**\n * If focus is currently inside the drawer, restores it to where it was before the drawer\n * opened.\n */\n private _restoreFocus() {\n if (!this.autoFocus) {\n return;\n }\n\n const activeEl = this._doc && this._doc.activeElement;\n\n if (activeEl && this._elementRef.nativeElement.contains(activeEl)) {\n if (this._elementFocusedBeforeDrawerWasOpened instanceof HTMLElement) {\n this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened, this._openedVia);\n } else {\n this._elementRef.nativeElement.blur();\n }\n }\n\n this._elementFocusedBeforeDrawerWasOpened = null;\n this._openedVia = null;\n }\n\n ngAfterContentInit() {\n this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);\n this._focusTrap.enabled = this._isFocusTrapEnabled;\n }\n\n ngAfterContentChecked() {\n // Enable the animations after the lifecycle hooks have run, in order to avoid animating\n // drawers that are open by default. When we're on the server, we shouldn't enable the\n // animations, because we don't want the drawer to animate the first time the user sees\n // the page.\n if (this._platform.isBrowser) {\n this._enableAnimations = true;\n }\n }\n\n ngOnDestroy() {\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n\n this._animationStarted.complete();\n this._animationEnd.complete();\n this._modeChanged.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /**\n * Whether the drawer is opened. We overload this because we trigger an event when it\n * starts or end.\n */\n @Input()\n get opened(): boolean { return this._opened; }\n set opened(value: boolean) { this.toggle(coerceBooleanProperty(value)); }\n private _opened: boolean = false;\n\n /**\n * Open the drawer.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n open(openedVia?: FocusOrigin): Promise<MatDrawerToggleResult> {\n return this.toggle(true, openedVia);\n }\n\n /** Close the drawer. */\n close(): Promise<MatDrawerToggleResult> {\n return this.toggle(false);\n }\n\n /**\n * Toggle this drawer.\n * @param isOpen Whether the drawer should be open.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n toggle(isOpen: boolean = !this.opened, openedVia: FocusOrigin = 'program'):\n Promise<MatDrawerToggleResult> {\n\n this._opened = isOpen;\n\n if (isOpen) {\n this._animationState = this._enableAnimations ? 'open' : 'open-instant';\n this._openedVia = openedVia;\n } else {\n this._animationState = 'void';\n this._restoreFocus();\n }\n\n if (this._focusTrap) {\n this._focusTrap.enabled = this._isFocusTrapEnabled;\n }\n\n return new Promise<MatDrawerToggleResult>(resolve => {\n this.openedChange.pipe(take(1)).subscribe(open => resolve(open ? 'open' : 'close'));\n });\n }\n\n get _width(): number {\n return this._elementRef.nativeElement ? (this._elementRef.nativeElement.offsetWidth || 0) : 0;\n }\n\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritte.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n @HostListener('@transform.start', ['$event'])\n _animationStartListener(event: AnimationEvent) {\n this._animationStarted.next(event);\n }\n\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritte.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n @HostListener('@transform.done', ['$event'])\n _animationDoneListener(event: AnimationEvent) {\n this._animationEnd.next(event);\n }\n}\n\n\n/**\n * `<mat-drawer-container>` component.\n *\n * This is the parent component to one or two `<mat-drawer>`s that validates the state internally\n * and coordinates the backdrop and content styling.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-drawer-container',\n exportAs: 'matDrawerContainer',\n templateUrl: 'drawer-container.html',\n styleUrls: ['drawer.css'],\n host: {\n 'class': 'mat-drawer-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatDrawerContainer implements AfterContentInit, DoCheck, OnDestroy {\n @ContentChildren(MatDrawer) _drawers: QueryList<MatDrawer>;\n @ContentChild(MatDrawerContent, {static: false}) _content: MatDrawerContent;\n @ViewChild(MatDrawerContent, {static: false}) _userContent: MatDrawerContent;\n\n /** The drawer child with the `start` position. */\n get start(): MatDrawer | null { return this._start; }\n\n /** The drawer child with the `end` position. */\n get end(): MatDrawer | null { return this._end; }\n\n /**\n * Whether to automatically resize the container whenever\n * the size of any of its drawers changes.\n *\n * **Use at your own risk!** Enabling this option can cause layout thrashing by measuring\n * the drawers on every change detection cycle. Can be configured globally via the\n * `MAT_DRAWER_DEFAULT_AUTOSIZE` token.\n */\n @Input()\n get autosize(): boolean { return this._autosize; }\n set autosize(value: boolean) { this._autosize = coerceBooleanProperty(value); }\n private _autosize: boolean;\n\n /**\n * Whether the drawer container should have a backdrop while one of the sidenavs is open.\n * If explicitly set to `true`, the backdrop will be enabled for drawers in the `side`\n * mode as well.\n */\n @Input()\n get hasBackdrop() {\n if (this._backdropOverride == null) {\n return !this._start || this._start.mode !== 'side' || !this._end || this._end.mode !== 'side';\n }\n\n return this._backdropOverride;\n }\n set hasBackdrop(value: any) {\n this._backdropOverride = value == null ? null : coerceBooleanProperty(value);\n }\n _backdropOverride: boolean | null;\n\n /** Event emitted when the drawer backdrop is clicked. */\n @Output() readonly backdropClick: EventEmitter<void> = new EventEmitter<void>();\n\n /** The drawer at the start/end position, independent of direction. */\n private _start: MatDrawer | null;\n private _end: MatDrawer | null;\n\n /**\n * The drawer at the left/right. When direction changes, these will change as well.\n * They're used as aliases for the above to set the left/right style properly.\n * In LTR, _left == _start and _right == _end.\n * In RTL, _left == _end and _right == _start.\n */\n private _left: MatDrawer | null;\n private _right: MatDrawer | null;\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n /** Emits on every ngDoCheck. Used for debouncing reflows. */\n private readonly _doCheckSubject = new Subject<void>();\n\n /**\n * Margins to be applied to the content. These are used to push / shrink the drawer content when a\n * drawer is open. We use margin rather than transform even for push mode because transform breaks\n * fixed position elements inside of the transformed element.\n */\n _contentMargins: {left: number|null, right: number|null} = {left: null, right: null};\n\n readonly _contentMarginChanges = new Subject<{left: number|null, right: number|null}>();\n\n /** Reference to the CdkScrollable instance that wraps the scrollable content. */\n get scrollable(): CdkScrollable {\n return this._userContent || this._content;\n }\n\n constructor(@Optional() private _dir: Directionality,\n private _element: ElementRef<HTMLElement>,\n private _ngZone: NgZone,\n private _changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Inject(MAT_DRAWER_DEFAULT_AUTOSIZE) defaultAutosize = false,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) private _animationMode?: string) {\n\n // If a `Dir` directive exists up the tree, listen direction changes\n // and update the left/right properties to point to the proper start/end.\n if (_dir) {\n _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._validateDrawers();\n this.updateContentMargins();\n });\n }\n\n // Since the minimum width of the sidenav depends on the viewport width,\n // we need to recompute the margins if the viewport changes.\n viewportRuler.change()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this.updateContentMargins());\n\n this._autosize = defaultAutosize;\n }\n\n ngAfterContentInit() {\n this._drawers.changes.pipe(startWith(null)).subscribe(() => {\n this._validateDrawers();\n\n this._drawers.forEach((drawer: MatDrawer) => {\n this._watchDrawerToggle(drawer);\n this._watchDrawerPosition(drawer);\n this._watchDrawerMode(drawer);\n });\n\n if (!this._drawers.length ||\n this._isDrawerOpen(this._start) ||\n this._isDrawerOpen(this._end)) {\n this.updateContentMargins();\n }\n\n this._changeDetectorRef.markForCheck();\n });\n\n this._doCheckSubject.pipe(\n debounceTime(10), // Arbitrary debounce time, less than a frame at 60fps\n takeUntil(this._destroyed)\n ).subscribe(() => this.updateContentMargins());\n }\n\n ngOnDestroy() {\n this._contentMarginChanges.complete();\n this._doCheckSubject.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** Calls `open` of both start and end drawers */\n open(): void {\n this._drawers.forEach(drawer => drawer.open());\n }\n\n /** Calls `close` of both start and end drawers */\n close(): void {\n this._drawers.forEach(drawer => drawer.close());\n }\n\n /**\n * Recalculates and updates the inline styles for the content. Note that this should be used\n * sparingly, because it causes a reflow.\n */\n updateContentMargins() {\n // 1. For drawers in `over` mode, they don't affect the content.\n // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the\n // left margin (for left drawer) or right margin (for right the drawer).\n // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by\n // adding to the left or right margin and simultaneously subtracting the same amount of\n // margin from the other side.\n let left = 0;\n let right = 0;\n\n if (this._left && this._left.opened) {\n if (this._left.mode == 'side') {\n left += this._left._width;\n } else if (this._left.mode == 'push') {\n const width = this._left._width;\n left += width;\n right -= width;\n }\n }\n\n if (this._right && this._right.opened) {\n if (this._right.mode == 'side') {\n right += this._right._width;\n } else if (this._right.mode == 'push') {\n const width = this._right._width;\n right += width;\n left -= width;\n }\n }\n\n // If either `right` or `left` is zero, don't set a style to the element. This\n // allows users to specify a custom size via CSS class in SSR scenarios where the\n // measured widths will always be zero. Note that we reset to `null` here, rather\n // than below, in order to ensure that the types in the `if` below are consistent.\n left = left || null!;\n right = right || null!;\n\n if (left !== this._contentMargins.left || right !== this._contentMargins.right) {\n this._contentMargins = {left, right};\n\n // Pull back into the NgZone since in some cases we could be outside. We need to be careful\n // to do it only when something changed, otherwise we can end up hitting the zone too often.\n this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins));\n }\n }\n\n ngDoCheck() {\n // If users opted into autosizing, do a check every change detection cycle.\n if (this._autosize && this._isPushed()) {\n // Run outside the NgZone, otherwise the debouncer will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => this._doCheckSubject.next());\n }\n }\n\n /**\n * Subscribes to drawer events in order to set a class on the main container element when the\n * drawer is open and the backdrop is visible. This ensures any overflow on the container element\n * is properly hidden.\n */\n private _watchDrawerToggle(drawer: MatDrawer): void {\n drawer._animationStarted.pipe(\n filter((event: AnimationEvent) => event.fromState !== event.toState),\n takeUntil(this._drawers.changes),\n )\n .subscribe((event: AnimationEvent) => {\n // Set the transition class on the container so that the animations occur. This should not\n // be set initially because animations should only be triggered via a change in state.\n if (event.toState !== 'open-instant' && this._animationMode !== 'NoopAnimations') {\n this._element.nativeElement.classList.add('mat-drawer-transition');\n }\n\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n\n if (drawer.mode !== 'side') {\n drawer.openedChange.pipe(takeUntil(this._drawers.changes)).subscribe(() =>\n this._setContainerClass(drawer.opened));\n }\n }\n\n /**\n * Subscribes to drawer onPositionChanged event in order to\n * re-validate drawers when the position changes.\n */\n private _watchDrawerPosition(drawer: MatDrawer): void {\n if (!drawer) {\n return;\n }\n // NOTE: We need to wait for the microtask queue to be empty before validating,\n // since both drawers may be swapping positions at the same time.\n drawer.onPositionChanged.pipe(takeUntil(this._drawers.changes)).subscribe(() => {\n this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1)).subscribe(() => {\n this._validateDrawers();\n });\n });\n }\n\n /** Subscribes to changes in drawer mode so we can run change detection. */\n private _watchDrawerMode(drawer: MatDrawer): void {\n if (drawer) {\n drawer._modeChanged.pipe(takeUntil(merge(this._drawers.changes, this._destroyed)))\n .subscribe(() => {\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n /** Toggles the 'mat-drawer-opened' class on the main 'mat-drawer-container' element. */\n private _setContainerClass(isAdd: boolean): void {\n if (isAdd) {\n this._element.nativeElement.classList.add('mat-drawer-opened');\n } else {\n this._element.nativeElement.classList.remove('mat-drawer-opened');\n }\n }\n\n /** Validate the state of the drawer children components. */\n private _validateDrawers() {\n this._start = this._end = null;\n\n // Ensure that we have at most one start and one end drawer.\n this._drawers.forEach(drawer => {\n if (drawer.position == 'end') {\n if (this._end != null) {\n throwMatDuplicatedDrawerError('end');\n }\n this._end = drawer;\n } else {\n if (this._start != null) {\n throwMatDuplicatedDrawerError('start');\n }\n this._start = drawer;\n }\n });\n\n this._right = this._left = null;\n\n // Detect if we're LTR or RTL.\n if (this._dir && this._dir.value === 'rtl') {\n this._left = this._end;\n this._right = this._start;\n } else {\n this._left = this._start;\n this._right = this._end;\n }\n }\n\n /** Whether the container is being pushed to the side by one of the drawers. */\n private _isPushed() {\n return (this._isDrawerOpen(this._start) && this._start.mode != 'over') ||\n (this._isDrawerOpen(this._end) && this._end.mode != 'over');\n }\n\n _onBackdropClicked() {\n this.backdropClick.emit();\n this._closeModalDrawer();\n }\n\n _closeModalDrawer() {\n // Close all open drawers where closing is not disabled and the mode is not `side`.\n [this._start, this._end]\n .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer))\n .forEach(drawer => drawer!.close());\n }\n\n _isShowingBackdrop(): boolean {\n return (this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) ||\n (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end));\n }\n\n private _canHaveBackdrop(drawer: MatDrawer): boolean {\n return drawer.mode !== 'side' || !!this._backdropOverride;\n }\n\n private _isDrawerOpen(drawer: MatDrawer | null): drawer is MatDrawer {\n return drawer != null && drawer.opened;\n }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n forwardRef,\n Inject,\n Input,\n ViewEncapsulation,\n QueryList,\n ElementRef,\n NgZone,\n} from '@angular/core';\nimport {MatDrawer, MatDrawerContainer, MatDrawerContent} from './drawer';\nimport {matDrawerAnimations} from './drawer-animations';\nimport {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion';\nimport {ScrollDispatcher} from '@angular/cdk/scrolling';\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-sidenav-content',\n template: '<ng-content></ng-content>',\n host: {\n 'class': 'mat-drawer-content mat-sidenav-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatSidenavContent extends MatDrawerContent {\n constructor(\n changeDetectorRef: ChangeDetectorRef,\n @Inject(forwardRef(() => MatSidenavContainer)) container: MatSidenavContainer,\n elementRef: ElementRef<HTMLElement>,\n scrollDispatcher: ScrollDispatcher,\n ngZone: NgZone) {\n super(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone);\n }\n}\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-sidenav',\n exportAs: 'matSidenav',\n templateUrl: 'drawer.html',\n animations: [matDrawerAnimations.transformDrawer],\n host: {\n 'class': 'mat-drawer mat-sidenav',\n 'tabIndex': '-1',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n '[class.mat-sidenav-fixed]': 'fixedInViewport',\n '[style.top.px]': 'fixedInViewport ? fixedTopGap : null',\n '[style.bottom.px]': 'fixedInViewport ? fixedBottomGap : null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatSidenav extends MatDrawer {\n /** Whether the sidenav is fixed in the viewport. */\n @Input()\n get fixedInViewport(): boolean { return this._fixedInViewport; }\n set fixedInViewport(value) { this._fixedInViewport = coerceBooleanProperty(value); }\n private _fixedInViewport = false;\n\n /**\n * The gap between the top of the sidenav and the top of the viewport when the sidenav is in fixed\n * mode.\n */\n @Input()\n get fixedTopGap(): number { return this._fixedTopGap; }\n set fixedTopGap(value) { this._fixedTopGap = coerceNumberProperty(value); }\n private _fixedTopGap = 0;\n\n /**\n * The gap between the bottom of the sidenav and the bottom of the viewport when the sidenav is in\n * fixed mode.\n */\n @Input()\n get fixedBottomGap(): number { return this._fixedBottomGap; }\n set fixedBottomGap(value) { this._fixedBottomGap = coerceNumberProperty(value); }\n private _fixedBottomGap = 0;\n}\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-sidenav-container',\n exportAs: 'matSidenavContainer',\n templateUrl: 'sidenav-container.html',\n styleUrls: ['drawer.css'],\n host: {\n 'class': 'mat-drawer-container mat-sidenav-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatSidenavContainer extends MatDrawerContainer {\n @ContentChildren(MatSidenav) _drawers: QueryList<MatSidenav>;\n @ContentChild(MatSidenavContent, {static: false}) _content: MatSidenavContent;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {PlatformModule} from '@angular/cdk/platform';\nimport {ScrollingModule} from '@angular/cdk/scrolling';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatDrawer, MatDrawerContainer, MatDrawerContent} from './drawer';\nimport {MatSidenav, MatSidenavContainer, MatSidenavContent} from './sidenav';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatCommonModule,\n ScrollingModule,\n PlatformModule,\n ],\n exports: [\n MatCommonModule,\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ],\n declarations: [\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ],\n})\nexport class MatSidenavModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {InjectionToken} from '@angular/core';\n\n\n/** Default `mat-slide-toggle` options that can be overridden. */\nexport interface MatSlideToggleDefaultOptions {\n /** Whether toggle action triggers value changes in slide toggle. */\n disableToggleValue?: boolean;\n /** Whether drag action triggers value changes in slide toggle. */\n disableDragValue?: boolean;\n}\n\n/** Injection token to be used to override the default options for `mat-slide-toggle`. */\nexport const MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS =\n new InjectionToken<MatSlideToggleDefaultOptions>('mat-slide-toggle-default-options', {\n providedIn: 'root',\n factory: () => ({disableToggleValue: false, disableDragValue: false})\n });\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n OnDestroy,\n Output,\n ViewChild,\n ViewEncapsulation,\n NgZone,\n Optional,\n Inject,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n CanColor, CanColorCtor,\n CanDisable, CanDisableCtor,\n CanDisableRipple, CanDisableRippleCtor,\n HammerInput,\n HasTabIndex, HasTabIndexCtor,\n mixinColor,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {\n MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS,\n MatSlideToggleDefaultOptions\n} from './slide-toggle-config';\n\n// Increasing integer for generating unique ids for slide-toggle components.\nlet nextUniqueId = 0;\n\n/** @docs-private */\nexport const MAT_SLIDE_TOGGLE_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSlideToggle),\n multi: true\n};\n\n/** Change event object emitted by a MatSlideToggle. */\nexport class MatSlideToggleChange {\n constructor(\n /** The source MatSlideToggle of the event. */\n public source: MatSlideToggle,\n /** The new `checked` value of the MatSlideToggle. */\n public checked: boolean) { }\n}\n\n// Boilerplate for applying mixins to MatSlideToggle.\n/** @docs-private */\nclass MatSlideToggleBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatSlideToggleMixinBase:\n HasTabIndexCtor &\n CanColorCtor &\n CanDisableRippleCtor &\n CanDisableCtor &\n typeof MatSlideToggleBase =\n mixinTabIndex(mixinColor(mixinDisableRipple(mixinDisabled(MatSlideToggleBase)), 'accent'));\n\n/** Represents a slidable \"switch\" toggle that can be moved between on and off. */\n@Component({\n moduleId: module.id,\n selector: 'mat-slide-toggle',\n exportAs: 'matSlideToggle',\n host: {\n 'class': 'mat-slide-toggle',\n '[id]': 'id',\n // Needs to be `-1` so it can still receive programmatic focus.\n '[attr.tabindex]': 'disabled ? null : -1',\n '[class.mat-checked]': 'checked',\n '[class.mat-disabled]': 'disabled',\n '[class.mat-slide-toggle-label-before]': 'labelPosition == \"before\"',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '(focus)': '_inputElement.nativeElement.focus()',\n },\n templateUrl: 'slide-toggle.html',\n styleUrls: ['slide-toggle.css'],\n providers: [MAT_SLIDE_TOGGLE_VALUE_ACCESSOR],\n inputs: ['disabled', 'disableRipple', 'color', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatSlideToggle extends _MatSlideToggleMixinBase implements OnDestroy, AfterContentInit,\n ControlValueAccessor,\n CanDisable, CanColor,\n HasTabIndex,\n CanDisableRipple {\n private _onChange = (_: any) => {};\n private _onTouched = () => {};\n\n private _uniqueId: string = `mat-slide-toggle-${++nextUniqueId}`;\n private _required: boolean = false;\n private _checked: boolean = false;\n\n /** Whether the thumb is currently being dragged. */\n private _dragging = false;\n\n /** Previous checked state before drag started. */\n private _previousChecked: boolean;\n\n /** Width of the thumb bar of the slide-toggle. */\n private _thumbBarWidth: number;\n\n /** Percentage of the thumb while dragging. Percentage as fraction of 100. */\n private _dragPercentage: number;\n\n /** Reference to the thumb HTMLElement. */\n @ViewChild('thumbContainer', {static: false}) _thumbEl: ElementRef;\n\n /** Reference to the thumb bar HTMLElement. */\n @ViewChild('toggleBar', {static: false}) _thumbBarEl: ElementRef;\n\n /** Name value will be applied to the input element if present. */\n @Input() name: string | null = null;\n\n /** A unique id for the slide-toggle input. If none is supplied, it will be auto-generated. */\n @Input() id: string = this._uniqueId;\n\n /** Whether the label should appear after or before the slide-toggle. Defaults to 'after'. */\n @Input() labelPosition: 'before' | 'after' = 'after';\n\n /** Used to set the aria-label attribute on the underlying input element. */\n @Input('aria-label') ariaLabel: string | null = null;\n\n /** Used to set the aria-labelledby attribute on the underlying input element. */\n @Input('aria-labelledby') ariaLabelledby: string | null = null;\n\n /** Whether the slide-toggle is required. */\n @Input()\n get required(): boolean { return this._required; }\n set required(value) { this._required = coerceBooleanProperty(value); }\n\n /** Whether the slide-toggle element is checked or not. */\n @Input()\n get checked(): boolean { return this._checked; }\n set checked(value) {\n this._checked = coerceBooleanProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n /** An event will be dispatched each time the slide-toggle changes its value. */\n @Output() readonly change: EventEmitter<MatSlideToggleChange> =\n new EventEmitter<MatSlideToggleChange>();\n\n /**\n * An event will be dispatched each time the slide-toggle input is toggled.\n * This event is always emitted when the user toggles the slide toggle, but this does not mean\n * the slide toggle's value has changed. The event does not fire when the user drags to change\n * the slide toggle value.\n */\n @Output() readonly toggleChange: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * An event will be dispatched each time the slide-toggle is dragged.\n * This event is always emitted when the user drags the slide toggle to make a change greater\n * than 50%. It does not mean the slide toggle's value is changed. The event is not emitted when\n * the user toggles the slide toggle to change its value.\n */\n @Output() readonly dragChange: EventEmitter<void> = new EventEmitter<void>();\n\n /** Returns the unique id for the visual hidden input. */\n get inputId(): string { return `${this.id || this._uniqueId}-input`; }\n\n /** Reference to the underlying input element. */\n @ViewChild('input', {static: false}) _inputElement: ElementRef<HTMLInputElement>;\n\n constructor(elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _changeDetectorRef: ChangeDetectorRef,\n @Attribute('tabindex') tabIndex: string,\n private _ngZone: NgZone,\n @Inject(MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS)\n public defaults: MatSlideToggleDefaultOptions,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string,\n @Optional() private _dir?: Directionality) {\n super(elementRef);\n this.tabIndex = parseInt(tabIndex) || 0;\n }\n\n ngAfterContentInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(focusOrigin => {\n if (!focusOrigin) {\n // When a focused element becomes disabled, the browser *immediately* fires a blur event.\n // Angular does not expect events to be raised during change detection, so any state\n // change (such as a form control's 'ng-touched') will cause a changed-after-checked\n // error. See https://github.com/angular/angular/issues/17793. To work around this,\n // we defer telling the form control it has been touched until the next tick.\n Promise.resolve().then(() => this._onTouched());\n }\n });\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Method being called whenever the underlying input emits a change event. */\n _onChangeEvent(event: 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\n if (!this._dragging) {\n this.toggleChange.emit();\n }\n // Releasing the pointer over the `<label>` element while dragging triggers another\n // click event on the `<label>` element. This means that the checked state of the underlying\n // input changed unintentionally and needs to be changed back. Or when the slide toggle's config\n // disabled toggle change event by setting `disableToggleValue: true`, the slide toggle's value\n // does not change, and the checked state of the underlying input needs to be changed back.\n if (this._dragging || this.defaults.disableToggleValue) {\n this._inputElement.nativeElement.checked = this.checked;\n return;\n }\n\n // Sync the value from the underlying input element with the component instance.\n this.checked = this._inputElement.nativeElement.checked;\n\n // Emit our custom change event only if the underlying input emitted one. This ensures that\n // there is no change event, when the checked state changes programmatically.\n this._emitChangeEvent();\n }\n\n /** Method being called whenever the slide-toggle has been clicked. */\n _onInputClick(event: 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\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: any): void {\n this.checked = !!value;\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /** Implemented as a part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this._changeDetectorRef.markForCheck();\n }\n\n /** Focuses the slide-toggle. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n\n /** Toggles the checked state of the slide-toggle. */\n toggle(): void {\n this.checked = !this.checked;\n this._onChange(this.checked);\n }\n\n /**\n * Emits a change event on the `change` output. Also notifies the FormControl about the change.\n */\n private _emitChangeEvent() {\n this._onChange(this.checked);\n this.change.emit(new MatSlideToggleChange(this, this.checked));\n }\n\n /** Retrieves the percentage of thumb from the moved distance. Percentage as fraction of 100. */\n private _getDragPercentage(distance: number) {\n let percentage = (distance / this._thumbBarWidth) * 100;\n\n // When the toggle was initially checked, then we have to start the drag at the end.\n if (this._previousChecked) {\n percentage += 100;\n }\n\n return Math.max(0, Math.min(percentage, 100));\n }\n\n _onDragStart() {\n if (!this.disabled && !this._dragging) {\n const thumbEl = this._thumbEl.nativeElement;\n this._thumbBarWidth = this._thumbBarEl.nativeElement.clientWidth - thumbEl.clientWidth;\n thumbEl.classList.add('mat-dragging');\n\n this._previousChecked = this.checked;\n this._dragging = true;\n }\n }\n\n _onDrag(event: HammerInput) {\n if (this._dragging) {\n const direction = this._dir && this._dir.value === 'rtl' ? -1 : 1;\n this._dragPercentage = this._getDragPercentage(event.deltaX * direction);\n // Calculate the moved distance based on the thumb bar width.\n const dragX = (this._dragPercentage / 100) * this._thumbBarWidth * direction;\n this._thumbEl.nativeElement.style.transform = `translate3d(${dragX}px, 0, 0)`;\n }\n }\n\n _onDragEnd() {\n if (this._dragging) {\n const newCheckedValue = this._dragPercentage > 50;\n\n if (newCheckedValue !== this.checked) {\n this.dragChange.emit();\n if (!this.defaults.disableDragValue) {\n this.checked = newCheckedValue;\n this._emitChangeEvent();\n }\n }\n\n // The drag should be stopped outside of the current event handler, otherwise the\n // click event will be fired before it and will revert the drag change.\n this._ngZone.runOutsideAngular(() => setTimeout(() => {\n if (this._dragging) {\n this._dragging = false;\n this._thumbEl.nativeElement.classList.remove('mat-dragging');\n\n // Reset the transform because the component will take care\n // of the thumb position after drag.\n this._thumbEl.nativeElement.style.transform = '';\n }\n }));\n }\n }\n\n /** Method being called whenever the label text changes. */\n _onLabelTextChange() {\n // Since the event of the `cdkObserveContent` directive runs outside of the zone, the\n // slide-toggle component will be only marked for check, but no actual change detection runs\n // automatically. Instead of going back into the zone in order to trigger a change detection\n // which causes *all* components to be checked (if explicitly marked or not using OnPush),\n // we only trigger an explicit change detection for the slide-toggle view and it's children.\n this._changeDetectorRef.detectChanges();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {NgModule} from '@angular/core';\nimport {GestureConfig, MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';\nimport {MatSlideToggle} from './slide-toggle';\n\n\n@NgModule({\n imports: [MatRippleModule, MatCommonModule, ObserversModule],\n exports: [MatSlideToggle, MatCommonModule],\n declarations: [MatSlideToggle],\n providers: [\n {provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}\n ],\n})\nexport class MatSlideToggleModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n Optional,\n ViewEncapsulation,\n} from '@angular/core';\nimport {CanColor, CanColorCtor, mixinColor} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/** Possible mode for a progress spinner. */\nexport type ProgressSpinnerMode = 'determinate' | 'indeterminate';\n\n/**\n * Base reference size of the spinner.\n * @docs-private\n */\nconst BASE_SIZE = 100;\n\n/**\n * Base reference stroke width of the spinner.\n * @docs-private\n */\nconst BASE_STROKE_WIDTH = 10;\n\n// Boilerplate for applying mixins to MatProgressSpinner.\n/** @docs-private */\nclass MatProgressSpinnerBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatProgressSpinnerMixinBase: CanColorCtor & typeof MatProgressSpinnerBase =\n mixinColor(MatProgressSpinnerBase, 'primary');\n\n/** Default `mat-progress-spinner` options that can be overridden. */\nexport interface MatProgressSpinnerDefaultOptions {\n /** Diameter of the spinner. */\n diameter?: number;\n /** Width of the spinner's stroke. */\n strokeWidth?: number;\n /**\n * Whether the animations should be force to be enabled, ignoring if the current environment is\n * using NoopAnimationsModule.\n */\n _forceAnimations?: boolean;\n}\n\n/** Injection token to be used to override the default options for `mat-progress-spinner`. */\nexport const MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS =\n new InjectionToken<MatProgressSpinnerDefaultOptions>('mat-progress-spinner-default-options', {\n providedIn: 'root',\n factory: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY(): MatProgressSpinnerDefaultOptions {\n return {diameter: BASE_SIZE};\n}\n\n// .0001 percentage difference is necessary in order to avoid unwanted animation frames\n// for example because the animation duration is 4 seconds, .1% accounts to 4ms\n// which are enough to see the flicker described in\n// https://github.com/angular/components/issues/8984\nconst INDETERMINATE_ANIMATION_TEMPLATE = `\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n`;\n\n/**\n * `<mat-progress-spinner>` component.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-progress-spinner',\n exportAs: 'matProgressSpinner',\n host: {\n 'role': 'progressbar',\n 'class': 'mat-progress-spinner',\n '[class._mat-animation-noopable]': `_noopAnimations`,\n '[style.width.px]': 'diameter',\n '[style.height.px]': 'diameter',\n '[attr.aria-valuemin]': 'mode === \"determinate\" ? 0 : null',\n '[attr.aria-valuemax]': 'mode === \"determinate\" ? 100 : null',\n '[attr.aria-valuenow]': 'mode === \"determinate\" ? value : null',\n '[attr.mode]': 'mode',\n },\n inputs: ['color'],\n templateUrl: 'progress-spinner.html',\n styleUrls: ['progress-spinner.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatProgressSpinner extends _MatProgressSpinnerMixinBase implements CanColor {\n private _diameter = BASE_SIZE;\n private _value = 0;\n private _strokeWidth: number;\n private _fallbackAnimation = false;\n\n /**\n * Element to which we should add the generated style tags for the indeterminate animation.\n * For most elements this is the document, but for the ones in the Shadow DOM we need to\n * use the shadow root.\n */\n private _styleRoot: Node;\n\n /**\n * Tracks diameters of existing instances to de-dupe generated styles (default d = 100).\n * We need to keep track of which elements the diameters were attached to, because for\n * elements in the Shadow DOM the style tags are attached to the shadow root, rather\n * than the document head.\n */\n private static _diameters = new WeakMap<Node, Set<number>>();\n\n /** Whether the _mat-animation-noopable class should be applied, disabling animations. */\n _noopAnimations: boolean;\n\n /** The diameter of the progress spinner (will set width and height of svg). */\n @Input()\n get diameter(): number { return this._diameter; }\n set diameter(size: number) {\n this._diameter = coerceNumberProperty(size);\n\n if (!this._fallbackAnimation) {\n const trackedDiameters = MatProgressSpinner._diameters;\n const diametersForElement = trackedDiameters.get(this._styleRoot);\n\n if (!diametersForElement || !diametersForElement.has(this._diameter)) {\n this._attachStyleNode();\n }\n }\n }\n\n /** Stroke width of the progress spinner. */\n @Input()\n get strokeWidth(): number {\n return this._strokeWidth || this.diameter / 10;\n }\n set strokeWidth(value: number) {\n this._strokeWidth = coerceNumberProperty(value);\n }\n\n /** Mode of the progress circle */\n @Input() mode: ProgressSpinnerMode = 'determinate';\n\n /** Value of the progress circle. */\n @Input()\n get value(): number {\n return this.mode === 'determinate' ? this._value : 0;\n }\n set value(newValue: number) {\n this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));\n }\n\n constructor(public _elementRef: ElementRef<HTMLElement>,\n platform: Platform,\n @Optional() @Inject(DOCUMENT) private _document: any,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode: string,\n @Inject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)\n defaults?: MatProgressSpinnerDefaultOptions) {\n\n super(_elementRef);\n\n const trackedDiameters = MatProgressSpinner._diameters;\n\n // The base size is already inserted via the component's structural styles. We still\n // need to track it so we don't end up adding the same styles again.\n if (!trackedDiameters.has(_document.head)) {\n trackedDiameters.set(_document.head, new Set<number>([BASE_SIZE]));\n }\n\n this._styleRoot = _getShadowRoot(_elementRef.nativeElement, _document) || _document.head;\n this._fallbackAnimation = platform.EDGE || platform.TRIDENT;\n this._noopAnimations = animationMode === 'NoopAnimations' &&\n (!!defaults && !defaults._forceAnimations);\n\n if (defaults) {\n if (defaults.diameter) {\n this.diameter = defaults.diameter;\n }\n\n if (defaults.strokeWidth) {\n this.strokeWidth = defaults.strokeWidth;\n }\n }\n\n // On IE and Edge, we can't animate the `stroke-dashoffset`\n // reliably so we fall back to a non-spec animation.\n const animationClass =\n `mat-progress-spinner-indeterminate${this._fallbackAnimation ? '-fallback' : ''}-animation`;\n\n _elementRef.nativeElement.classList.add(animationClass);\n }\n\n /** The radius of the spinner, adjusted for stroke width. */\n get _circleRadius() {\n return (this.diameter - BASE_STROKE_WIDTH) / 2;\n }\n\n /** The view box of the spinner's svg element. */\n get _viewBox() {\n const viewBox = this._circleRadius * 2 + this.strokeWidth;\n return `0 0 ${viewBox} ${viewBox}`;\n }\n\n /** The stroke circumference of the svg circle. */\n get _strokeCircumference(): number {\n return 2 * Math.PI * this._circleRadius;\n }\n\n /** The dash offset of the svg circle. */\n get _strokeDashOffset() {\n if (this.mode === 'determinate') {\n return this._strokeCircumference * (100 - this._value) / 100;\n }\n\n // In fallback mode set the circle to 80% and rotate it with CSS.\n if (this._fallbackAnimation && this.mode === 'indeterminate') {\n return this._strokeCircumference * 0.2;\n }\n\n return null;\n }\n\n /** Stroke width of the circle in percent. */\n get _circleStrokeWidth() {\n return this.strokeWidth / this.diameter * 100;\n }\n\n /** Dynamically generates a style tag containing the correct animation for this diameter. */\n private _attachStyleNode(): void {\n const styleTag: HTMLStyleElement = this._document.createElement('style');\n const styleRoot = this._styleRoot;\n const currentDiameter = this._diameter;\n const diameters = MatProgressSpinner._diameters;\n let diametersForElement = diameters.get(styleRoot);\n\n styleTag.setAttribute('mat-spinner-animation', currentDiameter + '');\n styleTag.textContent = this._getAnimationText();\n styleRoot.appendChild(styleTag);\n\n if (!diametersForElement) {\n diametersForElement = new Set<number>();\n diameters.set(styleRoot, diametersForElement);\n }\n\n diametersForElement.add(currentDiameter);\n }\n\n /** Generates animation styles adjusted for the spinner's diameter. */\n private _getAnimationText(): string {\n return INDETERMINATE_ANIMATION_TEMPLATE\n // Animation should begin at 5% and end at 80%\n .replace(/START_VALUE/g, `${0.95 * this._strokeCircumference}`)\n .replace(/END_VALUE/g, `${0.2 * this._strokeCircumference}`)\n .replace(/DIAMETER/g, `${this.diameter}`);\n }\n}\n\n\n/**\n * `<mat-spinner>` component.\n *\n * This is a component definition to be used as a convenience reference to create an\n * indeterminate `<mat-progress-spinner>` instance.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-spinner',\n host: {\n 'role': 'progressbar',\n 'mode': 'indeterminate',\n 'class': 'mat-spinner mat-progress-spinner',\n '[class._mat-animation-noopable]': `_noopAnimations`,\n '[style.width.px]': 'diameter',\n '[style.height.px]': 'diameter',\n },\n inputs: ['color'],\n templateUrl: 'progress-spinner.html',\n styleUrls: ['progress-spinner.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatSpinner extends MatProgressSpinner {\n constructor(elementRef: ElementRef<HTMLElement>, platform: Platform,\n @Optional() @Inject(DOCUMENT) document: any,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode: string,\n @Inject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)\n defaults?: MatProgressSpinnerDefaultOptions) {\n super(elementRef, platform, document, animationMode, defaults);\n this.mode = 'indeterminate';\n }\n}\n\n\n/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */\nexport function _getShadowRoot(element: HTMLElement, _document: Document): Node | null {\n // TODO(crisbeto): see whether we should move this into the CDK\n // feature detection utilities once #15616 gets merged in.\n if (typeof window !== 'undefined') {\n const head = _document.head;\n\n // Check whether the browser supports Shadow DOM.\n if (head && ((head as any).createShadowRoot || head.attachShadow)) {\n const rootNode = element.getRootNode ? element.getRootNode() : null;\n\n // We need to take the `ShadowRoot` off of `window`, because the built-in types are\n // incorrect. See https://github.com/Microsoft/TypeScript/issues/27929.\n if (rootNode instanceof (window as any).ShadowRoot) {\n return rootNode;\n }\n }\n }\n\n return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatProgressSpinner, MatSpinner} from './progress-spinner';\n\n\n@NgModule({\n imports: [MatCommonModule, CommonModule],\n exports: [\n MatProgressSpinner,\n MatSpinner,\n MatCommonModule\n ],\n declarations: [\n MatProgressSpinner,\n MatSpinner\n ],\n})\nclass MatProgressSpinnerModule {}\n\nexport {MatProgressSpinnerModule};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {UniqueSelectionDispatcher} from '@angular/cdk/collections';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n CanDisableRipple,\n CanDisableRippleCtor,\n HasTabIndex,\n HasTabIndexCtor,\n mixinDisableRipple,\n mixinTabIndex,\n ThemePalette,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\nexport interface MatRadioDefaultOptions {\n color: ThemePalette;\n}\n\nexport const MAT_RADIO_DEFAULT_OPTIONS =\n new InjectionToken<MatRadioDefaultOptions>('mat-radio-default-options', {\n providedIn: 'root',\n factory: MAT_RADIO_DEFAULT_OPTIONS_FACTORY\n});\n\nexport function MAT_RADIO_DEFAULT_OPTIONS_FACTORY(): MatRadioDefaultOptions {\n return {\n color: 'accent'\n };\n}\n\n// Increasing integer for generating unique ids for radio components.\nlet nextUniqueId = 0;\n\n/**\n * Provider Expression that allows mat-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n * @docs-private\n */\nexport const MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatRadioGroup),\n multi: true\n};\n\n/** Change event object emitted by MatRadio and MatRadioGroup. */\nexport class MatRadioChange {\n constructor(\n /** The MatRadioButton that emits the change event. */\n public source: MatRadioButton,\n /** The value of the MatRadioButton. */\n public value: any) {}\n}\n\n/**\n * A group of radio buttons. May contain one or more `<mat-radio-button>` elements.\n */\n@Directive({\n selector: 'mat-radio-group',\n exportAs: 'matRadioGroup',\n providers: [MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR],\n host: {\n 'role': 'radiogroup',\n 'class': 'mat-radio-group',\n },\n})\nexport class MatRadioGroup implements AfterContentInit, ControlValueAccessor {\n /** Selected value for the radio group. */\n private _value: any = null;\n\n /** The HTML name attribute applied to radio buttons in this group. */\n private _name: string = `mat-radio-group-${nextUniqueId++}`;\n\n /** The currently selected radio button. Should match value. */\n private _selected: MatRadioButton | null = null;\n\n /** Whether the `value` has been set to its initial value. */\n private _isInitialized: boolean = false;\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n private _labelPosition: 'before' | 'after' = 'after';\n\n /** Whether the radio group is disabled. */\n private _disabled: boolean = false;\n\n /** Whether the radio group is required. */\n private _required: boolean = false;\n\n /** The method to be called in order to update ngModel */\n _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n /**\n * onTouch function registered via registerOnTouch (ControlValueAccessor).\n * @docs-private\n */\n onTouched: () => any = () => {};\n\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 @Output() readonly change: EventEmitter<MatRadioChange> = new EventEmitter<MatRadioChange>();\n\n /** Child radio buttons. */\n @ContentChildren(forwardRef(() => MatRadioButton), { descendants: true })\n _radios: QueryList<MatRadioButton>;\n\n /** Theme color for all of the radio buttons in the group. */\n @Input() color: ThemePalette;\n\n /** Name of the radio button group. All radio buttons inside this group will use this name. */\n @Input()\n get name(): string { return this._name; }\n set name(value: string) {\n this._name = value;\n this._updateRadioButtonNames();\n }\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return this._labelPosition;\n }\n set labelPosition(v) {\n this._labelPosition = v === 'before' ? 'before' : 'after';\n this._markRadiosForCheck();\n }\n\n /**\n * Value for the radio-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 @Input()\n get value(): any { return this._value; }\n set value(newValue: any) {\n if (this._value !== newValue) {\n // Set this before proceeding to ensure no circular loop occurs with selection.\n this._value = newValue;\n\n this._updateSelectedRadioFromValue();\n this._checkSelectedRadioButton();\n }\n }\n\n _checkSelectedRadioButton() {\n if (this._selected && !this._selected.checked) {\n this._selected.checked = true;\n }\n }\n\n /**\n * The currently selected radio button. If set to a new radio button, the radio group value\n * will be updated to match the new selected button.\n */\n @Input()\n get selected() { return this._selected; }\n set selected(selected: MatRadioButton | null) {\n this._selected = selected;\n this.value = selected ? selected.value : null;\n this._checkSelectedRadioButton();\n }\n\n /** Whether the radio group is disabled */\n @Input()\n get disabled(): boolean { return this._disabled; }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n\n /** Whether the radio group is required */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n\n constructor(private _changeDetector: ChangeDetectorRef) { }\n\n /**\n * Initialize properties once content children are available.\n * This allows us to propagate relevant attributes to associated buttons.\n */\n ngAfterContentInit() {\n // Mark this component as initialized in AfterContentInit because the initial value can\n // possibly be set by NgModel on MatRadioGroup, and it is possible that the OnInit of the\n // NgModel occurs *after* the OnInit of the MatRadioGroup.\n this._isInitialized = true;\n }\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 _touch() {\n if (this.onTouched) {\n this.onTouched();\n }\n }\n\n private _updateRadioButtonNames(): void {\n if (this._radios) {\n this._radios.forEach(radio => {\n radio.name = this.name;\n radio._markForCheck();\n });\n }\n }\n\n /** Updates the `selected` radio button from the internal _value state. */\n private _updateSelectedRadioFromValue(): void {\n // If the value already matches the selected radio, do nothing.\n const isAlreadySelected = this._selected !== null && this._selected.value === this._value;\n\n if (this._radios && !isAlreadySelected) {\n this._selected = null;\n this._radios.forEach(radio => {\n radio.checked = this.value === radio.value;\n if (radio.checked) {\n this._selected = radio;\n }\n });\n }\n }\n\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent(): void {\n if (this._isInitialized) {\n this.change.emit(new MatRadioChange(this._selected!, this._value));\n }\n }\n\n _markRadiosForCheck() {\n if (this._radios) {\n this._radios.forEach(radio => radio._markForCheck());\n }\n }\n\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value\n */\n writeValue(value: any) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\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 registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\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 registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\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 setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n this._changeDetector.markForCheck();\n }\n}\n\n// Boilerplate for applying mixins to MatRadioButton.\n/** @docs-private */\nclass MatRadioButtonBase {\n // Since the disabled property is manually defined for the MatRadioButton and isn't set up in\n // the mixin base class. To be able to use the tabindex mixin, a disabled property must be\n // defined to properly work.\n disabled: boolean;\n\n constructor(public _elementRef: ElementRef) {}\n}\n// As per Material design specifications the selection control radio should use the accent color\n// palette by default. https://material.io/guidelines/components/selection-controls.html\nconst _MatRadioButtonMixinBase:\n CanDisableRippleCtor & HasTabIndexCtor & typeof MatRadioButtonBase =\n mixinDisableRipple(mixinTabIndex(MatRadioButtonBase));\n\n/**\n * A Material design radio-button. Typically placed inside of `<mat-radio-group>` elements.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-radio-button',\n templateUrl: 'radio.html',\n styleUrls: ['radio.css'],\n inputs: ['disableRipple', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matRadioButton',\n host: {\n 'class': 'mat-radio-button',\n '[class.mat-radio-checked]': 'checked',\n '[class.mat-radio-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[class.mat-primary]': 'color === \"primary\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n // Needs to be -1 so the `focus` event still fires.\n '[attr.tabindex]': '-1',\n '[attr.id]': 'id',\n // Note: under normal conditions focus shouldn't land on this element, however it may be\n // programmatically set, for example inside of a focus trap, in this case we want to forward\n // the focus to the native element.\n '(focus)': '_inputElement.nativeElement.focus()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatRadioButton extends _MatRadioButtonMixinBase\n implements OnInit, AfterViewInit, OnDestroy, CanDisableRipple, HasTabIndex {\n\n private _uniqueId: string = `mat-radio-${++nextUniqueId}`;\n\n /** The unique ID for the radio button. */\n @Input() id: string = this._uniqueId;\n\n /** Analog to HTML 'name' attribute used to group radios for unique selection. */\n @Input() name: string;\n\n /** Used to set the 'aria-label' attribute on the underlying input element. */\n @Input('aria-label') ariaLabel: string;\n\n /** The 'aria-labelledby' attribute takes precedence as the element's text alternative. */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** The 'aria-describedby' attribute is read after the element's label and field type. */\n @Input('aria-describedby') ariaDescribedby: string;\n\n /** Whether this radio button is checked. */\n @Input()\n get checked(): boolean { return this._checked; }\n set checked(value: boolean) {\n const newCheckedState = coerceBooleanProperty(value);\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 } else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {\n\n // When unchecking the selected radio button, update the selected radio\n // property on the group.\n this.radioGroup.selected = null;\n }\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 this._changeDetector.markForCheck();\n }\n }\n\n /** The value of this radio button. */\n @Input()\n get value(): any { return this._value; }\n set value(value: any) {\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\n /** Whether the label should appear after or before the radio button. Defaults to 'after' */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after';\n }\n set labelPosition(value) {\n this._labelPosition = value;\n }\n private _labelPosition: 'before' | 'after';\n\n /** Whether the radio button is disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);\n }\n set disabled(value: boolean) {\n const newDisabledState = coerceBooleanProperty(value);\n if (this._disabled !== newDisabledState) {\n this._disabled = newDisabledState;\n this._changeDetector.markForCheck();\n }\n }\n\n /** Whether the radio button is required. */\n @Input()\n get required(): boolean {\n return this._required || (this.radioGroup && this.radioGroup.required);\n }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n }\n\n /** Theme color of the radio button. */\n @Input()\n get color(): ThemePalette {\n return this._color ||\n (this.radioGroup && this.radioGroup.color) ||\n this._providerOverride && this._providerOverride.color || 'accent';\n }\n set color(newValue: ThemePalette) { this._color = newValue; }\n private _color: ThemePalette;\n\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 @Output() readonly change: EventEmitter<MatRadioChange> = new EventEmitter<MatRadioChange>();\n\n /** The parent radio group. May or may not be present. */\n radioGroup: MatRadioGroup;\n\n /** ID of the native input element inside `<mat-radio-button>` */\n get inputId(): string { return `${this.id || this._uniqueId}-input`; }\n\n /** Whether this radio is checked. */\n private _checked: boolean = false;\n\n /** Whether this radio is disabled. */\n private _disabled: boolean;\n\n /** Whether this radio is required. */\n private _required: boolean;\n\n /** Value assigned to this radio. */\n private _value: any = null;\n\n /** Unregister function for _radioDispatcher */\n private _removeUniqueSelectionListener: () => void = () => {};\n\n /** The native `<input type=radio>` element */\n @ViewChild('input', {static: false}) _inputElement: ElementRef<HTMLInputElement>;\n\n constructor(@Optional() radioGroup: MatRadioGroup,\n elementRef: ElementRef,\n private _changeDetector: ChangeDetectorRef,\n private _focusMonitor: FocusMonitor,\n private _radioDispatcher: UniqueSelectionDispatcher,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string,\n @Optional() @Inject(MAT_RADIO_DEFAULT_OPTIONS)\n private _providerOverride?: MatRadioDefaultOptions) {\n super(elementRef);\n\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 this.radioGroup = radioGroup;\n\n this._removeUniqueSelectionListener =\n _radioDispatcher.listen((id: string, name: string) => {\n if (id !== this.id && name === this.name) {\n this.checked = false;\n }\n });\n }\n\n /** Focuses the radio button. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n\n /**\n * Marks the radio button as needing checking for change detection.\n * This method is exposed because the parent radio group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When group value changes, the button will not be notified. Use `markForCheck` to explicit\n // update radio button's status\n this._changeDetector.markForCheck();\n }\n\n ngOnInit() {\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\n ngAfterViewInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(focusOrigin => {\n if (!focusOrigin && this.radioGroup) {\n this.radioGroup._touch();\n }\n });\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._removeUniqueSelectionListener();\n }\n\n /** Dispatch change event with current value. */\n private _emitChangeEvent(): void {\n this.change.emit(new MatRadioChange(this, this._value));\n }\n\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n\n _onInputClick(event: 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 /**\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 _onInputChange(event: 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\n const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;\n this.checked = true;\n this._emitChangeEvent();\n\n if (this.radioGroup) {\n this.radioGroup._controlValueAccessorChangeFn(this.value);\n if (groupValueChanged) {\n this.radioGroup._emitChangeEvent();\n }\n }\n }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatRadioButton, MatRadioGroup} from './radio';\n\n\n@NgModule({\n imports: [CommonModule, MatRippleModule, MatCommonModule],\n exports: [MatRadioGroup, MatRadioButton, MatCommonModule],\n declarations: [MatRadioGroup, MatRadioButton],\n})\nexport class MatRadioModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material drawers.\n * @docs-private\n */\nexport const matDrawerAnimations: {\n readonly transformDrawer: AnimationTriggerMetadata;\n} = {\n /** Animation that slides a drawer in and out. */\n transformDrawer: trigger('transform', [\n // We remove the `transform` here completely, rather than setting it to zero, because:\n // 1. Having a transform can cause elements with ripples or an animated\n // transform to shift around in Chrome with an RTL layout (see #10023).\n // 2. 3d transforms causes text to appear blurry on IE and Edge.\n state('open, open-instant', style({\n 'transform': 'none',\n 'visibility': 'visible',\n })),\n state('void', style({\n // Avoids the shadow showing up when closed in SSR.\n 'box-shadow': 'none',\n 'visibility': 'hidden',\n })),\n transition('void => open-instant', animate('0ms')),\n transition('void <=> open, open-instant => void',\n animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)'))\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatOptionModule} from '@angular/material/core';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MAT_SELECT_SCROLL_STRATEGY_PROVIDER, MatSelect, MatSelectTrigger} from './select';\n\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n MatOptionModule,\n MatCommonModule,\n ],\n exports: [MatFormFieldModule, MatSelect, MatSelectTrigger, MatOptionModule, MatCommonModule],\n declarations: [MatSelect, MatSelectTrigger],\n providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER]\n})\nexport class MatSelectModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n AnimationTriggerMetadata,\n keyframes,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\n\n/**\n * Animations used by MatTooltip.\n * @docs-private\n */\nexport const matTooltipAnimations: {\n readonly tooltipState: AnimationTriggerMetadata;\n} = {\n /** Animation that transitions a tooltip in and out. */\n tooltipState: trigger('state', [\n state('initial, void, hidden', style({opacity: 0, transform: 'scale(0)'})),\n state('visible', style({transform: 'scale(1)'})),\n transition('* => visible', animate('200ms cubic-bezier(0, 0, 0.2, 1)', keyframes([\n style({opacity: 0, transform: 'scale(0)', offset: 0}),\n style({opacity: 0.5, transform: 'scale(0.99)', offset: 0.5}),\n style({opacity: 1, transform: 'scale(1)', offset: 1})\n ]))),\n transition('* => hidden', animate('100ms cubic-bezier(0, 0, 0.2, 1)', style({opacity: 0}))),\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {A11yModule} from '@angular/cdk/a11y';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {GestureConfig, MatCommonModule} from '@angular/material/core';\nimport {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';\nimport {\n MatTooltip,\n TooltipComponent,\n MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER,\n} from './tooltip';\n\n@NgModule({\n imports: [\n A11yModule,\n CommonModule,\n OverlayModule,\n MatCommonModule,\n ],\n exports: [MatTooltip, TooltipComponent, MatCommonModule],\n declarations: [MatTooltip, TooltipComponent],\n entryComponents: [TooltipComponent],\n providers: [\n MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER,\n {provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig},\n ]\n})\nexport class MatTooltipModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, Optional, SkipSelf} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n\n/**\n * To modify the labels and text displayed, create a new instance of MatPaginatorIntl and\n * include it in a custom provider\n */\n@Injectable({providedIn: 'root'})\nexport class MatPaginatorIntl {\n /**\n * Stream to emit from when labels are changed. Use this to notify components when the labels have\n * changed after initialization.\n */\n readonly changes: Subject<void> = new Subject<void>();\n\n /** A label for the page size selector. */\n itemsPerPageLabel: string = 'Items per page:';\n\n /** A label for the button that increments the current page. */\n nextPageLabel: string = 'Next page';\n\n /** A label for the button that decrements the current page. */\n previousPageLabel: string = 'Previous page';\n\n /** A label for the button that moves to the first page. */\n firstPageLabel: string = 'First page';\n\n /** A label for the button that moves to the last page. */\n lastPageLabel: string = 'Last page';\n\n /** A label for the range of items within the current page and the length of the whole list. */\n getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length == 0 || pageSize == 0) { return `0 of ${length}`; }\n\n length = Math.max(length, 0);\n\n const startIndex = page * pageSize;\n\n // If the start index exceeds the list length, do not try and fix the end index to the end.\n const endIndex = startIndex < length ?\n Math.min(startIndex + pageSize, length) :\n startIndex + pageSize;\n\n return `${startIndex + 1} - ${endIndex} of ${length}`;\n }\n}\n\n/** @docs-private */\nexport function MAT_PAGINATOR_INTL_PROVIDER_FACTORY(parentIntl: MatPaginatorIntl) {\n return parentIntl || new MatPaginatorIntl();\n}\n\n/** @docs-private */\nexport const MAT_PAGINATOR_INTL_PROVIDER = {\n // If there is already an MatPaginatorIntl available, use that. Otherwise, provide a new one.\n provide: MatPaginatorIntl,\n deps: [[new Optional(), new SkipSelf(), MatPaginatorIntl]],\n useFactory: MAT_PAGINATOR_INTL_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceNumberProperty, coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {MatPaginatorIntl} from './paginator-intl';\nimport {\n HasInitialized,\n HasInitializedCtor,\n mixinInitialized,\n ThemePalette,\n mixinDisabled,\n CanDisableCtor,\n CanDisable,\n} from '@angular/material/core';\n\n/** The default page size if there is no page size and there are no provided page size options. */\nconst DEFAULT_PAGE_SIZE = 50;\n\n/**\n * Change event object that is emitted when the user selects a\n * different page size or navigates to another page.\n */\nexport class PageEvent {\n /** The current page index. */\n pageIndex: number;\n\n /**\n * Index of the page that was selected previously.\n * @breaking-change 8.0.0 To be made into a required property.\n */\n previousPageIndex?: number;\n\n /** The current page size */\n pageSize: number;\n\n /** The current total number of items being paged */\n length: number;\n}\n\n// Boilerplate for applying mixins to MatPaginator.\n/** @docs-private */\nclass MatPaginatorBase {}\nconst _MatPaginatorBase: CanDisableCtor & HasInitializedCtor & typeof MatPaginatorBase =\n mixinDisabled(mixinInitialized(MatPaginatorBase));\n\n/**\n * Component to provide navigation between paged information. Displays the size of the current\n * page, user-selectable options to change that size, what items are being shown, and\n * navigational button to go to the previous or next page.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-paginator',\n exportAs: 'matPaginator',\n templateUrl: 'paginator.html',\n styleUrls: ['paginator.css'],\n inputs: ['disabled'],\n host: {\n 'class': 'mat-paginator',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy, CanDisable,\n HasInitialized {\n private _initialized: boolean;\n private _intlChanges: Subscription;\n\n /** Theme color to be used for the underlying form controls. */\n @Input() color: ThemePalette;\n\n /** The zero-based page index of the displayed list of items. Defaulted to 0. */\n @Input()\n get pageIndex(): number { return this._pageIndex; }\n set pageIndex(value: number) {\n this._pageIndex = Math.max(coerceNumberProperty(value), 0);\n this._changeDetectorRef.markForCheck();\n }\n private _pageIndex = 0;\n\n /** The length of the total number of items that are being paginated. Defaulted to 0. */\n @Input()\n get length(): number { return this._length; }\n set length(value: number) {\n this._length = coerceNumberProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n private _length = 0;\n\n /** Number of items to display on a page. By default set to 50. */\n @Input()\n get pageSize(): number { return this._pageSize; }\n set pageSize(value: number) {\n this._pageSize = Math.max(coerceNumberProperty(value), 0);\n this._updateDisplayedPageSizeOptions();\n }\n private _pageSize: number;\n\n /** The set of provided page size options to display to the user. */\n @Input()\n get pageSizeOptions(): number[] { return this._pageSizeOptions; }\n set pageSizeOptions(value: number[]) {\n this._pageSizeOptions = (value || []).map(p => coerceNumberProperty(p));\n this._updateDisplayedPageSizeOptions();\n }\n private _pageSizeOptions: number[] = [];\n\n /** Whether to hide the page size selection UI from the user. */\n @Input()\n get hidePageSize(): boolean { return this._hidePageSize; }\n set hidePageSize(value: boolean) {\n this._hidePageSize = coerceBooleanProperty(value);\n }\n private _hidePageSize = false;\n\n\n /** Whether to show the first/last buttons UI to the user. */\n @Input()\n get showFirstLastButtons(): boolean { return this._showFirstLastButtons; }\n set showFirstLastButtons(value: boolean) {\n this._showFirstLastButtons = coerceBooleanProperty(value);\n }\n private _showFirstLastButtons = false;\n\n /** Event emitted when the paginator changes the page size or page index. */\n @Output() readonly page: EventEmitter<PageEvent> = new EventEmitter<PageEvent>();\n\n /** Displayed set of page size options. Will be sorted and include current page size. */\n _displayedPageSizeOptions: number[];\n\n constructor(public _intl: MatPaginatorIntl,\n private _changeDetectorRef: ChangeDetectorRef) {\n super();\n this._intlChanges = _intl.changes.subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n ngOnInit() {\n this._initialized = true;\n this._updateDisplayedPageSizeOptions();\n this._markInitialized();\n }\n\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n }\n\n /** Advances to the next page if it exists. */\n nextPage(): void {\n if (!this.hasNextPage()) { return; }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex++;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move back to the previous page if it exists. */\n previousPage(): void {\n if (!this.hasPreviousPage()) { return; }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex--;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the first page if not already there. */\n firstPage(): void {\n // hasPreviousPage being false implies at the start\n if (!this.hasPreviousPage()) { return; }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = 0;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the last page if not already there. */\n lastPage(): void {\n // hasNextPage being false implies at the end\n if (!this.hasNextPage()) { return; }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.getNumberOfPages() - 1;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Whether there is a previous page. */\n hasPreviousPage(): boolean {\n return this.pageIndex >= 1 && this.pageSize != 0;\n }\n\n /** Whether there is a next page. */\n hasNextPage(): boolean {\n const maxPageIndex = this.getNumberOfPages() - 1;\n return this.pageIndex < maxPageIndex && this.pageSize != 0;\n }\n\n /** Calculate the number of pages */\n getNumberOfPages(): number {\n if (!this.pageSize) {\n return 0;\n }\n\n return Math.ceil(this.length / this.pageSize);\n }\n\n\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n _changePageSize(pageSize: number) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousPageIndex = this.pageIndex;\n\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Checks whether the buttons for going forwards should be disabled. */\n _nextButtonsDisabled() {\n return this.disabled || !this.hasNextPage();\n }\n\n /** Checks whether the buttons for going backwards should be disabled. */\n _previousButtonsDisabled() {\n return this.disabled || !this.hasPreviousPage();\n }\n\n /**\n * Updates the list of page size options to display to the user. Includes making sure that\n * the page size is an option and that the list is sorted.\n */\n private _updateDisplayedPageSizeOptions() {\n if (!this._initialized) { return; }\n\n // If no page size is provided, use the first page size option or the default page size.\n if (!this.pageSize) {\n this._pageSize = this.pageSizeOptions.length != 0 ?\n this.pageSizeOptions[0] :\n DEFAULT_PAGE_SIZE;\n }\n\n this._displayedPageSizeOptions = this.pageSizeOptions.slice();\n\n if (this._displayedPageSizeOptions.indexOf(this.pageSize) === -1) {\n this._displayedPageSizeOptions.push(this.pageSize);\n }\n\n // Sort the numbers using a number-specific sort function.\n this._displayedPageSizeOptions.sort((a, b) => a - b);\n this._changeDetectorRef.markForCheck();\n }\n\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n private _emitPageEvent(previousPageIndex: number) {\n this.page.emit({\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length\n });\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatSelectModule} from '@angular/material/select';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {MatPaginator} from './paginator';\nimport {MAT_PAGINATOR_INTL_PROVIDER} from './paginator-intl';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatButtonModule,\n MatSelectModule,\n MatTooltipModule,\n ],\n exports: [MatPaginator],\n declarations: [MatPaginator],\n providers: [MAT_PAGINATOR_INTL_PROVIDER],\n})\nexport class MatPaginatorModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n Inject,\n Input,\n Output,\n EventEmitter,\n Optional,\n NgZone,\n ViewEncapsulation,\n AfterViewInit,\n ViewChild,\n OnDestroy,\n InjectionToken,\n inject,\n} from '@angular/core';\nimport {fromEvent, Subscription, Observable} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {CanColor, CanColorCtor, mixinColor} from '@angular/material/core';\nimport {DOCUMENT} from '@angular/common';\n\n// TODO(josephperrott): Benchpress tests.\n// TODO(josephperrott): Add ARIA attributes for progress bar \"for\".\n\n/** Last animation end data. */\nexport interface ProgressAnimationEnd {\n value: number;\n}\n\n// Boilerplate for applying mixins to MatProgressBar.\n/** @docs-private */\nclass MatProgressBarBase {\n constructor(public _elementRef: ElementRef) { }\n}\n\nconst _MatProgressBarMixinBase: CanColorCtor & typeof MatProgressBarBase =\n mixinColor(MatProgressBarBase, 'primary');\n\n/**\n * Injection token used to provide the current location to `MatProgressBar`.\n * Used to handle server-side rendering and to stub out during unit tests.\n * @docs-private\n */\nexport const MAT_PROGRESS_BAR_LOCATION = new InjectionToken<MatProgressBarLocation>(\n 'mat-progress-bar-location',\n {providedIn: 'root', factory: MAT_PROGRESS_BAR_LOCATION_FACTORY}\n);\n\n/**\n * Stubbed out location for `MatProgressBar`.\n * @docs-private\n */\nexport interface MatProgressBarLocation {\n getPathname: () => string;\n}\n\n/** @docs-private */\nexport function MAT_PROGRESS_BAR_LOCATION_FACTORY(): MatProgressBarLocation {\n const _document = inject(DOCUMENT);\n const _location = _document ? _document.location : null;\n\n return {\n // Note that this needs to be a function, rather than a property, because Angular\n // will only resolve it once, but we want the current path on each call.\n getPathname: () => _location ? (_location.pathname + _location.search) : ''\n };\n}\n\n\n/** Counter used to generate unique IDs for progress bars. */\nlet progressbarId = 0;\n\n/**\n * `<mat-progress-bar>` component.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-progress-bar',\n exportAs: 'matProgressBar',\n host: {\n 'role': 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[attr.aria-valuenow]': '(mode === \"indeterminate\" || mode === \"query\") ? null : value',\n '[attr.mode]': 'mode',\n 'class': 'mat-progress-bar',\n '[class._mat-animation-noopable]': '_isNoopAnimation',\n },\n inputs: ['color'],\n templateUrl: 'progress-bar.html',\n styleUrls: ['progress-bar.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatProgressBar extends _MatProgressBarMixinBase implements CanColor,\n AfterViewInit, OnDestroy {\n constructor(public _elementRef: ElementRef, private _ngZone: NgZone,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string,\n /**\n * @deprecated `location` parameter to be made required.\n * @breaking-change 8.0.0\n */\n @Optional() @Inject(MAT_PROGRESS_BAR_LOCATION) location?: MatProgressBarLocation) {\n super(_elementRef);\n\n // We need to prefix the SVG reference with the current path, otherwise they won't work\n // in Safari if the page has a `<base>` tag. Note that we need quotes inside the `url()`,\n\n // because named route URLs can contain parentheses (see #12338). Also we don't use since\n // we can't tell the difference between whether\n // the consumer is using the hash location strategy or not, because `Location` normalizes\n // both `/#/foo/bar` and `/foo/bar` to the same thing.\n const path = location ? location.getPathname().split('#')[0] : '';\n this._rectangleFillValue = `url('${path}#${this.progressbarId}')`;\n this._isNoopAnimation = _animationMode === 'NoopAnimations';\n }\n\n /** Flag that indicates whether NoopAnimations mode is set to true. */\n _isNoopAnimation = false;\n\n /** Value of the progress bar. Defaults to zero. Mirrored to aria-valuenow. */\n @Input()\n get value(): number { return this._value; }\n set value(v: number) {\n this._value = clamp(v || 0);\n\n // When noop animation is set to true, trigger animationEnd directly.\n if (this._isNoopAnimation) {\n this._emitAnimationEnd();\n }\n }\n private _value: number = 0;\n\n /** Buffer value of the progress bar. Defaults to zero. */\n @Input()\n get bufferValue(): number { return this._bufferValue; }\n set bufferValue(v: number) { this._bufferValue = clamp(v || 0); }\n private _bufferValue: number = 0;\n\n @ViewChild('primaryValueBar', {static: false}) _primaryValueBar: ElementRef;\n\n /**\n * Event emitted when animation of the primary progress bar completes. This event will not\n * be emitted when animations are disabled, nor will it be emitted for modes with continuous\n * animations (indeterminate and query).\n */\n @Output() animationEnd = new EventEmitter<ProgressAnimationEnd>();\n\n /** Reference to animation end subscription to be unsubscribed on destroy. */\n private _animationEndSubscription: Subscription = Subscription.EMPTY;\n\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 @Input() mode: 'determinate' | 'indeterminate' | 'buffer' | 'query' = 'determinate';\n\n /** ID of the progress bar. */\n progressbarId = `mat-progress-bar-${progressbarId++}`;\n\n /** Attribute to be used for the `fill` attribute on the internal `rect` element. */\n _rectangleFillValue: string;\n\n /** Gets the current transform value for the progress bar's primary indicator. */\n _primaryTransform() {\n const scale = this.value / 100;\n return {transform: `scaleX(${scale})`};\n }\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 _bufferTransform() {\n if (this.mode === 'buffer') {\n const scale = this.bufferValue / 100;\n return {transform: `scaleX(${scale})`};\n }\n }\n\n ngAfterViewInit() {\n if (!this._isNoopAnimation) {\n // Run outside angular so change detection didn't get triggered on every transition end\n // instead only on the animation that we care about (primary value bar's transitionend)\n this._ngZone.runOutsideAngular((() => {\n const element = this._primaryValueBar.nativeElement;\n\n this._animationEndSubscription =\n (fromEvent(element, 'transitionend') as Observable<TransitionEvent>)\n .pipe(filter(((e: TransitionEvent) => e.target === element)))\n .subscribe(() => this._ngZone.run(() => this._emitAnimationEnd()));\n }));\n }\n }\n\n ngOnDestroy() {\n this._animationEndSubscription.unsubscribe();\n }\n\n /** Emit an animationEnd event if in determinate or buffer mode. */\n private _emitAnimationEnd(): void {\n if (this.mode === 'determinate' || this.mode === 'buffer') {\n this.animationEnd.next({value: this.value});\n }\n }\n}\n\n/** Clamps a value to be between two numbers, by default 0 and 100. */\nfunction clamp(v: number, min = 0, max = 100) {\n return Math.max(min, Math.min(max, v));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatProgressBar} from './progress-bar';\n\n\n@NgModule({\n imports: [CommonModule, MatCommonModule],\n exports: [MatProgressBar, MatCommonModule],\n declarations: [MatProgressBar],\n})\nexport class MatProgressBarModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusKeyManager, FocusOrigin} from '@angular/cdk/a11y';\nimport {Direction} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n ESCAPE,\n LEFT_ARROW,\n RIGHT_ARROW,\n DOWN_ARROW,\n UP_ARROW,\n HOME,\n END,\n hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Output,\n TemplateRef,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n OnInit,\n} from '@angular/core';\nimport {merge, Observable, Subject, Subscription} from 'rxjs';\nimport {startWith, switchMap, take} from 'rxjs/operators';\nimport {matMenuAnimations} from './menu-animations';\nimport {MatMenuContent} from './menu-content';\nimport {MenuPositionX, MenuPositionY} from './menu-positions';\nimport {throwMatMenuInvalidPositionX, throwMatMenuInvalidPositionY} from './menu-errors';\nimport {MatMenuItem} from './menu-item';\nimport {MAT_MENU_PANEL, MatMenuPanel} from './menu-panel';\nimport {AnimationEvent} from '@angular/animations';\n\n/** Default `mat-menu` options that can be overridden. */\nexport interface MatMenuDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: MenuPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: MenuPositionY;\n\n /** Whether the menu should overlap the menu trigger. */\n overlapTrigger: boolean;\n\n /** Class to be applied to the menu's backdrop. */\n backdropClass: string;\n\n /** Whether the menu has a backdrop. */\n hasBackdrop?: boolean;\n}\n\n/** Injection token to be used to override the default options for `mat-menu`. */\nexport const MAT_MENU_DEFAULT_OPTIONS =\n new InjectionToken<MatMenuDefaultOptions>('mat-menu-default-options', {\n providedIn: 'root',\n factory: MAT_MENU_DEFAULT_OPTIONS_FACTORY\n });\n\n/** @docs-private */\nexport function MAT_MENU_DEFAULT_OPTIONS_FACTORY(): MatMenuDefaultOptions {\n return {\n overlapTrigger: false,\n xPosition: 'after',\n yPosition: 'below',\n backdropClass: 'cdk-overlay-transparent-backdrop',\n };\n}\n/**\n * Start elevation for the menu panel.\n * @docs-private\n */\nconst MAT_MENU_BASE_ELEVATION = 4;\n\n/** Base class with all of the `MatMenu` functionality. */\n// tslint:disable-next-line:class-name\nexport class _MatMenuBase implements AfterContentInit, MatMenuPanel<MatMenuItem>, OnInit,\n OnDestroy {\n private _keyManager: FocusKeyManager<MatMenuItem>;\n private _xPosition: MenuPositionX = this._defaultOptions.xPosition;\n private _yPosition: MenuPositionY = this._defaultOptions.yPosition;\n private _previousElevation: string;\n\n /** All items inside the menu. Includes items nested inside another menu. */\n @ContentChildren(MatMenuItem, {descendants: true}) _allItems: QueryList<MatMenuItem>;\n\n /** Only the direct descendant menu items. */\n private _directDescendantItems = new QueryList<MatMenuItem>();\n\n /** Subscription to tab events on the menu panel */\n private _tabSubscription = Subscription.EMPTY;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: {[key: string]: boolean} = {};\n\n /** Current state of the panel animation. */\n _panelAnimationState: 'void' | 'enter' = 'void';\n\n /** Emits whenever an animation on the menu completes. */\n _animationDone = new Subject<AnimationEvent>();\n\n /** Whether the menu is animating. */\n _isAnimating: boolean;\n\n /** Parent menu of the current menu panel. */\n parentMenu: MatMenuPanel | undefined;\n\n /** Layout direction of the menu. */\n direction: Direction;\n\n /** Class to be added to the backdrop element. */\n @Input() backdropClass: string = this._defaultOptions.backdropClass;\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): MenuPositionX { return this._xPosition; }\n set xPosition(value: MenuPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwMatMenuInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): MenuPositionY { return this._yPosition; }\n set yPosition(value: MenuPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwMatMenuInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n\n /** @docs-private */\n @ViewChild(TemplateRef, {static: false}) templateRef: TemplateRef<any>;\n\n /**\n * List of the items inside of a menu.\n * @deprecated\n * @breaking-change 8.0.0\n */\n @ContentChildren(MatMenuItem) items: QueryList<MatMenuItem>;\n\n /**\n * Menu content that will be rendered lazily.\n * @docs-private\n */\n @ContentChild(MatMenuContent, {static: false}) lazyContent: MatMenuContent;\n\n /** Whether the menu should overlap its trigger. */\n @Input()\n get overlapTrigger(): boolean { return this._overlapTrigger; }\n set overlapTrigger(value: boolean) {\n this._overlapTrigger = coerceBooleanProperty(value);\n }\n private _overlapTrigger: boolean = this._defaultOptions.overlapTrigger;\n\n /** Whether the menu has a backdrop. */\n @Input()\n get hasBackdrop(): boolean | undefined { return this._hasBackdrop; }\n set hasBackdrop(value: boolean | undefined) {\n this._hasBackdrop = coerceBooleanProperty(value);\n }\n private _hasBackdrop: boolean | undefined = this._defaultOptions.hasBackdrop;\n\n /**\n * This method takes classes set on the host mat-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 @Input('class')\n set panelClass(classes: string) {\n const previousPanelClass = this._previousPanelClass;\n\n if (previousPanelClass && previousPanelClass.length) {\n previousPanelClass.split(' ').forEach((className: string) => {\n this._classList[className] = false;\n });\n }\n\n this._previousPanelClass = classes;\n\n if (classes && classes.length) {\n classes.split(' ').forEach((className: string) => {\n this._classList[className] = true;\n });\n\n this._elementRef.nativeElement.className = '';\n }\n }\n private _previousPanelClass: string;\n\n /**\n * This method takes classes set on the host mat-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 * @deprecated Use `panelClass` instead.\n * @breaking-change 8.0.0\n */\n @Input()\n get classList(): string { return this.panelClass; }\n set classList(classes: string) { this.panelClass = classes; }\n\n /** Event emitted when the menu is closed. */\n @Output() readonly closed: EventEmitter<void | 'click' | 'keydown' | 'tab'> =\n new EventEmitter<void | 'click' | 'keydown' | 'tab'>();\n\n /**\n * Event emitted when the menu is closed.\n * @deprecated Switch to `closed` instead\n * @breaking-change 8.0.0\n */\n @Output() close = this.closed;\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n private _ngZone: NgZone,\n @Inject(MAT_MENU_DEFAULT_OPTIONS) private _defaultOptions: MatMenuDefaultOptions) { }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n ngAfterContentInit() {\n this._updateDirectDescendants();\n this._keyManager = new FocusKeyManager(this._directDescendantItems).withWrap().withTypeAhead();\n this._tabSubscription = this._keyManager.tabOut.subscribe(() => this.closed.emit('tab'));\n }\n\n ngOnDestroy() {\n this._directDescendantItems.destroy();\n this._tabSubscription.unsubscribe();\n this.closed.complete();\n }\n\n /** Stream that emits whenever the hovered menu item changes. */\n _hovered(): Observable<MatMenuItem> {\n return this._directDescendantItems.changes.pipe(\n startWith(this._directDescendantItems),\n switchMap(items => merge<MatMenuItem>(...items.map((item: MatMenuItem) => item._hovered)))\n );\n }\n\n /*\n * Registers a menu item with the menu.\n * @docs-private\n * @deprecated No longer being used. To be removed.\n * @breaking-change 9.0.0\n */\n addItem(_item: MatMenuItem) {}\n\n /**\n * Removes an item from the menu.\n * @docs-private\n * @deprecated No longer being used. To be removed.\n * @breaking-change 9.0.0\n */\n removeItem(_item: MatMenuItem) {}\n\n /** Handle a keyboard event from the menu, delegating to the appropriate action. */\n _handleKeydown(event: KeyboardEvent) {\n const keyCode = event.keyCode;\n const manager = this._keyManager;\n\n switch (keyCode) {\n case ESCAPE:\n if (!hasModifierKey(event)) {\n event.preventDefault();\n this.closed.emit('keydown');\n }\n break;\n case LEFT_ARROW:\n if (this.parentMenu && this.direction === 'ltr') {\n this.closed.emit('keydown');\n }\n break;\n case RIGHT_ARROW:\n if (this.parentMenu && this.direction === 'rtl') {\n this.closed.emit('keydown');\n }\n break;\n case HOME:\n case END:\n if (!hasModifierKey(event)) {\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n event.preventDefault();\n }\n break;\n default:\n if (keyCode === UP_ARROW || keyCode === DOWN_ARROW) {\n manager.setFocusOrigin('keyboard');\n }\n\n manager.onKeydown(event);\n }\n }\n\n /**\n * Focus the first item in the menu.\n * @param origin Action from which the focus originated. Used to set the correct styling.\n */\n focusFirstItem(origin: FocusOrigin = 'program'): void {\n // When the content is rendered lazily, it takes a bit before the items are inside the DOM.\n if (this.lazyContent) {\n this._ngZone.onStable.asObservable()\n .pipe(take(1))\n .subscribe(() => this._keyManager.setFocusOrigin(origin).setFirstItemActive());\n } else {\n this._keyManager.setFocusOrigin(origin).setFirstItemActive();\n }\n }\n\n /**\n * Resets the active item in the menu. This is used when the menu is opened, allowing\n * the user to start from the first option when pressing the down arrow.\n */\n resetActiveItem() {\n this._keyManager.setActiveItem(-1);\n }\n\n /**\n * Sets the menu panel elevation.\n * @param depth Number of parent menus that come before the menu.\n */\n setElevation(depth: number): void {\n // The elevation starts at the base and increases by one for each level.\n const newElevation = `mat-elevation-z${MAT_MENU_BASE_ELEVATION + depth}`;\n const customElevation = Object.keys(this._classList).find(c => c.startsWith('mat-elevation-z'));\n\n if (!customElevation || customElevation === this._previousElevation) {\n if (this._previousElevation) {\n this._classList[this._previousElevation] = false;\n }\n\n this._classList[newElevation] = true;\n this._previousElevation = newElevation;\n }\n }\n\n /**\n * Adds classes to the menu panel based on its position. Can be used by\n * consumers to add specific styling based on the position.\n * @param posX Position of the menu along the x axis.\n * @param posY Position of the menu along the y axis.\n * @docs-private\n */\n setPositionClasses(posX: MenuPositionX = this.xPosition, posY: MenuPositionY = this.yPosition) {\n const classes = this._classList;\n classes['mat-menu-before'] = posX === 'before';\n classes['mat-menu-after'] = posX === 'after';\n classes['mat-menu-above'] = posY === 'above';\n classes['mat-menu-below'] = posY === 'below';\n }\n\n /** Starts the enter animation. */\n _startAnimation() {\n // @breaking-change 8.0.0 Combine with _resetAnimation.\n this._panelAnimationState = 'enter';\n }\n\n /** Resets the panel animation to its initial state. */\n _resetAnimation() {\n // @breaking-change 8.0.0 Combine with _startAnimation.\n this._panelAnimationState = 'void';\n }\n\n /** Callback that is invoked when the panel animation completes. */\n _onAnimationDone(event: AnimationEvent) {\n this._animationDone.next(event);\n this._isAnimating = false;\n }\n\n _onAnimationStart(event: AnimationEvent) {\n this._isAnimating = true;\n\n // Scroll the content element to the top as soon as the animation starts. This is necessary,\n // because we move focus to the first item while it's still being animated, which can throw\n // the browser off when it determines the scroll position. Alternatively we can move focus\n // when the animation is done, however moving focus asynchronously will interrupt screen\n // readers which are in the process of reading out the menu already. We take the `element`\n // from the `event` since we can't use a `ViewChild` to access the pane.\n if (event.toState === 'enter' && this._keyManager.activeItemIndex === 0) {\n event.element.scrollTop = 0;\n }\n }\n\n /**\n * Sets up a stream that will keep track of any newly-added menu items and will update the list\n * of direct descendants. We collect the descendants this way, because `_allItems` can include\n * items that are part of child menus, and using a custom way of registering items is unreliable\n * when it comes to maintaining the item order.\n */\n private _updateDirectDescendants() {\n this._allItems.changes\n .pipe(startWith(this._allItems))\n .subscribe((items: QueryList<MatMenuItem>) => {\n this._directDescendantItems.reset(items.filter(item => item._parentMenu === this));\n this._directDescendantItems.notifyOnChanges();\n });\n }\n}\n\n/** @docs-private We show the \"_MatMenu\" class as \"MatMenu\" in the docs. */\nexport class MatMenu extends _MatMenuBase {}\n\n// Note on the weird inheritance setup: we need three classes, because the MDC-based menu has to\n// extend `MatMenu`, however keeping a reference to it will cause the inlined template and styles\n// to be retained as well. The MDC menu also has to provide itself as a `MatMenu` in order for\n// queries and DI to work correctly, while still not referencing the actual menu class.\n// Class responsibility is split up as follows:\n// * _MatMenuBase - provides all the functionality without any of the Angular metadata.\n// * MatMenu - keeps the same name symbol name as the current menu and\n// is used as a provider for DI and query purposes.\n// * _MatMenu - the actual menu component implementation with the Angular metadata that should\n// be tree shaken away for MDC.\n\n/** @docs-public MatMenu */\n@Component({\n moduleId: module.id,\n selector: 'mat-menu',\n templateUrl: 'menu.html',\n styleUrls: ['menu.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matMenu',\n animations: [\n matMenuAnimations.transformMenu,\n matMenuAnimations.fadeInItems\n ],\n providers: [\n {provide: MAT_MENU_PANEL, useExisting: MatMenu},\n {provide: MatMenu, useExisting: _MatMenu}\n ]\n})\n// tslint:disable-next-line:class-name\nexport class _MatMenu extends MatMenu {\n\n constructor(elementRef: ElementRef<HTMLElement>, ngZone: NgZone,\n @Inject(MAT_MENU_DEFAULT_OPTIONS) defaultOptions: MatMenuDefaultOptions) {\n super(elementRef, ngZone, defaultOptions);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor, FocusOrigin, isFakeMousedownFromScreenReader} from '@angular/cdk/a11y';\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {LEFT_ARROW, RIGHT_ARROW} from '@angular/cdk/keycodes';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n Overlay,\n OverlayConfig,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n AfterContentInit,\n Directive,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n Self,\n ViewContainerRef,\n} from '@angular/core';\nimport {normalizePassiveListenerOptions} from '@angular/cdk/platform';\nimport {asapScheduler, merge, of as observableOf, Subscription} from 'rxjs';\nimport {delay, filter, take, takeUntil} from 'rxjs/operators';\nimport {MatMenu} from './menu';\nimport {throwMatMenuMissingError} from './menu-errors';\nimport {MatMenuItem} from './menu-item';\nimport {MatMenuPanel} from './menu-panel';\nimport {MenuPositionX, MenuPositionY} from './menu-positions';\n\n/** Injection token that determines the scroll handling while the menu is open. */\nexport const MAT_MENU_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-menu-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_MENU_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_MENU_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_MENU_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default top padding of the menu panel. */\nexport const MENU_PANEL_TOP_PADDING = 8;\n\n/** Options for binding a passive event listener. */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({passive: true});\n\n// TODO(andrewseguin): Remove the kebab versions in favor of camelCased attribute selectors\n\n/**\n * This directive is intended to be used in conjunction with an mat-menu tag. It is\n * responsible for toggling the display of the provided menu instance.\n */\n@Directive({\n selector: `[mat-menu-trigger-for], [matMenuTriggerFor]`,\n host: {\n 'aria-haspopup': 'true',\n '[attr.aria-expanded]': 'menuOpen || null',\n '(mousedown)': '_handleMousedown($event)',\n '(keydown)': '_handleKeydown($event)',\n '(click)': '_handleClick($event)',\n },\n exportAs: 'matMenuTrigger'\n})\nexport class MatMenuTrigger implements AfterContentInit, OnDestroy {\n private _portal: TemplatePortal;\n private _overlayRef: OverlayRef | null = null;\n private _menuOpen: boolean = false;\n private _closingActionsSubscription = Subscription.EMPTY;\n private _hoverSubscription = Subscription.EMPTY;\n private _menuCloseSubscription = Subscription.EMPTY;\n private _scrollStrategy: () => ScrollStrategy;\n\n /**\n * Handles touch start events on the trigger.\n * Needs to be an arrow function so we can easily use addEventListener and removeEventListener.\n */\n private _handleTouchStart = () => this._openedBy = 'touch';\n\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 _openedBy: 'mouse' | 'touch' | null = null;\n\n /**\n * @deprecated\n * @breaking-change 8.0.0\n */\n @Input('mat-menu-trigger-for')\n get _deprecatedMatMenuTriggerFor(): MatMenuPanel { return this.menu; }\n set _deprecatedMatMenuTriggerFor(v: MatMenuPanel) {\n this.menu = v;\n }\n\n /** References the menu instance that the trigger is associated with. */\n @Input('matMenuTriggerFor')\n get menu() { return this._menu; }\n set menu(menu: MatMenuPanel) {\n if (menu === this._menu) {\n return;\n }\n\n this._menu = menu;\n this._menuCloseSubscription.unsubscribe();\n\n if (menu) {\n this._menuCloseSubscription = menu.close.asObservable().subscribe(reason => {\n this._destroyMenu();\n\n // If a click closed the menu, we should close the entire chain of nested menus.\n if ((reason === 'click' || reason === 'tab') && this._parentMenu) {\n this._parentMenu.closed.emit(reason);\n }\n });\n }\n }\n private _menu: MatMenuPanel;\n\n /** Data to be passed along to any lazily-rendered content. */\n @Input('matMenuTriggerData') menuData: any;\n\n /**\n * Whether focus should be restored when the menu is closed.\n * Note that disabling this option can have accessibility implications\n * and it's up to you to manage focus, if you decide to turn it off.\n */\n @Input('matMenuTriggerRestoreFocus') restoreFocus: boolean = true;\n\n /** Event emitted when the associated menu is opened. */\n @Output() readonly menuOpened: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * Event emitted when the associated menu is opened.\n * @deprecated Switch to `menuOpened` instead\n * @breaking-change 8.0.0\n */\n // tslint:disable-next-line:no-output-on-prefix\n @Output() readonly onMenuOpen: EventEmitter<void> = this.menuOpened;\n\n /** Event emitted when the associated menu is closed. */\n @Output() readonly menuClosed: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * Event emitted when the associated menu is closed.\n * @deprecated Switch to `menuClosed` instead\n * @breaking-change 8.0.0\n */\n // tslint:disable-next-line:no-output-on-prefix\n @Output() readonly onMenuClose: EventEmitter<void> = this.menuClosed;\n\n constructor(private _overlay: Overlay,\n private _element: ElementRef<HTMLElement>,\n private _viewContainerRef: ViewContainerRef,\n @Inject(MAT_MENU_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _parentMenu: MatMenu,\n @Optional() @Self() private _menuItemInstance: MatMenuItem,\n @Optional() private _dir: Directionality,\n // TODO(crisbeto): make the _focusMonitor required when doing breaking changes.\n // @breaking-change 8.0.0\n private _focusMonitor?: FocusMonitor) {\n\n _element.nativeElement.addEventListener('touchstart', this._handleTouchStart,\n passiveEventListenerOptions);\n\n if (_menuItemInstance) {\n _menuItemInstance._triggersSubmenu = this.triggersSubmenu();\n }\n\n this._scrollStrategy = scrollStrategy;\n }\n\n ngAfterContentInit() {\n this._checkMenu();\n this._handleHover();\n }\n\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n\n this._element.nativeElement.removeEventListener('touchstart', this._handleTouchStart,\n passiveEventListenerOptions);\n\n this._menuCloseSubscription.unsubscribe();\n this._closingActionsSubscription.unsubscribe();\n this._hoverSubscription.unsubscribe();\n }\n\n /** Whether the menu is open. */\n get menuOpen(): boolean {\n return this._menuOpen;\n }\n\n /** The text direction of the containing app. */\n get dir(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the menu triggers a sub-menu or a top-level one. */\n triggersSubmenu(): boolean {\n return !!(this._menuItemInstance && this._parentMenu);\n }\n\n /** Toggles the menu between the open and closed states. */\n toggleMenu(): void {\n return this._menuOpen ? this.closeMenu() : this.openMenu();\n }\n\n /** Opens the menu. */\n openMenu(): void {\n if (this._menuOpen) {\n return;\n }\n\n this._checkMenu();\n\n const overlayRef = this._createOverlay();\n const overlayConfig = overlayRef.getConfig();\n\n this._setPosition(overlayConfig.positionStrategy as FlexibleConnectedPositionStrategy);\n overlayConfig.hasBackdrop = this.menu.hasBackdrop == null ? !this.triggersSubmenu() :\n this.menu.hasBackdrop;\n overlayRef.attach(this._getPortal());\n\n if (this.menu.lazyContent) {\n this.menu.lazyContent.attach(this.menuData);\n }\n\n this._closingActionsSubscription = this._menuClosingActions().subscribe(() => this.closeMenu());\n this._initMenu();\n\n if (this.menu instanceof MatMenu) {\n this.menu._startAnimation();\n }\n }\n\n /** Closes the menu. */\n closeMenu(): void {\n this.menu.close.emit();\n }\n\n /**\n * Focuses the menu trigger.\n * @param origin Source of the menu trigger's focus.\n */\n focus(origin: FocusOrigin = 'program') {\n if (this._focusMonitor) {\n this._focusMonitor.focusVia(this._element, origin);\n } else {\n this._element.nativeElement.focus();\n }\n }\n\n /** Closes the menu and does the necessary cleanup. */\n private _destroyMenu() {\n if (!this._overlayRef || !this.menuOpen) {\n return;\n }\n\n const menu = this.menu;\n\n this._closingActionsSubscription.unsubscribe();\n this._overlayRef.detach();\n\n if (menu instanceof MatMenu) {\n menu._resetAnimation();\n\n if (menu.lazyContent) {\n // Wait for the exit animation to finish before detaching the content.\n menu._animationDone\n .pipe(\n filter(event => event.toState === 'void'),\n take(1),\n // Interrupt if the content got re-attached.\n takeUntil(menu.lazyContent._attached)\n )\n .subscribe({\n next: () => menu.lazyContent!.detach(),\n // No matter whether the content got re-attached, reset the menu.\n complete: () => this._resetMenu()\n });\n } else {\n this._resetMenu();\n }\n } else {\n this._resetMenu();\n\n if (menu.lazyContent) {\n menu.lazyContent.detach();\n }\n }\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 private _initMenu(): void {\n this.menu.parentMenu = this.triggersSubmenu() ? this._parentMenu : undefined;\n this.menu.direction = this.dir;\n this._setMenuElevation();\n this._setIsMenuOpen(true);\n this.menu.focusFirstItem(this._openedBy || 'program');\n }\n\n /** Updates the menu elevation based on the amount of parent menus that it has. */\n private _setMenuElevation(): void {\n if (this.menu.setElevation) {\n let depth = 0;\n let parentMenu = this.menu.parentMenu;\n\n while (parentMenu) {\n depth++;\n parentMenu = parentMenu.parentMenu;\n }\n\n this.menu.setElevation(depth);\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 private _resetMenu(): void {\n this._setIsMenuOpen(false);\n\n // We should reset focus if the user is navigating using a keyboard or\n // if we have a top-level trigger which might cause focus to be lost\n // when clicking on the backdrop.\n if (this.restoreFocus) {\n if (!this._openedBy) {\n // Note that the focus style will show up both for `program` and\n // `keyboard` so we don't have to specify which one it is.\n this.focus();\n } else if (!this.triggersSubmenu()) {\n this.focus(this._openedBy);\n }\n }\n\n this._openedBy = null;\n }\n\n // set state rather than toggle to support triggers sharing a menu\n private _setIsMenuOpen(isOpen: boolean): void {\n this._menuOpen = isOpen;\n this._menuOpen ? this.menuOpened.emit() : this.menuClosed.emit();\n\n if (this.triggersSubmenu()) {\n this._menuItemInstance._highlighted = isOpen;\n }\n }\n\n /**\n * This method checks that a valid instance of MatMenu has been passed into\n * matMenuTriggerFor. If not, an exception is thrown.\n */\n private _checkMenu() {\n if (!this.menu) {\n throwMatMenuMissingError();\n }\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 private _createOverlay(): OverlayRef {\n if (!this._overlayRef) {\n const config = this._getOverlayConfig();\n this._subscribeToPositions(config.positionStrategy as FlexibleConnectedPositionStrategy);\n this._overlayRef = this._overlay.create(config);\n\n // Consume the `keydownEvents` in order to prevent them from going to another overlay.\n // Ideally we'd also have our keyboard event logic in here, however doing so will\n // break anybody that may have implemented the `MatMenuPanel` themselves.\n this._overlayRef.keydownEvents().subscribe();\n }\n\n return this._overlayRef;\n }\n\n /**\n * This method builds the configuration object needed to create the overlay, the OverlayState.\n * @returns OverlayConfig\n */\n private _getOverlayConfig(): OverlayConfig {\n return new OverlayConfig({\n positionStrategy: this._overlay.position()\n .flexibleConnectedTo(this._element)\n .withLockedPosition()\n .withTransformOriginOn('.mat-menu-panel, .mat-mdc-menu-panel'),\n backdropClass: this.menu.backdropClass || 'cdk-overlay-transparent-backdrop',\n scrollStrategy: this._scrollStrategy(),\n direction: this._dir\n });\n }\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 private _subscribeToPositions(position: FlexibleConnectedPositionStrategy): void {\n if (this.menu.setPositionClasses) {\n position.positionChanges.subscribe(change => {\n const posX: MenuPositionX = change.connectionPair.overlayX === 'start' ? 'after' : 'before';\n const posY: MenuPositionY = change.connectionPair.overlayY === 'top' ? 'below' : 'above';\n\n this.menu.setPositionClasses!(posX, posY);\n });\n }\n }\n\n /**\n * Sets the appropriate positions on a position strategy\n * so the overlay connects with the trigger correctly.\n * @param positionStrategy Strategy whose position to update.\n */\n private _setPosition(positionStrategy: FlexibleConnectedPositionStrategy) {\n let [originX, originFallbackX]: HorizontalConnectionPos[] =\n this.menu.xPosition === 'before' ? ['end', 'start'] : ['start', 'end'];\n\n let [overlayY, overlayFallbackY]: VerticalConnectionPos[] =\n this.menu.yPosition === 'above' ? ['bottom', 'top'] : ['top', 'bottom'];\n\n let [originY, originFallbackY] = [overlayY, overlayFallbackY];\n let [overlayX, overlayFallbackX] = [originX, originFallbackX];\n let offsetY = 0;\n\n if (this.triggersSubmenu()) {\n // When the menu is a sub-menu, it should always align itself\n // to the edges of the trigger, instead of overlapping it.\n overlayFallbackX = originX = this.menu.xPosition === 'before' ? 'start' : 'end';\n originFallbackX = overlayX = originX === 'end' ? 'start' : 'end';\n offsetY = overlayY === 'bottom' ? MENU_PANEL_TOP_PADDING : -MENU_PANEL_TOP_PADDING;\n } else if (!this.menu.overlapTrigger) {\n originY = overlayY === 'top' ? 'bottom' : 'top';\n originFallbackY = overlayFallbackY === 'top' ? 'bottom' : 'top';\n }\n\n positionStrategy.withPositions([\n {originX, originY, overlayX, overlayY, offsetY},\n {originX: originFallbackX, originY, overlayX: overlayFallbackX, overlayY, offsetY},\n {\n originX,\n originY: originFallbackY,\n overlayX,\n overlayY: overlayFallbackY,\n offsetY: -offsetY\n },\n {\n originX: originFallbackX,\n originY: originFallbackY,\n overlayX: overlayFallbackX,\n overlayY: overlayFallbackY,\n offsetY: -offsetY\n }\n ]);\n }\n\n /** Returns a stream that emits whenever an action that should close the menu occurs. */\n private _menuClosingActions() {\n const backdrop = this._overlayRef!.backdropClick();\n const detachments = this._overlayRef!.detachments();\n const parentClose = this._parentMenu ? this._parentMenu.closed : observableOf();\n const hover = this._parentMenu ? this._parentMenu._hovered().pipe(\n filter(active => active !== this._menuItemInstance),\n filter(() => this._menuOpen)\n ) : observableOf();\n\n return merge(backdrop, parentClose, hover, detachments);\n }\n\n /** Handles mouse presses on the trigger. */\n _handleMousedown(event: MouseEvent): void {\n if (!isFakeMousedownFromScreenReader(event)) {\n // Since right or middle button clicks won't trigger the `click` event,\n // we shouldn't consider the menu as opened by mouse in those cases.\n this._openedBy = event.button === 0 ? 'mouse' : null;\n\n // Since clicking on the trigger won't close the menu if it opens a sub-menu,\n // we should prevent focus from moving onto it via click to avoid the\n // highlight from lingering on the menu item.\n if (this.triggersSubmenu()) {\n event.preventDefault();\n }\n }\n }\n\n /** Handles key presses on the trigger. */\n _handleKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n\n if (this.triggersSubmenu() && (\n (keyCode === RIGHT_ARROW && this.dir === 'ltr') ||\n (keyCode === LEFT_ARROW && this.dir === 'rtl'))) {\n this.openMenu();\n }\n }\n\n /** Handles click events on the trigger. */\n _handleClick(event: MouseEvent): void {\n if (this.triggersSubmenu()) {\n // Stop event propagation to avoid closing the parent menu.\n event.stopPropagation();\n this.openMenu();\n } else {\n this.toggleMenu();\n }\n }\n\n /** Handles the cases where the user hovers over the trigger. */\n private _handleHover() {\n // Subscribe to changes in the hovered item in order to toggle the panel.\n if (!this.triggersSubmenu()) {\n return;\n }\n\n this._hoverSubscription = this._parentMenu._hovered()\n // Since we might have multiple competing triggers for the same menu (e.g. a sub-menu\n // with different data and triggers), we have to delay it by a tick to ensure that\n // it won't be closed immediately after it is opened.\n .pipe(\n filter(active => active === this._menuItemInstance && !active.disabled),\n delay(0, asapScheduler)\n )\n .subscribe(() => {\n this._openedBy = 'mouse';\n\n // If the same menu is used between multiple triggers, it might still be animating\n // while the new trigger tries to re-open it. Wait for the animation to finish\n // before doing so. Also interrupt if the user moves to another item.\n if (this.menu instanceof MatMenu && this.menu._isAnimating) {\n // We need the `delay(0)` here in order to avoid\n // 'changed after checked' errors in some cases. See #12194.\n this.menu._animationDone\n .pipe(take(1), delay(0, asapScheduler), takeUntil(this._parentMenu._hovered()))\n .subscribe(() => this.openMenu());\n } else {\n this.openMenu();\n }\n });\n }\n\n /** Gets the portal that should be attached to the overlay. */\n private _getPortal(): TemplatePortal {\n // Note that we can avoid this check by keeping the portal on the menu panel.\n // While it would be cleaner, we'd have to introduce another required method on\n // `MatMenuPanel`, making it harder to consume.\n if (!this._portal || this._portal.templateRef !== this.menu.templateRef) {\n this._portal = new TemplatePortal(this.menu.templateRef, this._viewContainerRef);\n }\n\n return this._portal;\n }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatMenuContent} from './menu-content';\nimport {_MatMenu} from './menu';\nimport {MatMenuItem} from './menu-item';\nimport {\n MatMenuTrigger,\n MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER,\n} from './menu-trigger';\n\n/**\n * Used by both the current `MatMenuModule` and the MDC `MatMenuModule`\n * to declare the menu-related directives.\n */\n@NgModule({\n exports: [MatMenuTrigger, MatMenuContent, MatCommonModule],\n declarations: [MatMenuTrigger, MatMenuContent],\n providers: [MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER]\n})\n// tslint:disable-next-line:class-name\nexport class _MatMenuDirectivesModule {}\n\n@NgModule({\n imports: [\n CommonModule,\n MatCommonModule,\n MatRippleModule,\n OverlayModule,\n _MatMenuDirectivesModule,\n ],\n exports: [_MatMenu, MatMenuItem, _MatMenuDirectivesModule],\n declarations: [_MatMenu, MatMenuItem],\n providers: [MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER]\n})\nexport class MatMenuModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n animate,\n animateChild,\n AnimationTriggerMetadata,\n query,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\n\n/**\n * The following are all the animations for the mat-select component, with each\n * const containing the metadata for one animation.\n *\n * The values below match the implementation of the AngularJS Material mat-select animation.\n * @docs-private\n */\nexport const matSelectAnimations: {\n readonly transformPanelWrap: AnimationTriggerMetadata;\n readonly transformPanel: AnimationTriggerMetadata;\n readonly fadeInContent: AnimationTriggerMetadata;\n} = {\n /**\n * This animation ensures the select's overlay panel animation (transformPanel) is called when\n * closing the select.\n * This is needed due to https://github.com/angular/angular/issues/23302\n */\n transformPanelWrap: trigger('transformPanelWrap', [\n transition('* => void', query('@transformPanel', [animateChild()],\n {optional: true}))\n ]),\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 by the amount of padding, scales it\n * up to 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 */\n transformPanel: trigger('transformPanel', [\n state('void', style({\n transform: 'scaleY(0.8)',\n minWidth: '100%',\n opacity: 0\n })),\n state('showing', style({\n opacity: 1,\n minWidth: 'calc(100% + 32px)', // 32px = 2 * 16px padding\n transform: 'scaleY(1)'\n })),\n state('showing-multiple', style({\n opacity: 1,\n minWidth: 'calc(100% + 64px)', // 64px = 48px padding on the left + 16px padding on the right\n transform: 'scaleY(1)'\n })),\n transition('void => *', animate('120ms cubic-bezier(0, 0, 0.2, 1)')),\n transition('* => void', animate('100ms 25ms linear', 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 * @deprecated Not used anymore. To be removed.\n * @breaking-change 8.0.0\n */\n fadeInContent: trigger('fadeInContent', [\n state('showing', style({opacity: 1})),\n transition('void => showing', [\n style({opacity: 0}),\n animate('150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)')\n ])\n ])\n};\n\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const transformPanel = matSelectAnimations.transformPanel;\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const fadeInContent = matSelectAnimations.fadeInContent;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusableOption, FocusKeyManager} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {\n SPACE,\n ENTER,\n HOME,\n END,\n UP_ARROW,\n DOWN_ARROW,\n A,\n hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport {\n CanDisableRipple, CanDisableRippleCtor,\n MatLine,\n setLines,\n mixinDisableRipple,\n ThemePalette,\n} from '@angular/material/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {Subject} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {MatListAvatarCssMatStyler, MatListIconCssMatStyler} from './list';\n\n\n/** @docs-private */\nclass MatSelectionListBase {}\nconst _MatSelectionListMixinBase: CanDisableRippleCtor & typeof MatSelectionListBase =\n mixinDisableRipple(MatSelectionListBase);\n\n/** @docs-private */\nclass MatListOptionBase {}\nconst _MatListOptionMixinBase: CanDisableRippleCtor & typeof MatListOptionBase =\n mixinDisableRipple(MatListOptionBase);\n\n/** @docs-private */\nexport const MAT_SELECTION_LIST_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSelectionList),\n multi: true\n};\n\n/** Change event that is being fired whenever the selected state of an option changes. */\nexport class MatSelectionListChange {\n constructor(\n /** Reference to the selection list that emitted the event. */\n public source: MatSelectionList,\n /** Reference to the option that has been changed. */\n public option: MatListOption) {}\n}\n\n/**\n * Component for list-options of selection-list. Each list-option can automatically\n * generate a checkbox and can put current item into the selectionModel of selection-list\n * if the current item is selected.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-list-option',\n exportAs: 'matListOption',\n inputs: ['disableRipple'],\n host: {\n 'role': 'option',\n 'class': 'mat-list-item mat-list-option',\n '(focus)': '_handleFocus()',\n '(blur)': '_handleBlur()',\n '(click)': '_handleClick()',\n 'tabindex': '-1',\n '[class.mat-list-item-disabled]': 'disabled',\n '[class.mat-list-item-with-avatar]': '_avatar || _icon',\n // Manually set the \"primary\" or \"warn\" class if the color has been explicitly\n // set to \"primary\" or \"warn\". The pseudo checkbox picks up these classes for\n // its theme. The accent theme palette is the default and doesn't need to be set.\n '[class.mat-primary]': 'color === \"primary\"',\n '[class.mat-warn]': 'color === \"warn\"',\n '[attr.aria-selected]': 'selected',\n '[attr.aria-disabled]': 'disabled',\n },\n templateUrl: 'list-option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatListOption extends _MatListOptionMixinBase\n implements AfterContentInit, OnDestroy, OnInit, FocusableOption, CanDisableRipple {\n\n private _selected = false;\n private _disabled = false;\n private _hasFocus = false;\n\n @ContentChild(MatListAvatarCssMatStyler, {static: false}) _avatar: MatListAvatarCssMatStyler;\n @ContentChild(MatListIconCssMatStyler, {static: false}) _icon: MatListIconCssMatStyler;\n @ContentChildren(MatLine) _lines: QueryList<MatLine>;\n\n /** DOM element containing the item's text. */\n @ViewChild('text', {static: false}) _text: ElementRef;\n\n /** Whether the label should appear before or after the checkbox. Defaults to 'after' */\n @Input() checkboxPosition: 'before' | 'after' = 'after';\n\n /** Theme color of the list option. This sets the color of the checkbox. */\n @Input()\n get color(): ThemePalette { return this._color || this.selectionList.color; }\n set color(newValue: ThemePalette) { this._color = newValue; }\n private _color: ThemePalette;\n\n /** Value of the option */\n @Input()\n get value(): any { return this._value; }\n set value(newValue: any) {\n if (this.selected && newValue !== this.value) {\n this.selected = false;\n }\n\n this._value = newValue;\n }\n private _value: any;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() { return this._disabled || (this.selectionList && this.selectionList.disabled); }\n set disabled(value: any) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this._changeDetector.markForCheck();\n }\n }\n\n /** Whether the option is selected. */\n @Input()\n get selected(): boolean { return this.selectionList.selectedOptions.isSelected(this); }\n set selected(value: boolean) {\n const isSelected = coerceBooleanProperty(value);\n\n if (isSelected !== this._selected) {\n this._setSelected(isSelected);\n this.selectionList._reportValueChange();\n }\n }\n\n constructor(private _element: ElementRef<HTMLElement>,\n private _changeDetector: ChangeDetectorRef,\n /** @docs-private */\n @Inject(forwardRef(() => MatSelectionList)) public selectionList: MatSelectionList) {\n super();\n }\n\n ngOnInit() {\n const list = this.selectionList;\n\n if (list._value && list._value.some(value => list.compareWith(value, this._value))) {\n this._setSelected(true);\n }\n\n const wasSelected = this._selected;\n\n // List options that are selected at initialization can't be reported properly to the form\n // control. This is because it takes some time until the selection-list knows about all\n // available options. Also it can happen that the ControlValueAccessor has an initial value\n // that should be used instead. Deferring the value change report to the next tick ensures\n // that the form control value is not being overwritten.\n Promise.resolve().then(() => {\n if (this._selected || wasSelected) {\n this.selected = true;\n this._changeDetector.markForCheck();\n }\n });\n }\n\n ngAfterContentInit() {\n setLines(this._lines, this._element);\n }\n\n ngOnDestroy(): void {\n if (this.selected) {\n // We have to delay this until the next tick in order\n // to avoid changed after checked errors.\n Promise.resolve().then(() => {\n this.selected = false;\n });\n }\n\n const hadFocus = this._hasFocus;\n const newActiveItem = this.selectionList._removeOptionFromList(this);\n\n // Only move focus if this option was focused at the time it was destroyed.\n if (hadFocus && newActiveItem) {\n newActiveItem.focus();\n }\n }\n\n /** Toggles the selection state of the option. */\n toggle(): void {\n this.selected = !this.selected;\n }\n\n /** Allows for programmatic focusing of the option. */\n focus(): void {\n this._element.nativeElement.focus();\n }\n\n /**\n * Returns the list item's text label. Implemented as a part of the FocusKeyManager.\n * @docs-private\n */\n getLabel() {\n return this._text ? (this._text.nativeElement.textContent || '') : '';\n }\n\n /** Whether this list item should show a ripple effect when clicked. */\n _isRippleDisabled() {\n return this.disabled || this.disableRipple || this.selectionList.disableRipple;\n }\n\n _handleClick() {\n if (!this.disabled) {\n this.toggle();\n\n // Emit a change event if the selected state of the option changed through user interaction.\n this.selectionList._emitChangeEvent(this);\n }\n }\n\n _handleFocus() {\n this.selectionList._setFocusedOption(this);\n this._hasFocus = true;\n }\n\n _handleBlur() {\n this.selectionList._onTouched();\n this._hasFocus = false;\n }\n\n /** Retrieves the DOM element of the component host. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n /** Sets the selected state of the option. Returns whether the value has changed. */\n _setSelected(selected: boolean): boolean {\n if (selected === this._selected) {\n return false;\n }\n\n this._selected = selected;\n\n if (selected) {\n this.selectionList.selectedOptions.select(this);\n } else {\n this.selectionList.selectedOptions.deselect(this);\n }\n\n this._changeDetector.markForCheck();\n return true;\n }\n\n /**\n * Notifies Angular that the option needs to be checked in the next change detection run. Mainly\n * used to trigger an update of the list option if the disabled state of the selection list\n * changed.\n */\n _markForCheck() {\n this._changeDetector.markForCheck();\n }\n}\n\n\n/**\n * Material Design list component where each item is a selectable option. Behaves as a listbox.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-selection-list',\n exportAs: 'matSelectionList',\n inputs: ['disableRipple'],\n host: {\n 'role': 'listbox',\n '[tabIndex]': 'tabIndex',\n 'class': 'mat-selection-list mat-list-base',\n '(blur)': '_onTouched()',\n '(keydown)': '_keydown($event)',\n 'aria-multiselectable': 'true',\n '[attr.aria-disabled]': 'disabled.toString()',\n },\n template: '<ng-content></ng-content>',\n styleUrls: ['list.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [MAT_SELECTION_LIST_VALUE_ACCESSOR],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatSelectionList extends _MatSelectionListMixinBase implements FocusableOption,\n CanDisableRipple, AfterContentInit, ControlValueAccessor, OnDestroy, OnChanges {\n\n /** The FocusKeyManager which handles focus. */\n _keyManager: FocusKeyManager<MatListOption>;\n\n /** The option components contained within this selection-list. */\n @ContentChildren(MatListOption, {descendants: true}) options: QueryList<MatListOption>;\n\n /** Emits a change event whenever the selected state of an option changes. */\n @Output() readonly selectionChange: EventEmitter<MatSelectionListChange> =\n new EventEmitter<MatSelectionListChange>();\n\n /** Tabindex of the selection list. */\n @Input() tabIndex: number = 0;\n\n /** Theme color of the selection list. This sets the checkbox color for all list options. */\n @Input() color: ThemePalette = 'accent';\n\n /**\n * Function used for comparing an option against the selected value when determining which\n * options should appear as selected. The first argument is the value of an options. The second\n * one is a value from the selected value. A boolean must be returned.\n */\n @Input() compareWith: (o1: any, o2: any) => boolean = (a1, a2) => a1 === a2;\n\n /** Whether the selection list is disabled. */\n @Input()\n get disabled(): boolean { return this._disabled; }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n\n // The `MatSelectionList` and `MatListOption` are using the `OnPush` change detection\n // strategy. Therefore the options will not check for any changes if the `MatSelectionList`\n // changed its state. Since we know that a change to `disabled` property of the list affects\n // the state of the options, we manually mark each option for check.\n this._markOptionsForCheck();\n }\n private _disabled: boolean = false;\n\n /** The currently selected options. */\n selectedOptions: SelectionModel<MatListOption> = new SelectionModel<MatListOption>(true);\n\n /** View to model callback that should be called whenever the selected options change. */\n private _onChange: (value: any) => void = (_: any) => {};\n\n /** Keeps track of the currently-selected value. */\n _value: string[]|null;\n\n /** Emits when the list has been destroyed. */\n private _destroyed = new Subject<void>();\n\n /** View to model callback that should be called if the list or its options lost focus. */\n _onTouched: () => void = () => {};\n\n /** Whether the list has been destroyed. */\n private _isDestroyed: boolean;\n\n constructor(private _element: ElementRef<HTMLElement>, @Attribute('tabindex') tabIndex: string) {\n super();\n this.tabIndex = parseInt(tabIndex) || 0;\n }\n\n ngAfterContentInit(): void {\n this._keyManager = new FocusKeyManager<MatListOption>(this.options)\n .withWrap()\n .withTypeAhead()\n // Allow disabled items to be focusable. For accessibility reasons, there must be a way for\n // screenreader users, that allows reading the different options of the list.\n .skipPredicate(() => false)\n .withAllowedModifierKeys(['shiftKey']);\n\n if (this._value) {\n this._setOptionsFromValues(this._value);\n }\n\n // Sync external changes to the model back to the options.\n this.selectedOptions.onChange.pipe(takeUntil(this._destroyed)).subscribe(event => {\n if (event.added) {\n for (let item of event.added) {\n item.selected = true;\n }\n }\n\n if (event.removed) {\n for (let item of event.removed) {\n item.selected = false;\n }\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const disableRippleChanges = changes['disableRipple'];\n const colorChanges = changes['color'];\n\n if ((disableRippleChanges && !disableRippleChanges.firstChange) ||\n (colorChanges && !colorChanges.firstChange)) {\n this._markOptionsForCheck();\n }\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this._isDestroyed = true;\n }\n\n /** Focuses the selection list. */\n focus() {\n this._element.nativeElement.focus();\n }\n\n /** Selects all of the options. */\n selectAll() {\n this._setAllOptionsSelected(true);\n }\n\n /** Deselects all of the options. */\n deselectAll() {\n this._setAllOptionsSelected(false);\n }\n\n /** Sets the focused option of the selection-list. */\n _setFocusedOption(option: MatListOption) {\n this._keyManager.updateActiveItem(option);\n }\n\n /**\n * Removes an option from the selection list and updates the active item.\n * @returns Currently-active item.\n */\n _removeOptionFromList(option: MatListOption): MatListOption | null {\n const optionIndex = this._getOptionIndex(option);\n\n if (optionIndex > -1 && this._keyManager.activeItemIndex === optionIndex) {\n // Check whether the option is the last item\n if (optionIndex > 0) {\n this._keyManager.updateActiveItem(optionIndex - 1);\n } else if (optionIndex === 0 && this.options.length > 1) {\n this._keyManager.updateActiveItem(Math.min(optionIndex + 1, this.options.length - 1));\n }\n }\n\n return this._keyManager.activeItem;\n }\n\n /** Passes relevant key presses to our key manager. */\n _keydown(event: KeyboardEvent) {\n const keyCode = event.keyCode;\n const manager = this._keyManager;\n const previousFocusIndex = manager.activeItemIndex;\n const hasModifier = hasModifierKey(event);\n\n switch (keyCode) {\n case SPACE:\n case ENTER:\n if (!hasModifier) {\n this._toggleFocusedOption();\n // Always prevent space from scrolling the page since the list has focus\n event.preventDefault();\n }\n break;\n case HOME:\n case END:\n if (!hasModifier) {\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n event.preventDefault();\n }\n break;\n case A:\n if (hasModifierKey(event, 'ctrlKey')) {\n this.options.find(option => !option.selected) ? this.selectAll() : this.deselectAll();\n event.preventDefault();\n }\n break;\n default:\n manager.onKeydown(event);\n }\n\n if ((keyCode === UP_ARROW || keyCode === DOWN_ARROW) && event.shiftKey &&\n manager.activeItemIndex !== previousFocusIndex) {\n this._toggleFocusedOption();\n }\n }\n\n /** Reports a value change to the ControlValueAccessor */\n _reportValueChange() {\n // Stop reporting value changes after the list has been destroyed. This avoids\n // cases where the list might wrongly reset its value once it is removed, but\n // the form control is still live.\n if (this.options && !this._isDestroyed) {\n const value = this._getSelectedOptionValues();\n this._onChange(value);\n this._value = value;\n }\n }\n\n /** Emits a change event if the selected state of an option changed. */\n _emitChangeEvent(option: MatListOption) {\n this.selectionChange.emit(new MatSelectionListChange(this, option));\n }\n\n /** Implemented as part of ControlValueAccessor. */\n writeValue(values: string[]): void {\n this._value = values;\n\n if (this.options) {\n this._setOptionsFromValues(values || []);\n }\n }\n\n /** Implemented as a part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: any) => void): void {\n this._onChange = fn;\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n /** Sets the selected options based on the specified values. */\n private _setOptionsFromValues(values: string[]) {\n this.options.forEach(option => option._setSelected(false));\n\n values.forEach(value => {\n const correspondingOption = this.options.find(option => {\n // Skip options that are already in the model. This allows us to handle cases\n // where the same primitive value is selected multiple times.\n return option.selected ? false : this.compareWith(option.value, value);\n });\n\n if (correspondingOption) {\n correspondingOption._setSelected(true);\n }\n });\n }\n\n /** Returns the values of the selected options. */\n private _getSelectedOptionValues(): string[] {\n return this.options.filter(option => option.selected).map(option => option.value);\n }\n\n /** Toggles the state of the currently focused option if enabled. */\n private _toggleFocusedOption(): void {\n let focusedIndex = this._keyManager.activeItemIndex;\n\n if (focusedIndex != null && this._isValidIndex(focusedIndex)) {\n let focusedOption: MatListOption = this.options.toArray()[focusedIndex];\n\n if (focusedOption && !focusedOption.disabled) {\n focusedOption.toggle();\n\n // Emit a change event because the focused option changed its state through user\n // interaction.\n this._emitChangeEvent(focusedOption);\n }\n }\n }\n\n /**\n * Sets the selected state on all of the options\n * and emits an event if anything changed.\n */\n private _setAllOptionsSelected(isSelected: boolean) {\n // Keep track of whether anything changed, because we only want to\n // emit the changed event when something actually changed.\n let hasChanged = false;\n\n this.options.forEach(option => {\n if (option._setSelected(isSelected)) {\n hasChanged = true;\n }\n });\n\n if (hasChanged) {\n this._reportValueChange();\n }\n }\n\n /**\n * Utility to ensure all indexes are valid.\n * @param index The index to be checked.\n * @returns True if the index is valid for our list of options.\n */\n private _isValidIndex(index: number): boolean {\n return index >= 0 && index < this.options.length;\n }\n\n /** Returns the index of the specified list option. */\n private _getOptionIndex(option: MatListOption): number {\n return this.options.toArray().indexOf(option);\n }\n\n /** Marks all the options to be checked in the next change detection run. */\n private _markOptionsForCheck() {\n if (this.options) {\n this.options.forEach(option => option._markForCheck());\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {\n MatCommonModule,\n MatLineModule,\n MatPseudoCheckboxModule,\n MatRippleModule,\n} from '@angular/material/core';\nimport {\n MatList,\n MatNavList,\n MatListAvatarCssMatStyler,\n MatListIconCssMatStyler,\n MatListItem,\n MatListSubheaderCssMatStyler,\n} from './list';\nimport {MatListOption, MatSelectionList} from './selection-list';\nimport {MatDividerModule} from '@angular/material/divider';\n\n\n@NgModule({\n imports: [MatLineModule, MatRippleModule, MatCommonModule, MatPseudoCheckboxModule, CommonModule],\n exports: [\n MatList,\n MatNavList,\n MatListItem,\n MatListAvatarCssMatStyler,\n MatLineModule,\n MatCommonModule,\n MatListIconCssMatStyler,\n MatListSubheaderCssMatStyler,\n MatPseudoCheckboxModule,\n MatSelectionList,\n MatListOption,\n MatDividerModule\n ],\n declarations: [\n MatList,\n MatNavList,\n MatListItem,\n MatListAvatarCssMatStyler,\n MatListIconCssMatStyler,\n MatListSubheaderCssMatStyler,\n MatSelectionList,\n MatListOption\n ],\n})\nexport class MatListModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport{\n trigger,\n state,\n style,\n animate,\n transition,\n query,\n group,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the mat-menu component.\n * Animation duration and timing values are based on:\n * https://material.io/guidelines/components/menus.html#menus-usage\n * @docs-private\n */\nexport const matMenuAnimations: {\n readonly transformMenu: AnimationTriggerMetadata;\n readonly fadeInItems: AnimationTriggerMetadata;\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 transformMenu: trigger('transformMenu', [\n state('void', style({\n opacity: 0,\n transform: 'scale(0.8)'\n })),\n transition('void => enter', group([\n query('.mat-menu-content, .mat-mdc-menu-content', animate('100ms linear', style({\n opacity: 1\n }))),\n animate('120ms cubic-bezier(0, 0, 0.2, 1)', style({transform: 'scale(1)'})),\n ])),\n transition('* => void', animate('100ms 25ms linear', style({opacity: 0})))\n ]),\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 */\n fadeInItems: trigger('fadeInItems', [\n // TODO(crisbeto): this is inside the `transformMenu`\n // now. Remove next time we do breaking changes.\n state('showing', style({opacity: 1})),\n transition('void => *', [\n style({opacity: 0}),\n animate('400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)')\n ])\n ])\n};\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const fadeInItems = matMenuAnimations.fadeInItems;\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const transformMenu = matMenuAnimations.transformMenu;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Directive,\n TemplateRef,\n ComponentFactoryResolver,\n ApplicationRef,\n Injector,\n ViewContainerRef,\n Inject,\n OnDestroy,\n} from '@angular/core';\nimport {TemplatePortal, DomPortalOutlet} from '@angular/cdk/portal';\nimport {DOCUMENT} from '@angular/common';\nimport {Subject} from 'rxjs';\n\n/**\n * Menu content that will be rendered lazily once the menu is opened.\n */\n@Directive({\n selector: 'ng-template[matMenuContent]'\n})\nexport class MatMenuContent implements OnDestroy {\n private _portal: TemplatePortal<any>;\n private _outlet: DomPortalOutlet;\n\n /** Emits when the menu content has been attached. */\n _attached = new Subject<void>();\n\n constructor(\n private _template: TemplateRef<any>,\n private _componentFactoryResolver: ComponentFactoryResolver,\n private _appRef: ApplicationRef,\n private _injector: Injector,\n private _viewContainerRef: ViewContainerRef,\n @Inject(DOCUMENT) private _document: any) {}\n\n /**\n * Attaches the content with a particular context.\n * @docs-private\n */\n attach(context: any = {}) {\n if (!this._portal) {\n this._portal = new TemplatePortal(this._template, this._viewContainerRef);\n }\n\n this.detach();\n\n if (!this._outlet) {\n this._outlet = new DomPortalOutlet(this._document.createElement('div'),\n this._componentFactoryResolver, this._appRef, this._injector);\n }\n\n const element: HTMLElement = this._template.elementRef.nativeElement;\n\n // Because we support opening the same menu from different triggers (which in turn have their\n // own `OverlayRef` panel), we have to re-insert the host element every time, otherwise we\n // risk it staying attached to a pane that's no longer in the DOM.\n element.parentNode!.insertBefore(this._outlet.outletElement, element);\n this._portal.attach(this._outlet, context);\n this._attached.next();\n }\n\n /**\n * Detaches the content.\n * @docs-private\n */\n detach() {\n if (this._portal.isAttached) {\n this._portal.detach();\n }\n }\n\n ngOnDestroy() {\n if (this._outlet) {\n this._outlet.dispose();\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {EventEmitter, TemplateRef, InjectionToken} from '@angular/core';\nimport {MenuPositionX, MenuPositionY} from './menu-positions';\nimport {Direction} from '@angular/cdk/bidi';\nimport {FocusOrigin} from '@angular/cdk/a11y';\nimport {MatMenuContent} from './menu-content';\n\n/**\n * Injection token used to provide the parent menu to menu-specific components.\n * @docs-private\n */\nexport const MAT_MENU_PANEL = new InjectionToken<MatMenuPanel>('MAT_MENU_PANEL');\n\n/**\n * Interface for a custom menu panel that can be used with `matMenuTriggerFor`.\n * @docs-private\n */\nexport interface MatMenuPanel<T = any> {\n xPosition: MenuPositionX;\n yPosition: MenuPositionY;\n overlapTrigger: boolean;\n templateRef: TemplateRef<any>;\n close: EventEmitter<void | 'click' | 'keydown' | 'tab'>;\n parentMenu?: MatMenuPanel | undefined;\n direction?: Direction;\n focusFirstItem: (origin?: FocusOrigin) => void;\n resetActiveItem: () => void;\n setPositionClasses?: (x: MenuPositionX, y: MenuPositionY) => void;\n setElevation?(depth: number): void;\n lazyContent?: MatMenuContent;\n backdropClass?: string;\n hasBackdrop?: boolean;\n\n /**\n * @deprecated To be removed.\n * @breaking-change 8.0.0\n */\n addItem?: (item: T) => void;\n\n /**\n * @deprecated To be removed.\n * @breaking-change 8.0.0\n */\n removeItem?: (item: T) => void;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusableOption, FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n Inject,\n Optional,\n Input,\n HostListener,\n} from '@angular/core';\nimport {\n CanDisable, CanDisableCtor,\n CanDisableRipple, CanDisableRippleCtor,\n mixinDisabled,\n mixinDisableRipple,\n} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {DOCUMENT} from '@angular/common';\nimport {MAT_MENU_PANEL, MatMenuPanel} from './menu-panel';\n\n// Boilerplate for applying mixins to MatMenuItem.\n/** @docs-private */\nclass MatMenuItemBase {}\nconst _MatMenuItemMixinBase: CanDisableRippleCtor & CanDisableCtor & typeof MatMenuItemBase =\n mixinDisableRipple(mixinDisabled(MatMenuItemBase));\n\n/**\n * This directive is intended to be used inside an mat-menu tag.\n * It exists mostly to set the role attribute.\n */\n@Component({\n moduleId: module.id,\n selector: '[mat-menu-item]',\n exportAs: 'matMenuItem',\n inputs: ['disabled', 'disableRipple'],\n host: {\n '[attr.role]': 'role',\n 'class': 'mat-menu-item',\n '[class.mat-menu-item-highlighted]': '_highlighted',\n '[class.mat-menu-item-submenu-trigger]': '_triggersSubmenu',\n '[attr.tabindex]': '_getTabIndex()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.disabled]': 'disabled || null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: 'menu-item.html',\n})\nexport class MatMenuItem extends _MatMenuItemMixinBase\n implements FocusableOption, CanDisable, CanDisableRipple, OnDestroy {\n\n /** ARIA role for the menu item. */\n @Input() role: 'menuitem' | 'menuitemradio' | 'menuitemcheckbox' = 'menuitem';\n\n private _document: Document;\n\n /** Stream that emits when the menu item is hovered. */\n readonly _hovered: Subject<MatMenuItem> = new Subject<MatMenuItem>();\n\n /** Whether the menu item is highlighted. */\n _highlighted: boolean = false;\n\n /** Whether the menu item acts as a trigger for a sub-menu. */\n _triggersSubmenu: boolean = false;\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n @Inject(DOCUMENT) document?: any,\n private _focusMonitor?: FocusMonitor,\n @Inject(MAT_MENU_PANEL) @Optional() public _parentMenu?: MatMenuPanel<MatMenuItem>) {\n\n // @breaking-change 8.0.0 make `_focusMonitor` and `document` required params.\n super();\n\n if (_focusMonitor) {\n // Start monitoring the element so it gets the appropriate focused classes. We want\n // to show the focus style for menu items only when the focus was not caused by a\n // mouse or touch interaction.\n _focusMonitor.monitor(this._elementRef, false);\n }\n\n if (_parentMenu && _parentMenu.addItem) {\n _parentMenu.addItem(this);\n }\n\n this._document = document;\n }\n\n /** Focuses the menu item. */\n focus(origin: FocusOrigin = 'program'): void {\n if (this._focusMonitor) {\n this._focusMonitor.focusVia(this._getHostElement(), origin);\n } else {\n this._getHostElement().focus();\n }\n }\n\n ngOnDestroy() {\n if (this._focusMonitor) {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n if (this._parentMenu && this._parentMenu.removeItem) {\n this._parentMenu.removeItem(this);\n }\n\n this._hovered.complete();\n }\n\n /** Used to set the `tabindex`. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Returns the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._elementRef.nativeElement;\n }\n\n /** Prevents the default element actions if it is disabled. */\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritte.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n @HostListener('click', ['$event'])\n _checkDisabled(event: Event): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /** Emits to the hover stream. */\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritte.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n @HostListener('mouseenter')\n _handleMouseEnter() {\n this._hovered.next(this);\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n const element: HTMLElement = this._elementRef.nativeElement;\n const textNodeType = this._document ? this._document.TEXT_NODE : 3;\n let output = '';\n\n if (element.childNodes) {\n const length = element.childNodes.length;\n\n // Go through all the top-level text nodes and extract their text.\n // We skip anything that's not a text node to prevent the text from\n // being thrown off by something like an icon.\n for (let i = 0; i < length; i++) {\n if (element.childNodes[i].nodeType === textNodeType) {\n output += element.childNodes[i].textContent;\n }\n }\n }\n\n return output.trim();\n }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n Optional,\n QueryList,\n ViewEncapsulation,\n OnChanges,\n OnDestroy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n CanDisableRipple,\n CanDisableRippleCtor,\n MatLine,\n setLines,\n mixinDisableRipple,\n} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\n\n// Boilerplate for applying mixins to MatList.\n/** @docs-private */\nclass MatListBase {}\nconst _MatListMixinBase: CanDisableRippleCtor & typeof MatListBase =\n mixinDisableRipple(MatListBase);\n\n// Boilerplate for applying mixins to MatListItem.\n/** @docs-private */\nclass MatListItemBase {}\nconst _MatListItemMixinBase: CanDisableRippleCtor & typeof MatListItemBase =\n mixinDisableRipple(MatListItemBase);\n\n@Component({\n moduleId: module.id,\n selector: 'mat-nav-list',\n exportAs: 'matNavList',\n host: {\n 'role': 'navigation',\n 'class': 'mat-nav-list mat-list-base'\n },\n templateUrl: 'list.html',\n styleUrls: ['list.css'],\n inputs: ['disableRipple'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatNavList extends _MatListMixinBase implements CanDisableRipple, OnChanges,\n OnDestroy {\n /** Emits when the state of the list changes. */\n _stateChanges = new Subject<void>();\n\n ngOnChanges() {\n this._stateChanges.next();\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-list, mat-action-list',\n exportAs: 'matList',\n templateUrl: 'list.html',\n host: {\n 'class': 'mat-list mat-list-base'\n },\n styleUrls: ['list.css'],\n inputs: ['disableRipple'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatList extends _MatListMixinBase implements CanDisableRipple, OnChanges, OnDestroy {\n /** Emits when the state of the list changes. */\n _stateChanges = new Subject<void>();\n\n constructor(private _elementRef: ElementRef<HTMLElement>) {\n super();\n\n if (this._getListType() === 'action-list') {\n _elementRef.nativeElement.classList.add('mat-action-list');\n }\n }\n\n _getListType(): 'list' | 'action-list' | null {\n const nodeName = this._elementRef.nativeElement.nodeName.toLowerCase();\n\n if (nodeName === 'mat-list') {\n return 'list';\n }\n\n if (nodeName === 'mat-action-list') {\n return 'action-list';\n }\n\n return null;\n }\n\n ngOnChanges() {\n this._stateChanges.next();\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: '[mat-list-avatar], [matListAvatar]',\n host: {'class': 'mat-list-avatar'}\n})\nexport class MatListAvatarCssMatStyler {}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: '[mat-list-icon], [matListIcon]',\n host: {'class': 'mat-list-icon'}\n})\nexport class MatListIconCssMatStyler {}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: '[mat-subheader], [matSubheader]',\n host: {'class': 'mat-subheader'}\n})\nexport class MatListSubheaderCssMatStyler {}\n\n/** An item within a Material Design list. */\n@Component({\n moduleId: module.id,\n selector: 'mat-list-item, a[mat-list-item], button[mat-list-item]',\n exportAs: 'matListItem',\n host: {\n 'class': 'mat-list-item',\n // @breaking-change 8.0.0 Remove `mat-list-item-avatar` in favor of `mat-list-item-with-avatar`.\n '[class.mat-list-item-avatar]': '_avatar || _icon',\n '[class.mat-list-item-with-avatar]': '_avatar || _icon',\n },\n inputs: ['disableRipple'],\n templateUrl: 'list-item.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatListItem extends _MatListItemMixinBase implements AfterContentInit,\n CanDisableRipple, OnDestroy {\n private _isInteractiveList: boolean = false;\n private _list?: MatNavList | MatList;\n private _destroyed = new Subject<void>();\n\n @ContentChildren(MatLine, {descendants: true}) _lines: QueryList<MatLine>;\n @ContentChild(MatListAvatarCssMatStyler, {static: false}) _avatar: MatListAvatarCssMatStyler;\n @ContentChild(MatListIconCssMatStyler, {static: false}) _icon: MatListIconCssMatStyler;\n\n constructor(private _element: ElementRef<HTMLElement>,\n _changeDetectorRef: ChangeDetectorRef,\n @Optional() navList?: MatNavList,\n @Optional() list?: MatList) {\n super();\n this._isInteractiveList = !!(navList || (list && list._getListType() === 'action-list'));\n this._list = navList || list;\n\n // If no type attributed is specified for <button>, set it to \"button\".\n // If a type attribute is already specified, do nothing.\n const element = this._getHostElement();\n\n if (element.nodeName.toLowerCase() === 'button' && !element.hasAttribute('type')) {\n element.setAttribute('type', 'button');\n }\n\n if (this._list) {\n // React to changes in the state of the parent list since\n // some of the item's properties depend on it (e.g. `disableRipple`).\n this._list._stateChanges.pipe(takeUntil(this._destroyed)).subscribe(() => {\n _changeDetectorRef.markForCheck();\n });\n }\n }\n\n ngAfterContentInit() {\n setLines(this._lines, this._element);\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** Whether this list item should show a ripple effect when clicked. */\n _isRippleDisabled() {\n return !this._isInteractiveList || this.disableRipple ||\n !!(this._list && this._list.disableRipple);\n }\n\n /** Retrieves the DOM element of the component host. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor, FocusableOption, FocusOrigin} from '@angular/cdk/a11y';\nimport {ENTER, SPACE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Host,\n Input,\n OnDestroy,\n ViewEncapsulation,\n Optional,\n Inject,\n} from '@angular/core';\nimport {merge, Subscription, EMPTY} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {matExpansionAnimations} from './expansion-animations';\nimport {\n MatExpansionPanel,\n MatExpansionPanelDefaultOptions,\n MAT_EXPANSION_PANEL_DEFAULT_OPTIONS,\n} from './expansion-panel';\nimport {MatAccordionTogglePosition} from './accordion-base';\n\n\n/**\n * `<mat-expansion-panel-header>`\n *\n * This component corresponds to the header element of an `<mat-expansion-panel>`.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-expansion-panel-header',\n styleUrls: ['./expansion-panel-header.css'],\n templateUrl: './expansion-panel-header.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n matExpansionAnimations.indicatorRotate,\n matExpansionAnimations.expansionHeaderHeight\n ],\n host: {\n 'class': 'mat-expansion-panel-header',\n 'role': 'button',\n '[attr.id]': 'panel._headerId',\n '[attr.tabindex]': 'disabled ? -1 : 0',\n '[attr.aria-controls]': '_getPanelId()',\n '[attr.aria-expanded]': '_isExpanded()',\n '[attr.aria-disabled]': 'panel.disabled',\n '[class.mat-expanded]': '_isExpanded()',\n '[class.mat-expansion-toggle-indicator-after]': `_getTogglePosition() === 'after'`,\n '[class.mat-expansion-toggle-indicator-before]': `_getTogglePosition() === 'before'`,\n '(click)': '_toggle()',\n '(keydown)': '_keydown($event)',\n '[@.disabled]': '_animationsDisabled',\n '(@expansionHeight.start)': '_animationStarted()',\n '[@expansionHeight]': `{\n value: _getExpandedState(),\n params: {\n collapsedHeight: collapsedHeight,\n expandedHeight: expandedHeight\n }\n }`,\n },\n})\nexport class MatExpansionPanelHeader implements OnDestroy, FocusableOption {\n private _parentChangeSubscription = Subscription.EMPTY;\n\n /** Whether Angular animations in the panel header should be disabled. */\n _animationsDisabled = true;\n\n constructor(\n @Host() public panel: MatExpansionPanel,\n private _element: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_EXPANSION_PANEL_DEFAULT_OPTIONS) @Optional()\n defaultOptions?: MatExpansionPanelDefaultOptions) {\n const accordionHideToggleChange = panel.accordion ?\n panel.accordion._stateChanges.pipe(\n filter(changes => !!(changes['hideToggle'] || changes['togglePosition']))) :\n EMPTY;\n\n // Since the toggle state depends on an @Input on the panel, we\n // need to subscribe and trigger change detection manually.\n this._parentChangeSubscription =\n merge(\n panel.opened, panel.closed, accordionHideToggleChange,\n panel._inputChanges.pipe(filter(\n changes => {\n return !!(\n changes['hideToggle'] ||\n changes['disabled'] ||\n changes['togglePosition']);\n })))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n\n // Avoids focus being lost if the panel contained the focused element and was closed.\n panel.closed\n .pipe(filter(() => panel._containsFocus()))\n .subscribe(() => _focusMonitor.focusVia(_element, 'program'));\n\n _focusMonitor.monitor(_element).subscribe(origin => {\n if (origin && panel.accordion) {\n panel.accordion._handleHeaderFocus(this);\n }\n });\n\n if (defaultOptions) {\n this.expandedHeight = defaultOptions.expandedHeight;\n this.collapsedHeight = defaultOptions.collapsedHeight;\n }\n }\n\n _animationStarted() {\n // Currently the `expansionHeight` animation has a `void => collapsed` transition which is\n // there to work around a bug in Angular (see #13088), however this introduces a different\n // issue. The new transition will cause the header to animate in on init (see #16067), if the\n // consumer has set a header height that is different from the default one. We work around it\n // by disabling animations on the header and re-enabling them after the first animation has run.\n // Note that Angular dispatches animation events even if animations are disabled. Ideally this\n // wouldn't be necessary if we remove the `void => collapsed` transition, but we have to wait\n // for https://github.com/angular/angular/issues/18847 to be resolved.\n this._animationsDisabled = false;\n }\n\n /** Height of the header while the panel is expanded. */\n @Input() expandedHeight: string;\n\n /** Height of the header while the panel is collapsed. */\n @Input() collapsedHeight: string;\n\n /**\n * Whether the associated panel is disabled. Implemented as a part of `FocusableOption`.\n * @docs-private\n */\n get disabled() {\n return this.panel.disabled;\n }\n\n /** Toggles the expanded state of the panel. */\n _toggle(): void {\n this.panel.toggle();\n }\n\n /** Gets whether the panel is expanded. */\n _isExpanded(): boolean {\n return this.panel.expanded;\n }\n\n /** Gets the expanded state string of the panel. */\n _getExpandedState(): string {\n return this.panel._getExpandedState();\n }\n\n /** Gets the panel id. */\n _getPanelId(): string {\n return this.panel.id;\n }\n\n /** Gets the toggle position for the header. */\n _getTogglePosition(): MatAccordionTogglePosition {\n return this.panel.togglePosition;\n }\n\n /** Gets whether the expand indicator should be shown. */\n _showToggle(): boolean {\n return !this.panel.hideToggle && !this.panel.disabled;\n }\n\n /** Handle keydown event calling to toggle() if appropriate. */\n _keydown(event: KeyboardEvent) {\n switch (event.keyCode) {\n // Toggle for space and enter keys.\n case SPACE:\n case ENTER:\n if (!hasModifierKey(event)) {\n event.preventDefault();\n this._toggle();\n }\n\n break;\n default:\n if (this.panel.accordion) {\n this.panel.accordion._handleHeaderKeydown(event);\n }\n\n return;\n }\n }\n\n /**\n * Focuses the panel header. Implemented as a part of `FocusableOption`.\n * @param origin Origin of the action that triggered the focus.\n * @docs-private\n */\n focus(origin: FocusOrigin = 'program') {\n this._focusMonitor.focusVia(this._element, origin);\n }\n\n ngOnDestroy() {\n this._parentChangeSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this._element);\n }\n}\n\n/**\n * `<mat-panel-description>`\n *\n * This directive is to be used inside of the MatExpansionPanelHeader component.\n */\n@Directive({\n selector: 'mat-panel-description',\n host: {\n class: 'mat-expansion-panel-header-description'\n }\n})\nexport class MatExpansionPanelDescription {}\n\n/**\n * `<mat-panel-title>`\n *\n * This directive is to be used inside of the MatExpansionPanelHeader component.\n */\n@Directive({\n selector: 'mat-panel-title',\n host: {\n class: 'mat-expansion-panel-header-title'\n }\n})\nexport class MatExpansionPanelTitle {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, Input, ContentChildren, QueryList, AfterContentInit} from '@angular/core';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {CdkAccordion} from '@angular/cdk/accordion';\nimport {FocusKeyManager} from '@angular/cdk/a11y';\nimport {HOME, END, hasModifierKey} from '@angular/cdk/keycodes';\nimport {\n MAT_ACCORDION,\n MatAccordionBase,\n MatAccordionDisplayMode,\n MatAccordionTogglePosition\n} from './accordion-base';\nimport {MatExpansionPanelHeader} from './expansion-panel-header';\n\n/**\n * Directive for a Material Design Accordion.\n */\n@Directive({\n selector: 'mat-accordion',\n exportAs: 'matAccordion',\n inputs: ['multi'],\n providers: [{\n provide: MAT_ACCORDION,\n useExisting: MatAccordion\n }],\n host: {\n class: 'mat-accordion'\n }\n})\nexport class MatAccordion extends CdkAccordion implements MatAccordionBase, AfterContentInit {\n private _keyManager: FocusKeyManager<MatExpansionPanelHeader>;\n\n @ContentChildren(MatExpansionPanelHeader, {descendants: true})\n _headers: QueryList<MatExpansionPanelHeader>;\n\n /** Whether the expansion indicator should be hidden. */\n @Input()\n get hideToggle(): boolean { return this._hideToggle; }\n set hideToggle(show: boolean) { this._hideToggle = coerceBooleanProperty(show); }\n private _hideToggle: boolean = false;\n\n /**\n * Display mode used for all expansion panels in the accordion. Currently two display\n * modes exist:\n * default - a gutter-like spacing is placed around any expanded panel, placing the expanded\n * panel at a different elevation from the rest of the accordion.\n * flat - no spacing is placed around expanded panels, showing all panels at the same\n * elevation.\n */\n @Input() displayMode: MatAccordionDisplayMode = 'default';\n\n /** The position of the expansion indicator. */\n @Input() togglePosition: MatAccordionTogglePosition = 'after';\n\n ngAfterContentInit() {\n this._keyManager = new FocusKeyManager(this._headers).withWrap();\n }\n\n /** Handles keyboard events coming in from the panel headers. */\n _handleHeaderKeydown(event: KeyboardEvent) {\n const {keyCode} = event;\n const manager = this._keyManager;\n\n if (keyCode === HOME) {\n if (!hasModifierKey(event)) {\n manager.setFirstItemActive();\n event.preventDefault();\n }\n } else if (keyCode === END) {\n if (!hasModifierKey(event)) {\n manager.setLastItemActive();\n event.preventDefault();\n }\n } else {\n this._keyManager.onKeydown(event);\n }\n }\n\n _handleHeaderFocus(header: MatExpansionPanelHeader) {\n this._keyManager.updateActiveItem(header);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkAccordionModule} from '@angular/cdk/accordion';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatAccordion} from './accordion';\nimport {MatExpansionPanel, MatExpansionPanelActionRow} from './expansion-panel';\nimport {MatExpansionPanelContent} from './expansion-panel-content';\nimport {\n MatExpansionPanelDescription,\n MatExpansionPanelHeader,\n MatExpansionPanelTitle,\n} from './expansion-panel-header';\n\n\n@NgModule({\n imports: [CommonModule, CdkAccordionModule, PortalModule],\n exports: [\n MatAccordion,\n MatExpansionPanel,\n MatExpansionPanelActionRow,\n MatExpansionPanelHeader,\n MatExpansionPanelTitle,\n MatExpansionPanelDescription,\n MatExpansionPanelContent,\n ],\n declarations: [\n MatAccordion,\n MatExpansionPanel,\n MatExpansionPanelActionRow,\n MatExpansionPanelHeader,\n MatExpansionPanelTitle,\n MatExpansionPanelDescription,\n MatExpansionPanelContent,\n ],\n})\nexport class MatExpansionModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/**\n * Injection token used to provide a grid list to a tile and to avoid circular imports.\n * @docs-private\n */\nexport const MAT_GRID_LIST = new InjectionToken<MatGridListBase>('MAT_GRID_LIST');\n\n/**\n * Base interface for a `MatGridList`.\n * @docs-private\n */\nexport interface MatGridListBase {\n cols: number;\n gutterSize: string;\n rowHeight: number | string;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ViewEncapsulation,\n ElementRef,\n Input,\n Optional,\n ContentChildren,\n QueryList,\n AfterContentInit,\n Directive,\n ChangeDetectionStrategy,\n Inject,\n} from '@angular/core';\nimport {MatLine, setLines} from '@angular/material/core';\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {MAT_GRID_LIST, MatGridListBase} from './grid-list-base';\n\n@Component({\n moduleId: module.id,\n selector: 'mat-grid-tile',\n exportAs: 'matGridTile',\n host: {\n 'class': 'mat-grid-tile',\n },\n templateUrl: 'grid-tile.html',\n styleUrls: ['grid-list.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatGridTile {\n _rowspan: number = 1;\n _colspan: number = 1;\n\n constructor(\n private _element: ElementRef<HTMLElement>,\n @Optional() @Inject(MAT_GRID_LIST) public _gridList?: MatGridListBase) {}\n\n /** Amount of rows that the grid tile takes up. */\n @Input()\n get rowspan(): number { return this._rowspan; }\n set rowspan(value: number) { this._rowspan = Math.round(coerceNumberProperty(value)); }\n\n /** Amount of columns that the grid tile takes up. */\n @Input()\n get colspan(): number { return this._colspan; }\n set colspan(value: number) { this._colspan = Math.round(coerceNumberProperty(value)); }\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 _setStyle(property: string, value: any): void {\n (this._element.nativeElement.style as any)[property] = value;\n }\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-grid-tile-header, mat-grid-tile-footer',\n templateUrl: 'grid-tile-text.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatGridTileText implements AfterContentInit {\n @ContentChildren(MatLine) _lines: QueryList<MatLine>;\n\n constructor(private _element: ElementRef<HTMLElement>) {}\n\n ngAfterContentInit() {\n setLines(this._lines, this._element);\n }\n}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: '[mat-grid-avatar], [matGridAvatar]',\n host: {'class': 'mat-grid-avatar'}\n})\nexport class MatGridAvatarCssMatStyler {}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: 'mat-grid-tile-header',\n host: {'class': 'mat-grid-tile-header'}\n})\nexport class MatGridTileHeaderCssMatStyler {}\n\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\n@Directive({\n selector: 'mat-grid-tile-footer',\n host: {'class': 'mat-grid-tile-footer'}\n})\nexport class MatGridTileFooterCssMatStyler {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {MatGridTile} from './grid-tile';\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 */\nexport class TileCoordinator {\n /** Tracking array (see class description). */\n tracker: number[];\n\n /** Index at which the search for the next gap will start. */\n columnIndex: number = 0;\n\n /** The current row index. */\n rowIndex: number = 0;\n\n /** Gets the total number of rows occupied by tiles */\n get rowCount(): number { return this.rowIndex + 1; }\n\n /**\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 */\n get rowspan() {\n const lastRowMax = Math.max(...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\n /** The computed (row, col) position of each tile (the output). */\n positions: TilePosition[];\n\n /**\n * Updates the tile positions.\n * @param numColumns Amount of columns in the grid.\n */\n update(numColumns: number, tiles: MatGridTile[]) {\n this.columnIndex = 0;\n this.rowIndex = 0;\n\n this.tracker = new Array(numColumns);\n this.tracker.fill(0, 0, this.tracker.length);\n this.positions = tiles.map(tile => this._trackTile(tile));\n }\n\n /** Calculates the row and col position of a tile. */\n private _trackTile(tile: MatGridTile): TilePosition {\n // Find a gap large enough for this tile.\n const gapStartIndex = this._findMatchingGap(tile.colspan);\n\n // Place tile in the resulting gap.\n this._markTilePosition(gapStartIndex, tile);\n\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\n return new TilePosition(this.rowIndex, gapStartIndex);\n }\n\n /** Finds the next available space large enough to fit the tile. */\n private _findMatchingGap(tileCols: number): number {\n if (tileCols > this.tracker.length) {\n throw Error(`mat-grid-list: tile with colspan ${tileCols} is wider than ` +\n `grid with cols=\"${this.tracker.length}\".`);\n }\n\n // Start index is inclusive, end index is exclusive.\n let gapStartIndex = -1;\n let gapEndIndex = -1;\n\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 gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n continue;\n }\n\n gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n\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 gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n continue;\n }\n\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n\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\n // Continue iterating until we find a gap wide enough for this tile. Since gapEndIndex is\n // exclusive, gapEndIndex is 0 means we didn't find a gap and should continue.\n } while ((gapEndIndex - gapStartIndex < tileCols) || (gapEndIndex == 0));\n\n // If we still didn't manage to find a gap, ensure that the index is\n // at least zero so the tile doesn't get pulled out of the grid.\n return Math.max(gapStartIndex, 0);\n }\n\n /** Move \"down\" to the next row. */\n private _nextRow(): void {\n this.columnIndex = 0;\n this.rowIndex++;\n\n // Decrement all spaces by one to reflect moving down one row.\n for (let i = 0; i < this.tracker.length; i++) {\n this.tracker[i] = Math.max(0, this.tracker[i] - 1);\n }\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 private _findGapEndIndex(gapStartIndex: number): number {\n for (let i = gapStartIndex + 1; i < this.tracker.length; i++) {\n if (this.tracker[i] != 0) {\n return i;\n }\n }\n\n // The gap ends with the end of the row.\n return this.tracker.length;\n }\n\n /** Update the tile tracker to account for the given tile in the given space. */\n private _markTilePosition(start: number, tile: MatGridTile): void {\n for (let i = 0; i < tile.colspan; i++) {\n this.tracker[start + i] = tile.rowspan;\n }\n }\n}\n\n/**\n * Simple data structure for tile position (row, col).\n * @docs-private\n */\nexport class TilePosition {\n constructor(public row: number, public col: number) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {MatGridList} from './grid-list';\nimport {MatGridTile} from './grid-tile';\nimport {TileCoordinator} from './tile-coordinator';\n\n/**\n * RegExp that can be used to check whether a value will\n * be allowed inside a CSS `calc()` expression.\n */\nconst cssCalcAllowedValue = /^-?\\d+((\\.\\d+)?[A-Za-z%$]?)+$/;\n\n/**\n * Sets the style properties for an individual tile, given the position calculated by the\n * Tile Coordinator.\n * @docs-private\n */\nexport abstract class TileStyler {\n _gutterSize: string;\n _rows: number = 0;\n _rowspan: number = 0;\n _cols: number;\n _direction: string;\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 init(gutterSize: string, tracker: TileCoordinator, cols: number, direction: string): void {\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 /**\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 getBaseTileSize(sizePercent: number, gutterFraction: number): string {\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\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 getTilePosition(baseSize: string, offset: number): string {\n // The position comes the size of a 1x1 tile plus gutter for each previous tile in the\n // row/column (offset).\n return offset === 0 ? '0' : calc(`(${baseSize} + ${this._gutterSize}) * ${offset}`);\n }\n\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 getTileSize(baseSize: string, span: number): string {\n return `(${baseSize} * ${span}) + (${span - 1} * ${this._gutterSize})`;\n }\n\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 setStyle(tile: MatGridTile, rowIndex: number, colIndex: number): void {\n // Percent of the available horizontal space that one column takes up.\n let percentWidthPerTile = 100 / this._cols;\n\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 let gutterWidthFractionPerTile = (this._cols - 1) / this._cols;\n\n this.setColStyles(tile, colIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n this.setRowStyles(tile, rowIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n }\n\n /** Sets the horizontal placement of the tile in the list. */\n setColStyles(tile: MatGridTile, colIndex: number, percentWidth: number,\n gutterWidth: number) {\n // Base horizontal size of a column.\n let baseTileWidth = this.getBaseTileSize(percentWidth, gutterWidth);\n\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 let side = this._direction === 'rtl' ? 'right' : 'left';\n tile._setStyle(side, this.getTilePosition(baseTileWidth, colIndex));\n tile._setStyle('width', calc(this.getTileSize(baseTileWidth, tile.colspan)));\n }\n\n /**\n * Calculates the total size taken up by gutters across one axis of a list.\n */\n getGutterSpan(): string {\n return `${this._gutterSize} * (${this._rowspan} - 1)`;\n }\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 getTileSpan(tileHeight: string): string {\n return `${this._rowspan} * ${this.getTileSize(tileHeight, 1)}`;\n }\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 abstract setRowStyles(tile: MatGridTile, rowIndex: number, percentWidth: number,\n gutterWidth: number): void;\n\n /**\n * Calculates the computed height and returns the correct style property to set.\n * This method can be implemented by each type of TileStyler.\n * @docs-private\n */\n getComputedHeight(): [string, string] | null { return null; }\n\n /**\n * Called when the tile styler is swapped out with a different one. To be used for cleanup.\n * @param list Grid list that the styler was attached to.\n * @docs-private\n */\n abstract reset(list: MatGridList): void;\n}\n\n\n/**\n * This type of styler is instantiated when the user passes in a fixed row height.\n * Example `<mat-grid-list cols=\"3\" rowHeight=\"100px\">`\n * @docs-private\n */\nexport class FixedTileStyler extends TileStyler {\n\n constructor(public fixedRowHeight: string) { super(); }\n\n init(gutterSize: string, tracker: TileCoordinator, cols: number, direction: string) {\n super.init(gutterSize, tracker, cols, direction);\n this.fixedRowHeight = normalizeUnits(this.fixedRowHeight);\n\n if (!cssCalcAllowedValue.test(this.fixedRowHeight)) {\n throw Error(`Invalid value \"${this.fixedRowHeight}\" set as rowHeight.`);\n }\n }\n\n setRowStyles(tile: MatGridTile, rowIndex: number): void {\n tile._setStyle('top', this.getTilePosition(this.fixedRowHeight, rowIndex));\n tile._setStyle('height', calc(this.getTileSize(this.fixedRowHeight, tile.rowspan)));\n }\n\n getComputedHeight(): [string, string] {\n return [\n 'height', calc(`${this.getTileSpan(this.fixedRowHeight)} + ${this.getGutterSpan()}`)\n ];\n }\n\n reset(list: MatGridList) {\n list._setListStyle(['height', null]);\n\n if (list._tiles) {\n list._tiles.forEach(tile => {\n tile._setStyle('top', null);\n tile._setStyle('height', null);\n });\n }\n }\n}\n\n\n/**\n * This type of styler is instantiated when the user passes in a width:height ratio\n * for the row height. Example `<mat-grid-list cols=\"3\" rowHeight=\"3:1\">`\n * @docs-private\n */\nexport class RatioTileStyler extends TileStyler {\n\n /** Ratio width:height given by user to determine row height. */\n rowHeightRatio: number;\n baseTileHeight: string;\n\n constructor(value: string) {\n super();\n this._parseRatio(value);\n }\n\n setRowStyles(tile: MatGridTile, rowIndex: number, percentWidth: number,\n gutterWidth: number): void {\n let percentHeightPerTile = percentWidth / this.rowHeightRatio;\n this.baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterWidth);\n\n // Use padding-top and margin-top 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\n getComputedHeight(): [string, string] {\n return [\n 'paddingBottom', calc(`${this.getTileSpan(this.baseTileHeight)} + ${this.getGutterSpan()}`)\n ];\n }\n\n reset(list: MatGridList) {\n list._setListStyle(['paddingBottom', null]);\n\n list._tiles.forEach(tile => {\n tile._setStyle('marginTop', null);\n tile._setStyle('paddingTop', null);\n });\n }\n\n private _parseRatio(value: string): void {\n const ratioParts = value.split(':');\n\n if (ratioParts.length !== 2) {\n throw Error(`mat-grid-list: invalid ratio given for row-height: \"${value}\"`);\n }\n\n this.rowHeightRatio = parseFloat(ratioParts[0]) / parseFloat(ratioParts[1]);\n }\n}\n\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 `<mat-grid-list cols=\"3\" rowHeight=\"fit\">`\n *\n * @docs-private\n */\nexport class FitTileStyler extends TileStyler {\n setRowStyles(tile: MatGridTile, rowIndex: number): void {\n // Percent of the available vertical space that one row takes up.\n let percentHeightPerTile = 100 / this._rowspan;\n\n // Fraction of the horizontal gutter size that each column takes up.\n let gutterHeightPerTile = (this._rows - 1) / this._rows;\n\n // Base vertical size of a column.\n let baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterHeightPerTile);\n\n tile._setStyle('top', this.getTilePosition(baseTileHeight, rowIndex));\n tile._setStyle('height', calc(this.getTileSize(baseTileHeight, tile.rowspan)));\n }\n\n reset(list: MatGridList) {\n if (list._tiles) {\n list._tiles.forEach(tile => {\n tile._setStyle('top', null);\n tile._setStyle('height', null);\n });\n }\n }\n}\n\n\n/** Wraps a CSS string in a calc function */\nfunction calc(exp: string): string {\n return `calc(${exp})`;\n}\n\n\n/** Appends pixels to a CSS string if no units are given. */\nfunction normalizeUnits(value: string): string {\n return value.match(/([A-Za-z%]+)$/) ? value : `${value}px`;\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ViewEncapsulation,\n AfterContentChecked,\n OnInit,\n Input,\n ContentChildren,\n QueryList,\n ElementRef,\n Optional,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {MatGridTile} from './grid-tile';\nimport {TileCoordinator} from './tile-coordinator';\nimport {TileStyler, FitTileStyler, RatioTileStyler, FixedTileStyler} from './tile-styler';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {MAT_GRID_LIST, MatGridListBase} from './grid-list-base';\n\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.\n\nconst MAT_FIT_MODE = 'fit';\n\n@Component({\n moduleId: module.id,\n selector: 'mat-grid-list',\n exportAs: 'matGridList',\n templateUrl: 'grid-list.html',\n styleUrls: ['grid-list.css'],\n host: {\n 'class': 'mat-grid-list',\n },\n providers: [{\n provide: MAT_GRID_LIST,\n useExisting: MatGridList\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatGridList implements MatGridListBase, OnInit, AfterContentChecked {\n /** Number of columns being rendered. */\n private _cols: number;\n\n /** Used for determiningthe position of each tile in the grid. */\n private _tileCoordinator: TileCoordinator;\n\n /**\n * Row height value passed in by user. This can be one of three types:\n * - Number value (ex: \"100px\"): sets a fixed row height to that value\n * - Ratio value (ex: \"4:3\"): sets the row height based on width:height ratio\n * - \"Fit\" mode (ex: \"fit\"): sets the row height to total height divided by number of rows\n */\n private _rowHeight: string;\n\n /** The amount of space between tiles. This will be something like '5px' or '2em'. */\n private _gutter: string = '1px';\n\n /** Sets position and size styles for a tile */\n private _tileStyler: TileStyler;\n\n /** Query list of tiles that are being rendered. */\n @ContentChildren(MatGridTile, {descendants: true}) _tiles: QueryList<MatGridTile>;\n\n constructor(private _element: ElementRef<HTMLElement>,\n @Optional() private _dir: Directionality) {}\n\n /** Amount of columns in the grid list. */\n @Input()\n get cols(): number { return this._cols; }\n set cols(value: number) {\n this._cols = Math.max(1, Math.round(coerceNumberProperty(value)));\n }\n\n /** Size of the grid list's gutter in pixels. */\n @Input()\n get gutterSize(): string { return this._gutter; }\n set gutterSize(value: string) { this._gutter = `${value == null ? '' : value}`; }\n\n /** Set internal representation of row height from the user-provided value. */\n @Input()\n get rowHeight(): string | number { return this._rowHeight; }\n set rowHeight(value: string | number) {\n const newValue = `${value == null ? '' : value}`;\n\n if (newValue !== this._rowHeight) {\n this._rowHeight = newValue;\n this._setTileStyler(this._rowHeight);\n }\n }\n\n ngOnInit() {\n this._checkCols();\n this._checkRowHeight();\n }\n\n /**\n * The layout calculation is fairly cheap if nothing changes, so there's little cost\n * to run it frequently.\n */\n ngAfterContentChecked() {\n this._layoutTiles();\n }\n\n /** Throw a friendly error if cols property is missing */\n private _checkCols() {\n if (!this.cols) {\n throw Error(`mat-grid-list: must pass in number of columns. ` +\n `Example: <mat-grid-list cols=\"3\">`);\n }\n }\n\n /** Default to equal width:height if rowHeight property is missing */\n private _checkRowHeight(): void {\n if (!this._rowHeight) {\n this._setTileStyler('1:1');\n }\n }\n\n /** Creates correct Tile Styler subtype based on rowHeight passed in by user */\n private _setTileStyler(rowHeight: string): void {\n if (this._tileStyler) {\n this._tileStyler.reset(this);\n }\n\n if (rowHeight === MAT_FIT_MODE) {\n this._tileStyler = new FitTileStyler();\n } else if (rowHeight && rowHeight.indexOf(':') > -1) {\n this._tileStyler = new RatioTileStyler(rowHeight);\n } else {\n this._tileStyler = new FixedTileStyler(rowHeight);\n }\n }\n\n /** Computes and applies the size and position for all children grid tiles. */\n private _layoutTiles(): void {\n if (!this._tileCoordinator) {\n this._tileCoordinator = new TileCoordinator();\n }\n\n\n const tracker = this._tileCoordinator;\n const tiles = this._tiles.filter(tile => !tile._gridList || tile._gridList === this);\n const direction = this._dir ? this._dir.value : 'ltr';\n\n this._tileCoordinator.update(this.cols, tiles);\n this._tileStyler.init(this.gutterSize, tracker, this.cols, direction);\n\n tiles.forEach((tile, index) => {\n const pos = tracker.positions[index];\n this._tileStyler.setStyle(tile, pos.row, pos.col);\n });\n\n this._setListStyle(this._tileStyler.getComputedHeight());\n }\n\n /** Sets style on the main grid-list element, given the style name and value. */\n _setListStyle(style: [string, string | null] | null): void {\n if (style) {\n (this._element.nativeElement.style as any)[style[0]] = style[1];\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatLineModule, MatCommonModule} from '@angular/material/core';\nimport {\n MatGridTile, MatGridTileText, MatGridTileFooterCssMatStyler,\n MatGridTileHeaderCssMatStyler, MatGridAvatarCssMatStyler\n} from './grid-tile';\nimport {MatGridList} from './grid-list';\n\n\n@NgModule({\n imports: [MatLineModule, MatCommonModule],\n exports: [\n MatGridList,\n MatGridTile,\n MatGridTileText,\n MatLineModule,\n MatCommonModule,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler\n ],\n declarations: [\n MatGridList,\n MatGridTile,\n MatGridTileText,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler\n ],\n})\nexport class MatGridListModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {HttpClient, HttpErrorResponse} from '@angular/common/http';\nimport {\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n SecurityContext,\n SkipSelf,\n OnDestroy,\n} from '@angular/core';\nimport {DomSanitizer, SafeResourceUrl, SafeHtml} from '@angular/platform-browser';\nimport {forkJoin, Observable, of as observableOf, throwError as observableThrow} from 'rxjs';\nimport {catchError, finalize, map, share, tap} from 'rxjs/operators';\n\n\n/**\n * Returns an exception to be thrown in the case when attempting to\n * load an icon with a name that cannot be found.\n * @docs-private\n */\nexport function getMatIconNameNotFoundError(iconName: string): Error {\n return Error(`Unable to find icon with the name \"${iconName}\"`);\n}\n\n\n/**\n * Returns an exception to be thrown when the consumer attempts to use\n * `<mat-icon>` without including @angular/common/http.\n * @docs-private\n */\nexport function getMatIconNoHttpProviderError(): Error {\n return Error('Could not find HttpClient provider for use with Angular Material icons. ' +\n 'Please include the HttpClientModule from @angular/common/http in your ' +\n 'app imports.');\n}\n\n\n/**\n * Returns an exception to be thrown when a URL couldn't be sanitized.\n * @param url URL that was attempted to be sanitized.\n * @docs-private\n */\nexport function getMatIconFailedToSanitizeUrlError(url: SafeResourceUrl): Error {\n return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL ` +\n `via Angular's DomSanitizer. Attempted URL was \"${url}\".`);\n}\n\n/**\n * Returns an exception to be thrown when a HTML string couldn't be sanitized.\n * @param literal HTML that was attempted to be sanitized.\n * @docs-private\n */\nexport function getMatIconFailedToSanitizeLiteralError(literal: SafeHtml): Error {\n return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by ` +\n `Angular's DomSanitizer. Attempted literal was \"${literal}\".`);\n}\n\n\n/**\n * Configuration for an icon, including the URL and possibly the cached SVG element.\n * @docs-private\n */\nclass SvgIconConfig {\n url: SafeResourceUrl | null;\n svgElement: SVGElement | null;\n\n constructor(url: SafeResourceUrl);\n constructor(svgElement: SVGElement);\n constructor(data: SafeResourceUrl | SVGElement) {\n // Note that we can't use `instanceof SVGElement` here,\n // because it'll break during server-side rendering.\n if (!!(data as any).nodeName) {\n this.svgElement = data as SVGElement;\n } else {\n this.url = data as SafeResourceUrl;\n }\n }\n}\n\n/**\n * Service to register and display icons used by the `<mat-icon>` component.\n * - Registers icon URLs by namespace and name.\n * - Registers icon set URLs by namespace.\n * - Registers aliases for CSS classes, for use with icon fonts.\n * - Loads icons from URLs and extracts individual icons from icon sets.\n */\n@Injectable({providedIn: 'root'})\nexport class MatIconRegistry implements OnDestroy {\n private _document: Document;\n\n /**\n * URLs and cached SVG elements for individual icons. Keys are of the format \"[namespace]:[icon]\".\n */\n private _svgIconConfigs = new Map<string, SvgIconConfig>();\n\n /**\n * SvgIconConfig objects and cached SVG elements for icon sets, keyed by namespace.\n * Multiple icon sets can be registered under the same namespace.\n */\n private _iconSetConfigs = new Map<string, SvgIconConfig[]>();\n\n /** Cache for icons loaded by direct URLs. */\n private _cachedIconsByUrl = new Map<string, SVGElement>();\n\n /** In-progress icon fetches. Used to coalesce multiple requests to the same URL. */\n private _inProgressUrlFetches = new Map<string, Observable<string>>();\n\n /** Map from font identifiers to their CSS class names. Used for icon fonts. */\n private _fontCssClassesByAlias = new Map<string, string>();\n\n /**\n * The CSS class to apply when an `<mat-icon>` component has no icon name, url, or font specified.\n * The default 'material-icons' value assumes that the material icon font has been loaded as\n * described at http://google.github.io/material-design-icons/#icon-font-for-the-web\n */\n private _defaultFontSetClass = 'material-icons';\n\n constructor(\n @Optional() private _httpClient: HttpClient,\n private _sanitizer: DomSanitizer,\n @Optional() @Inject(DOCUMENT) document: any) {\n this._document = document;\n }\n\n /**\n * Registers an icon by URL in the default namespace.\n * @param iconName Name under which the icon should be registered.\n * @param url\n */\n addSvgIcon(iconName: string, url: SafeResourceUrl): this {\n return this.addSvgIconInNamespace('', iconName, url);\n }\n\n /**\n * Registers an icon using an HTML string in the default namespace.\n * @param iconName Name under which the icon should be registered.\n * @param literal SVG source of the icon.\n */\n addSvgIconLiteral(iconName: string, literal: SafeHtml): this {\n return this.addSvgIconLiteralInNamespace('', iconName, literal);\n }\n\n /**\n * Registers an icon by URL in the specified namespace.\n * @param namespace Namespace in which the icon should be registered.\n * @param iconName Name under which the icon should be registered.\n * @param url\n */\n addSvgIconInNamespace(namespace: string, iconName: string, url: SafeResourceUrl): this {\n return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig(url));\n }\n\n /**\n * Registers an icon using an HTML string in the specified namespace.\n * @param namespace Namespace in which the icon should be registered.\n * @param iconName Name under which the icon should be registered.\n * @param literal SVG source of the icon.\n */\n addSvgIconLiteralInNamespace(namespace: string, iconName: string, literal: SafeHtml): this {\n const sanitizedLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);\n\n if (!sanitizedLiteral) {\n throw getMatIconFailedToSanitizeLiteralError(literal);\n }\n\n const svgElement = this._createSvgElementForSingleIcon(sanitizedLiteral);\n return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig(svgElement));\n }\n\n /**\n * Registers an icon set by URL in the default namespace.\n * @param url\n */\n addSvgIconSet(url: SafeResourceUrl): this {\n return this.addSvgIconSetInNamespace('', url);\n }\n\n /**\n * Registers an icon set using an HTML string in the default namespace.\n * @param literal SVG source of the icon set.\n */\n addSvgIconSetLiteral(literal: SafeHtml): this {\n return this.addSvgIconSetLiteralInNamespace('', literal);\n }\n\n /**\n * Registers an icon set by URL in the specified namespace.\n * @param namespace Namespace in which to register the icon set.\n * @param url\n */\n addSvgIconSetInNamespace(namespace: string, url: SafeResourceUrl): this {\n return this._addSvgIconSetConfig(namespace, new SvgIconConfig(url));\n }\n\n /**\n * Registers an icon set using an HTML string in the specified namespace.\n * @param namespace Namespace in which to register the icon set.\n * @param literal SVG source of the icon set.\n */\n addSvgIconSetLiteralInNamespace(namespace: string, literal: SafeHtml): this {\n const sanitizedLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);\n\n if (!sanitizedLiteral) {\n throw getMatIconFailedToSanitizeLiteralError(literal);\n }\n\n const svgElement = this._svgElementFromString(sanitizedLiteral);\n return this._addSvgIconSetConfig(namespace, new SvgIconConfig(svgElement));\n }\n\n /**\n * Defines an alias for a CSS class name to be used for icon fonts. Creating an matIcon\n * component with the alias as the fontSet input will cause the class name to be applied\n * to the `<mat-icon>` element.\n *\n * @param alias Alias for the font.\n * @param className Class name override to be used instead of the alias.\n */\n registerFontClassAlias(alias: string, className: string = alias): this {\n this._fontCssClassesByAlias.set(alias, className);\n return this;\n }\n\n /**\n * Returns the CSS class name associated with the alias by a previous call to\n * registerFontClassAlias. If no CSS class has been associated, returns the alias unmodified.\n */\n classNameForFontAlias(alias: string): string {\n return this._fontCssClassesByAlias.get(alias) || alias;\n }\n\n /**\n * Sets the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n * have a fontSet input value, and is not loading an icon by name or URL.\n *\n * @param className\n */\n setDefaultFontSetClass(className: string): this {\n this._defaultFontSetClass = className;\n return this;\n }\n\n /**\n * Returns the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n * have a fontSet input value, and is not loading an icon by name or URL.\n */\n getDefaultFontSetClass(): string {\n return this._defaultFontSetClass;\n }\n\n /**\n * Returns an Observable that produces the icon (as an `<svg>` DOM element) from the given URL.\n * The response from the URL may be cached so this will not always cause an HTTP request, but\n * the produced element will always be a new copy of the originally fetched icon. (That is,\n * it will not contain any modifications made to elements previously returned).\n *\n * @param safeUrl URL from which to fetch the SVG icon.\n */\n getSvgIconFromUrl(safeUrl: SafeResourceUrl): Observable<SVGElement> {\n const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);\n\n if (!url) {\n throw getMatIconFailedToSanitizeUrlError(safeUrl);\n }\n\n const cachedIcon = this._cachedIconsByUrl.get(url);\n\n if (cachedIcon) {\n return observableOf(cloneSvg(cachedIcon));\n }\n\n return this._loadSvgIconFromConfig(new SvgIconConfig(safeUrl)).pipe(\n tap(svg => this._cachedIconsByUrl.set(url!, svg)),\n map(svg => cloneSvg(svg)),\n );\n }\n\n /**\n * Returns an Observable that produces the icon (as an `<svg>` DOM element) with the given name\n * and namespace. The icon must have been previously registered with addIcon or addIconSet;\n * if not, the Observable will throw an error.\n *\n * @param name Name of the icon to be retrieved.\n * @param namespace Namespace in which to look for the icon.\n */\n getNamedSvgIcon(name: string, namespace: string = ''): Observable<SVGElement> {\n // Return (copy of) cached icon if possible.\n const key = iconKey(namespace, name);\n const config = this._svgIconConfigs.get(key);\n\n if (config) {\n return this._getSvgFromConfig(config);\n }\n\n // See if we have any icon sets registered for the namespace.\n const iconSetConfigs = this._iconSetConfigs.get(namespace);\n\n if (iconSetConfigs) {\n return this._getSvgFromIconSetConfigs(name, iconSetConfigs);\n }\n\n return observableThrow(getMatIconNameNotFoundError(key));\n }\n\n ngOnDestroy() {\n this._svgIconConfigs.clear();\n this._iconSetConfigs.clear();\n this._cachedIconsByUrl.clear();\n }\n\n /**\n * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.\n */\n private _getSvgFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n if (config.svgElement) {\n // We already have the SVG element for this icon, return a copy.\n return observableOf(cloneSvg(config.svgElement));\n } else {\n // Fetch the icon from the config's URL, cache it, and return a copy.\n return this._loadSvgIconFromConfig(config).pipe(\n tap(svg => config.svgElement = svg),\n map(svg => cloneSvg(svg)),\n );\n }\n }\n\n /**\n * Attempts to find an icon with the specified name in any of the SVG icon sets.\n * First searches the available cached icons for a nested element with a matching name, and\n * if found copies the element to a new `<svg>` element. If not found, fetches all icon sets\n * that have not been cached, and searches again after all fetches are completed.\n * The returned Observable produces the SVG element if possible, and throws\n * an error if no icon with the specified name can be found.\n */\n private _getSvgFromIconSetConfigs(name: string, iconSetConfigs: SvgIconConfig[]):\n Observable<SVGElement> {\n // For all the icon set SVG elements we've fetched, see if any contain an icon with the\n // requested name.\n const namedIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n\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 observableOf(namedIcon);\n }\n\n // Not found in any cached icon sets. If there are icon sets with URLs that we haven't\n // fetched, fetch them now and look for iconName in the results.\n const iconSetFetchRequests: Observable<SVGElement | null>[] = iconSetConfigs\n .filter(iconSetConfig => !iconSetConfig.svgElement)\n .map(iconSetConfig => {\n return this._loadSvgIconSetFromConfig(iconSetConfig).pipe(\n catchError((err: HttpErrorResponse): Observable<SVGElement | null> => {\n const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, iconSetConfig.url);\n\n // Swallow errors fetching individual URLs so the\n // combined Observable won't necessarily fail.\n console.error(`Loading icon set URL: ${url} failed: ${err.message}`);\n return observableOf(null);\n })\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 forkJoin(iconSetFetchRequests).pipe(map(() => {\n const foundIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n\n if (!foundIcon) {\n throw getMatIconNameNotFoundError(name);\n }\n\n return foundIcon;\n }));\n }\n\n /**\n * Searches the cached SVG elements for the given icon sets for a nested icon element whose \"id\"\n * tag matches the specified name. If found, copies the nested element to a new SVG element and\n * returns it. Returns null if no matching element is found.\n */\n private _extractIconWithNameFromAnySet(iconName: string, iconSetConfigs: SvgIconConfig[]):\n SVGElement | null {\n // Iterate backwards, so icon sets added later have precedence.\n for (let i = iconSetConfigs.length - 1; i >= 0; i--) {\n const config = iconSetConfigs[i];\n if (config.svgElement) {\n const foundIcon = this._extractSvgIconFromSet(config.svgElement, iconName);\n if (foundIcon) {\n return foundIcon;\n }\n }\n }\n return null;\n }\n\n /**\n * Loads the content of the icon URL specified in the SvgIconConfig and creates an SVG element\n * from it.\n */\n private _loadSvgIconFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n return this._fetchUrl(config.url)\n .pipe(map(svgText => this._createSvgElementForSingleIcon(svgText)));\n }\n\n /**\n * Loads the content of the icon set URL specified in the SvgIconConfig and creates an SVG element\n * from it.\n */\n private _loadSvgIconSetFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n // If the SVG for this icon set has already been parsed, do nothing.\n if (config.svgElement) {\n return observableOf(config.svgElement);\n }\n\n return this._fetchUrl(config.url).pipe(map(svgText => {\n // It is possible that the icon set was parsed and cached by an earlier request, so parsing\n // only needs to occur if the cache is yet unset.\n if (!config.svgElement) {\n config.svgElement = this._svgElementFromString(svgText);\n }\n\n return config.svgElement;\n }));\n }\n\n /**\n * Creates a DOM element from the given SVG string, and adds default attributes.\n */\n private _createSvgElementForSingleIcon(responseText: string): SVGElement {\n const svg = this._svgElementFromString(responseText);\n this._setSvgAttributes(svg);\n return svg;\n }\n\n /**\n * Searches the cached element of the given SvgIconConfig for a nested icon element whose \"id\"\n * tag matches the specified name. If found, copies the nested element to a new SVG element and\n * returns it. Returns null if no matching element is found.\n */\n private _extractSvgIconFromSet(iconSet: SVGElement, iconName: string): SVGElement | null {\n // Use the `id=\"iconName\"` syntax in order to escape special\n // characters in the ID (versus using the #iconName syntax).\n const iconSource = iconSet.querySelector(`[id=\"${iconName}\"]`);\n\n if (!iconSource) {\n return null;\n }\n\n // Clone the element and remove the ID to prevent multiple elements from being added\n // to the page with the same ID.\n const iconElement = iconSource.cloneNode(true) as Element;\n iconElement.removeAttribute('id');\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 (iconElement.nodeName.toLowerCase() === 'svg') {\n return this._setSvgAttributes(iconElement as SVGElement);\n }\n\n // If the node is a <symbol>, it won't be rendered so we have to convert it into <svg>. Note\n // that the same could be achieved by referring to it via <use href=\"#id\">, however the <use>\n // tag is problematic on Firefox, because it needs to include the current page path.\n if (iconElement.nodeName.toLowerCase() === 'symbol') {\n return this._setSvgAttributes(this._toSvgElement(iconElement));\n }\n\n // createElement('SVG') doesn't work as expected; the DOM ends up with\n // the correct nodes, but the SVG content doesn't render. Instead we\n // have to create an empty SVG node using innerHTML and append its content.\n // Elements created using DOMParser.parseFromString have the same problem.\n // http://stackoverflow.com/questions/23003278/svg-innerhtml-in-firefox-can-not-display\n const svg = this._svgElementFromString('<svg></svg>');\n // Clone the node so we don't remove it from the parent icon set element.\n svg.appendChild(iconElement);\n\n return this._setSvgAttributes(svg);\n }\n\n /**\n * Creates a DOM element from the given SVG string.\n */\n private _svgElementFromString(str: string): SVGElement {\n const div = this._document.createElement('DIV');\n div.innerHTML = str;\n const svg = div.querySelector('svg') as SVGElement;\n\n if (!svg) {\n throw Error('<svg> tag not found');\n }\n\n return svg;\n }\n\n /**\n * Converts an element into an SVG node by cloning all of its children.\n */\n private _toSvgElement(element: Element): SVGElement {\n let svg = this._svgElementFromString('<svg></svg>');\n\n for (let i = 0; i < element.childNodes.length; i++) {\n if (element.childNodes[i].nodeType === this._document.ELEMENT_NODE) {\n svg.appendChild(element.childNodes[i].cloneNode(true));\n }\n }\n\n return svg;\n }\n\n /**\n * Sets the default attributes for an SVG element to be used as an icon.\n */\n private _setSvgAttributes(svg: SVGElement): SVGElement {\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 /**\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 private _fetchUrl(safeUrl: SafeResourceUrl | null): Observable<string> {\n if (!this._httpClient) {\n throw getMatIconNoHttpProviderError();\n }\n\n if (safeUrl == null) {\n throw Error(`Cannot fetch icon from URL \"${safeUrl}\".`);\n }\n\n const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);\n\n if (!url) {\n throw getMatIconFailedToSanitizeUrlError(safeUrl);\n }\n\n // Store in-progress fetches to avoid sending a duplicate request for a URL when there is\n // already a request in progress for that URL. It's necessary to call share() on the\n // Observable returned by http.get() so that multiple subscribers don't cause multiple XHRs.\n const inProgressFetch = this._inProgressUrlFetches.get(url);\n\n if (inProgressFetch) {\n return inProgressFetch;\n }\n\n // TODO(jelbourn): for some reason, the `finalize` operator \"loses\" the generic type on the\n // Observable. Figure out why and fix it.\n const req = this._httpClient.get(url, {responseType: 'text'}).pipe(\n finalize(() => this._inProgressUrlFetches.delete(url)),\n share(),\n );\n\n this._inProgressUrlFetches.set(url, req);\n return req;\n }\n\n /**\n * Registers an icon config by name in the specified namespace.\n * @param namespace Namespace in which to register the icon config.\n * @param iconName Name under which to register the config.\n * @param config Config to be registered.\n */\n private _addSvgIconConfig(namespace: string, iconName: string, config: SvgIconConfig): this {\n this._svgIconConfigs.set(iconKey(namespace, iconName), config);\n return this;\n }\n\n /**\n * Registers an icon set config in the specified namespace.\n * @param namespace Namespace in which to register the icon config.\n * @param config Config to be registered.\n */\n private _addSvgIconSetConfig(namespace: string, config: SvgIconConfig): this {\n const configNamespace = this._iconSetConfigs.get(namespace);\n\n if (configNamespace) {\n configNamespace.push(config);\n } else {\n this._iconSetConfigs.set(namespace, [config]);\n }\n\n return this;\n }\n}\n\n/** @docs-private */\nexport function ICON_REGISTRY_PROVIDER_FACTORY(\n parentRegistry: MatIconRegistry,\n httpClient: HttpClient,\n sanitizer: DomSanitizer,\n document?: any) {\n return parentRegistry || new MatIconRegistry(httpClient, sanitizer, document);\n}\n\n/** @docs-private */\nexport const ICON_REGISTRY_PROVIDER = {\n // If there is already an MatIconRegistry available, use that. Otherwise, provide a new one.\n provide: MatIconRegistry,\n deps: [\n [new Optional(), new SkipSelf(), MatIconRegistry],\n [new Optional(), HttpClient],\n DomSanitizer,\n [new Optional(), DOCUMENT as InjectionToken<any>],\n ],\n useFactory: ICON_REGISTRY_PROVIDER_FACTORY,\n};\n\n/** Clones an SVGElement while preserving type information. */\nfunction cloneSvg(svg: SVGElement): SVGElement {\n return svg.cloneNode(true) as SVGElement;\n}\n\n/** Returns the cache key to use for an icon namespace and name. */\nfunction iconKey(namespace: string, name: string) {\n return namespace + ':' + name;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {take} from 'rxjs/operators';\nimport {\n Attribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n ViewEncapsulation,\n Optional,\n InjectionToken,\n inject,\n Inject,\n OnDestroy,\n AfterViewChecked,\n} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {CanColor, CanColorCtor, mixinColor} from '@angular/material/core';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatIconRegistry} from './icon-registry';\n\n\n// Boilerplate for applying mixins to MatIcon.\n/** @docs-private */\nclass MatIconBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatIconMixinBase: CanColorCtor & typeof MatIconBase = mixinColor(MatIconBase);\n\n/**\n * Injection token used to provide the current location to `MatIcon`.\n * Used to handle server-side rendering and to stub out during unit tests.\n * @docs-private\n */\nexport const MAT_ICON_LOCATION = new InjectionToken<MatIconLocation>('mat-icon-location', {\n providedIn: 'root',\n factory: MAT_ICON_LOCATION_FACTORY\n});\n\n/**\n * Stubbed out location for `MatIcon`.\n * @docs-private\n */\nexport interface MatIconLocation {\n getPathname: () => string;\n}\n\n/** @docs-private */\nexport function MAT_ICON_LOCATION_FACTORY(): MatIconLocation {\n const _document = inject(DOCUMENT);\n const _location = _document ? _document.location : null;\n\n return {\n // Note that this needs to be a function, rather than a property, because Angular\n // will only resolve it once, but we want the current path on each call.\n getPathname: () => _location ? (_location.pathname + _location.search) : ''\n };\n}\n\n\n/** SVG attributes that accept a FuncIRI (e.g. `url(<something>)`). */\nconst funcIriAttributes = [\n 'clip-path',\n 'color-profile',\n 'src',\n 'cursor',\n 'fill',\n 'filter',\n 'marker',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'mask',\n 'stroke'\n];\n\n/** Selector that can be used to find all elements that are using a `FuncIRI`. */\nconst funcIriAttributeSelector = funcIriAttributes.map(attr => `[${attr}]`).join(', ');\n\n/** Regex that can be used to extract the id out of a FuncIRI. */\nconst funcIriPattern = /^url\\(['\"]?#(.*?)['\"]?\\)$/;\n\n/**\n * Component to display an icon. It can be used in the following ways:\n *\n * - Specify the svgIcon input to load an SVG icon from a URL previously registered with the\n * addSvgIcon, addSvgIconInNamespace, addSvgIconSet, or addSvgIconSetInNamespace methods of\n * MatIconRegistry. If the svgIcon value contains a colon it is assumed to be in the format\n * \"[namespace]:[name]\", if not the value will be the name of an icon in the default namespace.\n * Examples:\n * `<mat-icon svgIcon=\"left-arrow\"></mat-icon>\n * <mat-icon svgIcon=\"animals:cat\"></mat-icon>`\n *\n * - Use a font ligature as an icon by putting the ligature text in the content of the `<mat-icon>`\n * component. By default the Material icons font is used as described at\n * http://google.github.io/material-design-icons/#icon-font-for-the-web. You can specify an\n * alternate font by setting the fontSet input to either the CSS class to apply to use the\n * desired font, or to an alias previously registered with MatIconRegistry.registerFontClassAlias.\n * Examples:\n * `<mat-icon>home</mat-icon>\n * <mat-icon fontSet=\"myfont\">sun</mat-icon>`\n *\n * - Specify a font glyph to be included via CSS rules by setting the fontSet input to specify the\n * font, and the fontIcon input to specify the icon. Typically the fontIcon will specify a\n * CSS class which causes the glyph to be displayed via a :before selector, as in\n * https://fortawesome.github.io/Font-Awesome/examples/\n * Example:\n * `<mat-icon fontSet=\"fa\" fontIcon=\"alarm\"></mat-icon>`\n */\n@Component({\n moduleId: module.id,\n template: '<ng-content></ng-content>',\n selector: 'mat-icon',\n exportAs: 'matIcon',\n styleUrls: ['icon.css'],\n inputs: ['color'],\n host: {\n 'role': 'img',\n 'class': 'mat-icon notranslate',\n '[class.mat-icon-inline]': 'inline',\n '[class.mat-icon-no-color]': 'color !== \"primary\" && color !== \"accent\" && color !== \"warn\"',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatIcon extends _MatIconMixinBase implements OnChanges, OnInit, AfterViewChecked,\n CanColor, OnDestroy {\n\n /**\n * Whether the icon should be inlined, automatically sizing the icon to match the font size of\n * the element the icon is contained in.\n */\n @Input()\n get inline(): boolean {\n return this._inline;\n }\n set inline(inline: boolean) {\n this._inline = coerceBooleanProperty(inline);\n }\n private _inline: boolean = false;\n\n /** Name of the icon in the SVG icon set. */\n @Input() svgIcon: string;\n\n /** Font set that the icon is a part of. */\n @Input()\n get fontSet(): string { return this._fontSet; }\n set fontSet(value: string) {\n this._fontSet = this._cleanupFontValue(value);\n }\n private _fontSet: string;\n\n /** Name of an icon within a font set. */\n @Input()\n get fontIcon(): string { return this._fontIcon; }\n set fontIcon(value: string) {\n this._fontIcon = this._cleanupFontValue(value);\n }\n private _fontIcon: string;\n\n private _previousFontSetClass: string;\n private _previousFontIconClass: string;\n\n /** Keeps track of the current page path. */\n private _previousPath?: string;\n\n /** Keeps track of the elements and attributes that we've prefixed with the current path. */\n private _elementsWithExternalReferences?: Map<Element, {name: string, value: string}[]>;\n\n constructor(\n elementRef: ElementRef<HTMLElement>,\n private _iconRegistry: MatIconRegistry,\n @Attribute('aria-hidden') ariaHidden: string,\n /**\n * @deprecated `location` parameter to be made required.\n * @breaking-change 8.0.0\n */\n @Optional() @Inject(MAT_ICON_LOCATION) private _location?: MatIconLocation) {\n super(elementRef);\n\n // If the user has not explicitly set aria-hidden, mark the icon as hidden, as this is\n // the right thing to do for the majority of icon use-cases.\n if (!ariaHidden) {\n elementRef.nativeElement.setAttribute('aria-hidden', 'true');\n }\n }\n\n /**\n * Splits an svgIcon binding value into its icon set and icon name components.\n * Returns a 2-element array of [(icon set), (icon name)].\n * The separator for the two fields is ':'. If there is no separator, an empty\n * string is returned for the icon set and the entire value is returned for\n * the icon name. If the argument is falsy, returns an array of two empty strings.\n * Throws an error if the name contains two or more ':' separators.\n * Examples:\n * `'social:cake' -> ['social', 'cake']\n * 'penguin' -> ['', 'penguin']\n * null -> ['', '']\n * 'a:b:c' -> (throws Error)`\n */\n private _splitIconName(iconName: string): [string, string] {\n if (!iconName) {\n return ['', ''];\n }\n const parts = iconName.split(':');\n switch (parts.length) {\n case 1: return ['', parts[0]]; // Use default namespace.\n case 2: return <[string, string]>parts;\n default: throw Error(`Invalid icon name: \"${iconName}\"`);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Only update the inline SVG icon if the inputs changed, to avoid unnecessary DOM operations.\n const svgIconChanges = changes['svgIcon'];\n\n if (svgIconChanges) {\n if (this.svgIcon) {\n const [namespace, iconName] = this._splitIconName(this.svgIcon);\n\n this._iconRegistry.getNamedSvgIcon(iconName, namespace).pipe(take(1)).subscribe(\n svg => this._setSvgElement(svg),\n (err: Error) => console.log(`Error retrieving icon: ${err.message}`)\n );\n } else if (svgIconChanges.previousValue) {\n this._clearSvgElement();\n }\n }\n\n if (this._usingFontIcon()) {\n this._updateFontIconClasses();\n }\n }\n\n ngOnInit() {\n // Update font classes because ngOnChanges won't be called if none of the inputs are present,\n // e.g. <mat-icon>arrow</mat-icon> In this case we need to add a CSS class for the default font.\n if (this._usingFontIcon()) {\n this._updateFontIconClasses();\n }\n }\n\n ngAfterViewChecked() {\n const cachedElements = this._elementsWithExternalReferences;\n\n if (cachedElements && this._location && cachedElements.size) {\n const newPath = this._location.getPathname();\n\n // We need to check whether the URL has changed on each change detection since\n // the browser doesn't have an API that will let us react on link clicks and\n // we can't depend on the Angular router. The references need to be updated,\n // because while most browsers don't care whether the URL is correct after\n // the first render, Safari will break if the user navigates to a different\n // page and the SVG isn't re-rendered.\n if (newPath !== this._previousPath) {\n this._previousPath = newPath;\n this._prependPathToReferences(newPath);\n }\n }\n }\n\n ngOnDestroy() {\n if (this._elementsWithExternalReferences) {\n this._elementsWithExternalReferences.clear();\n }\n }\n\n private _usingFontIcon(): boolean {\n return !this.svgIcon;\n }\n\n private _setSvgElement(svg: SVGElement) {\n this._clearSvgElement();\n\n // Workaround for IE11 and Edge ignoring `style` tags inside dynamically-created SVGs.\n // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10898469/\n // Do this before inserting the element into the DOM, in order to avoid a style recalculation.\n const styleTags = svg.querySelectorAll('style') as NodeListOf<HTMLStyleElement>;\n\n for (let i = 0; i < styleTags.length; i++) {\n styleTags[i].textContent += ' ';\n }\n\n // Note: we do this fix here, rather than the icon registry, because the\n // references have to point to the URL at the time that the icon was created.\n if (this._location) {\n const path = this._location.getPathname();\n this._previousPath = path;\n this._cacheChildrenWithExternalReferences(svg);\n this._prependPathToReferences(path);\n }\n\n this._elementRef.nativeElement.appendChild(svg);\n }\n\n private _clearSvgElement() {\n const layoutElement: HTMLElement = this._elementRef.nativeElement;\n let childCount = layoutElement.childNodes.length;\n\n if (this._elementsWithExternalReferences) {\n this._elementsWithExternalReferences.clear();\n }\n\n // Remove existing non-element child nodes and SVGs, and add the new SVG element. Note that\n // we can't use innerHTML, because IE will throw if the element has a data binding.\n while (childCount--) {\n const child = layoutElement.childNodes[childCount];\n\n // 1 corresponds to Node.ELEMENT_NODE. We remove all non-element nodes in order to get rid\n // of any loose text nodes, as well as any SVG elements in order to remove any old icons.\n if (child.nodeType !== 1 || child.nodeName.toLowerCase() === 'svg') {\n layoutElement.removeChild(child);\n }\n }\n }\n\n private _updateFontIconClasses() {\n if (!this._usingFontIcon()) {\n return;\n }\n\n const elem: HTMLElement = this._elementRef.nativeElement;\n const fontSetClass = this.fontSet ?\n this._iconRegistry.classNameForFontAlias(this.fontSet) :\n this._iconRegistry.getDefaultFontSetClass();\n\n if (fontSetClass != this._previousFontSetClass) {\n if (this._previousFontSetClass) {\n elem.classList.remove(this._previousFontSetClass);\n }\n if (fontSetClass) {\n elem.classList.add(fontSetClass);\n }\n this._previousFontSetClass = fontSetClass;\n }\n\n if (this.fontIcon != this._previousFontIconClass) {\n if (this._previousFontIconClass) {\n elem.classList.remove(this._previousFontIconClass);\n }\n if (this.fontIcon) {\n elem.classList.add(this.fontIcon);\n }\n this._previousFontIconClass = this.fontIcon;\n }\n }\n\n /**\n * Cleans up a value to be used as a fontIcon or fontSet.\n * Since the value ends up being assigned as a CSS class, we\n * have to trim the value and omit space-separated values.\n */\n private _cleanupFontValue(value: string) {\n return typeof value === 'string' ? value.trim().split(' ')[0] : value;\n }\n\n /**\n * Prepends the current path to all elements that have an attribute pointing to a `FuncIRI`\n * reference. This is required because WebKit browsers require references to be prefixed with\n * the current path, if the page has a `base` tag.\n */\n private _prependPathToReferences(path: string) {\n const elements = this._elementsWithExternalReferences;\n\n if (elements) {\n elements.forEach((attrs, element) => {\n attrs.forEach(attr => {\n element.setAttribute(attr.name, `url('${path}#${attr.value}')`);\n });\n });\n }\n }\n\n /**\n * Caches the children of an SVG element that have `url()`\n * references that we need to prefix with the current path.\n */\n private _cacheChildrenWithExternalReferences(element: SVGElement) {\n const elementsWithFuncIri = element.querySelectorAll(funcIriAttributeSelector);\n const elements = this._elementsWithExternalReferences =\n this._elementsWithExternalReferences || new Map();\n\n for (let i = 0; i < elementsWithFuncIri.length; i++) {\n funcIriAttributes.forEach(attr => {\n const elementWithReference = elementsWithFuncIri[i];\n const value = elementWithReference.getAttribute(attr);\n const match = value ? value.match(funcIriPattern) : null;\n\n if (match) {\n let attributes = elements.get(elementWithReference);\n\n if (!attributes) {\n attributes = [];\n elements.set(elementWithReference, attributes);\n }\n\n attributes!.push({name: attr, value: match[1]});\n }\n });\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatIcon} from './icon';\n\n\n@NgModule({\n imports: [MatCommonModule],\n exports: [MatIcon, MatCommonModule],\n declarations: [MatIcon],\n})\nexport class MatIconModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ComponentPortal, ComponentType, Portal} from '@angular/cdk/portal';\nimport {\n AfterContentInit,\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n Optional,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {DateAdapter, MAT_DATE_FORMATS, MatDateFormats} from '@angular/material/core';\nimport {Subject, Subscription} from 'rxjs';\nimport {MatCalendarCellCssClasses} from './calendar-body';\nimport {createMissingDateImplError} from './datepicker-errors';\nimport {MatDatepickerIntl} from './datepicker-intl';\nimport {MatMonthView} from './month-view';\nimport {\n getActiveOffset,\n isSameMultiYearView,\n MatMultiYearView,\n yearsPerPage\n} from './multi-year-view';\nimport {MatYearView} from './year-view';\n\n/**\n * Possible views for the calendar.\n * @docs-private\n */\nexport type MatCalendarView = 'month' | 'year' | 'multi-year';\n\n/** Default header for MatCalendar */\n@Component({\n moduleId: module.id,\n selector: 'mat-calendar-header',\n templateUrl: 'calendar-header.html',\n exportAs: 'matCalendarHeader',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatCalendarHeader<D> {\n constructor(private _intl: MatDatepickerIntl,\n @Inject(forwardRef(() => MatCalendar)) public calendar: MatCalendar<D>,\n @Optional() private _dateAdapter: DateAdapter<D>,\n @Optional() @Inject(MAT_DATE_FORMATS) private _dateFormats: MatDateFormats,\n changeDetectorRef: ChangeDetectorRef) {\n\n this.calendar.stateChanges.subscribe(() => changeDetectorRef.markForCheck());\n }\n\n /** The label for the current calendar view. */\n get periodButtonText(): string {\n if (this.calendar.currentView == 'month') {\n return this._dateAdapter\n .format(this.calendar.activeDate, this._dateFormats.display.monthYearLabel)\n .toLocaleUpperCase();\n }\n if (this.calendar.currentView == 'year') {\n return this._dateAdapter.getYearName(this.calendar.activeDate);\n }\n\n // The offset from the active year to the \"slot\" for the starting year is the\n // *actual* first rendered year in the multi-year view, and the last year is\n // just yearsPerPage - 1 away.\n const activeYear = this._dateAdapter.getYear(this.calendar.activeDate);\n const minYearOfPage = activeYear - getActiveOffset(\n this._dateAdapter, this.calendar.activeDate, this.calendar.minDate, this.calendar.maxDate);\n const maxYearOfPage = minYearOfPage + yearsPerPage - 1;\n return `${minYearOfPage} \\u2013 ${maxYearOfPage}`;\n }\n\n get periodButtonLabel(): string {\n return this.calendar.currentView == 'month' ?\n this._intl.switchToMultiYearViewLabel : this._intl.switchToMonthViewLabel;\n }\n\n /** The label for the previous button. */\n get prevButtonLabel(): string {\n return {\n 'month': this._intl.prevMonthLabel,\n 'year': this._intl.prevYearLabel,\n 'multi-year': this._intl.prevMultiYearLabel\n }[this.calendar.currentView];\n }\n\n /** The label for the next button. */\n get nextButtonLabel(): string {\n return {\n 'month': this._intl.nextMonthLabel,\n 'year': this._intl.nextYearLabel,\n 'multi-year': this._intl.nextMultiYearLabel\n }[this.calendar.currentView];\n }\n\n /** Handles user clicks on the period label. */\n currentPeriodClicked(): void {\n this.calendar.currentView = this.calendar.currentView == 'month' ? 'multi-year' : 'month';\n }\n\n /** Handles user clicks on the previous button. */\n previousClicked(): void {\n this.calendar.activeDate = this.calendar.currentView == 'month' ?\n this._dateAdapter.addCalendarMonths(this.calendar.activeDate, -1) :\n this._dateAdapter.addCalendarYears(\n this.calendar.activeDate, this.calendar.currentView == 'year' ? -1 : -yearsPerPage\n );\n }\n\n /** Handles user clicks on the next button. */\n nextClicked(): void {\n this.calendar.activeDate = this.calendar.currentView == 'month' ?\n this._dateAdapter.addCalendarMonths(this.calendar.activeDate, 1) :\n this._dateAdapter.addCalendarYears(\n this.calendar.activeDate,\n this.calendar.currentView == 'year' ? 1 : yearsPerPage\n );\n }\n\n /** Whether the previous period button is enabled. */\n previousEnabled(): boolean {\n if (!this.calendar.minDate) {\n return true;\n }\n return !this.calendar.minDate ||\n !this._isSameView(this.calendar.activeDate, this.calendar.minDate);\n }\n\n /** Whether the next period button is enabled. */\n nextEnabled(): boolean {\n return !this.calendar.maxDate ||\n !this._isSameView(this.calendar.activeDate, this.calendar.maxDate);\n }\n\n /** Whether the two dates represent the same view in the current view mode (month or year). */\n private _isSameView(date1: D, date2: D): boolean {\n if (this.calendar.currentView == 'month') {\n return this._dateAdapter.getYear(date1) == this._dateAdapter.getYear(date2) &&\n this._dateAdapter.getMonth(date1) == this._dateAdapter.getMonth(date2);\n }\n if (this.calendar.currentView == 'year') {\n return this._dateAdapter.getYear(date1) == this._dateAdapter.getYear(date2);\n }\n // Otherwise we are in 'multi-year' view.\n return isSameMultiYearView(\n this._dateAdapter, date1, date2, this.calendar.minDate, this.calendar.maxDate);\n }\n}\n\n/**\n * A calendar that is used as part of the datepicker.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-calendar',\n templateUrl: 'calendar.html',\n styleUrls: ['calendar.css'],\n host: {\n 'class': 'mat-calendar',\n },\n exportAs: 'matCalendar',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatCalendar<D> implements AfterContentInit, AfterViewChecked, OnDestroy, OnChanges {\n /** An input indicating the type of the header component, if set. */\n @Input() headerComponent: ComponentType<any>;\n\n /** A portal containing the header component type for this calendar. */\n _calendarHeaderPortal: Portal<any>;\n\n private _intlChanges: Subscription;\n\n /**\n * Used for scheduling that focus should be moved to the active cell on the next tick.\n * We need to schedule it, rather than do it immediately, because we have to wait\n * for Angular to re-evaluate the view children.\n */\n private _moveFocusOnNextTick = false;\n\n /** A date representing the period (month or year) to start the calendar in. */\n @Input()\n get startAt(): D | null { return this._startAt; }\n set startAt(value: D | null) {\n this._startAt = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _startAt: D | null;\n\n /** Whether the calendar should be started in month or year view. */\n @Input() startView: MatCalendarView = 'month';\n\n /** The currently selected date. */\n @Input()\n get selected(): D | null { return this._selected; }\n set selected(value: D | null) {\n this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _selected: D | null;\n\n /** The minimum selectable date. */\n @Input()\n get minDate(): D | null { return this._minDate; }\n set minDate(value: D | null) {\n this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _minDate: D | null;\n\n /** The maximum selectable date. */\n @Input()\n get maxDate(): D | null { return this._maxDate; }\n set maxDate(value: D | null) {\n this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _maxDate: D | null;\n\n /** Function used to filter which dates are selectable. */\n @Input() dateFilter: (date: D) => boolean;\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => MatCalendarCellCssClasses;\n\n /** Emits when the currently selected date changes. */\n @Output() readonly selectedChange: EventEmitter<D> = new EventEmitter<D>();\n\n /**\n * Emits the year chosen in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /**\n * Emits the month chosen in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /** Emits when any date is selected. */\n @Output() readonly _userSelection: EventEmitter<void> = new EventEmitter<void>();\n\n /** Reference to the current month view component. */\n @ViewChild(MatMonthView, {static: false}) monthView: MatMonthView<D>;\n\n /** Reference to the current year view component. */\n @ViewChild(MatYearView, {static: false}) yearView: MatYearView<D>;\n\n /** Reference to the current multi-year view component. */\n @ViewChild(MatMultiYearView, {static: false}) multiYearView: MatMultiYearView<D>;\n\n /**\n * The current active date. This determines which time period is shown and which date is\n * highlighted when using keyboard navigation.\n */\n get activeDate(): D { return this._clampedActiveDate; }\n set activeDate(value: D) {\n this._clampedActiveDate = this._dateAdapter.clampDate(value, this.minDate, this.maxDate);\n this.stateChanges.next();\n this._changeDetectorRef.markForCheck();\n }\n private _clampedActiveDate: D;\n\n /** Whether the calendar is in month view. */\n get currentView(): MatCalendarView { return this._currentView; }\n set currentView(value: MatCalendarView) {\n this._currentView = value;\n this._moveFocusOnNextTick = true;\n this._changeDetectorRef.markForCheck();\n }\n private _currentView: MatCalendarView;\n\n /**\n * Emits whenever there is a state change that the header may need to respond to.\n */\n stateChanges = new Subject<void>();\n\n constructor(_intl: MatDatepickerIntl,\n @Optional() private _dateAdapter: DateAdapter<D>,\n @Optional() @Inject(MAT_DATE_FORMATS) private _dateFormats: MatDateFormats,\n private _changeDetectorRef: ChangeDetectorRef) {\n\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n\n this._intlChanges = _intl.changes.subscribe(() => {\n _changeDetectorRef.markForCheck();\n this.stateChanges.next();\n });\n }\n\n ngAfterContentInit() {\n this._calendarHeaderPortal = new ComponentPortal(this.headerComponent || MatCalendarHeader);\n this.activeDate = this.startAt || this._dateAdapter.today();\n\n // Assign to the private property since we don't want to move focus on init.\n this._currentView = this.startView;\n }\n\n ngAfterViewChecked() {\n if (this._moveFocusOnNextTick) {\n this._moveFocusOnNextTick = false;\n this.focusActiveCell();\n }\n }\n\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n this.stateChanges.complete();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const change =\n changes['minDate'] || changes['maxDate'] || changes['dateFilter'];\n\n if (change && !change.firstChange) {\n const view = this._getCurrentViewComponent();\n\n if (view) {\n // We need to `detectChanges` manually here, because the `minDate`, `maxDate` etc. are\n // passed down to the view via data bindings which won't be up-to-date when we call `_init`.\n this._changeDetectorRef.detectChanges();\n view._init();\n }\n }\n\n this.stateChanges.next();\n }\n\n focusActiveCell() {\n this._getCurrentViewComponent()._focusActiveCell();\n }\n\n /** Updates today's date after an update of the active date */\n updateTodaysDate() {\n let view = this.currentView == 'month' ? this.monthView :\n (this.currentView == 'year' ? this.yearView : this.multiYearView);\n\n view.ngAfterContentInit();\n }\n\n /** Handles date selection in the month view. */\n _dateSelected(date: D): void {\n if (!this._dateAdapter.sameDate(date, this.selected)) {\n this.selectedChange.emit(date);\n }\n }\n\n /** Handles year selection in the multiyear view. */\n _yearSelectedInMultiYearView(normalizedYear: D) {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Handles month selection in the year view. */\n _monthSelectedInYearView(normalizedMonth: D) {\n this.monthSelected.emit(normalizedMonth);\n }\n\n _userSelected(): void {\n this._userSelection.emit();\n }\n\n /** Handles year/month selection in the multi-year/year views. */\n _goToDateInView(date: D, view: 'month' | 'year' | 'multi-year'): void {\n this.activeDate = date;\n this.currentView = view;\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n\n /** Returns the component instance that corresponds to the current calendar view. */\n private _getCurrentViewComponent() {\n return this.monthView || this.yearView || this.multiYearView;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material datepicker.\n * @docs-private\n */\nexport const matDatepickerAnimations: {\n readonly transformPanel: AnimationTriggerMetadata;\n readonly fadeInCalendar: AnimationTriggerMetadata;\n} = {\n /** Transforms the height of the datepicker's calendar. */\n transformPanel: trigger('transformPanel', [\n state('void', style({\n opacity: 0,\n transform: 'scale(1, 0.8)'\n })),\n transition('void => enter', animate('120ms cubic-bezier(0, 0, 0.2, 1)', style({\n opacity: 1,\n transform: 'scale(1, 1)'\n }))),\n transition('* => void', animate('100ms linear', style({opacity: 0})))\n ]),\n\n /** Fades in the content of the calendar. */\n fadeInCalendar: trigger('fadeInCalendar', [\n state('void', style({opacity: 0})),\n state('enter', style({opacity: 1})),\n\n // TODO(crisbeto): this animation should be removed since it isn't quite on spec, but we\n // need to keep it until #12440 gets in, otherwise the exit animation will look glitchy.\n transition('void => *', animate('120ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)'))\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {ESCAPE, UP_ARROW} from '@angular/cdk/keycodes';\nimport {\n Overlay,\n OverlayConfig,\n OverlayRef,\n PositionStrategy,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport {ComponentPortal, ComponentType} from '@angular/cdk/portal';\nimport {DOCUMENT} from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanColor,\n CanColorCtor,\n DateAdapter,\n mixinColor,\n ThemePalette,\n} from '@angular/material/core';\nimport {MatDialog, MatDialogRef} from '@angular/material/dialog';\nimport {merge, Subject, Subscription} from 'rxjs';\nimport {filter, take} from 'rxjs/operators';\nimport {MatCalendar} from './calendar';\nimport {matDatepickerAnimations} from './datepicker-animations';\nimport {createMissingDateImplError} from './datepicker-errors';\nimport {MatDatepickerInput} from './datepicker-input';\nimport {MatCalendarCellCssClasses} from './calendar-body';\n\n/** Used to generate a unique ID for each datepicker instance. */\nlet datepickerUid = 0;\n\n/** Injection token that determines the scroll handling while the calendar is open. */\nexport const MAT_DATEPICKER_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-datepicker-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n};\n\n// Boilerplate for applying mixins to MatDatepickerContent.\n/** @docs-private */\nclass MatDatepickerContentBase {\n constructor(public _elementRef: ElementRef) { }\n}\nconst _MatDatepickerContentMixinBase: CanColorCtor & typeof MatDatepickerContentBase =\n mixinColor(MatDatepickerContentBase);\n\n/**\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\n * MatCalendar directly as the content so we can control the initial focus. This also gives us a\n * place to put additional features of the popup that are not part of the calendar itself in the\n * future. (e.g. confirmation buttons).\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-datepicker-content',\n templateUrl: 'datepicker-content.html',\n styleUrls: ['datepicker-content.css'],\n host: {\n 'class': 'mat-datepicker-content',\n '[@transformPanel]': '\"enter\"',\n '[class.mat-datepicker-content-touch]': 'datepicker.touchUi',\n },\n animations: [\n matDatepickerAnimations.transformPanel,\n matDatepickerAnimations.fadeInCalendar,\n ],\n exportAs: 'matDatepickerContent',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['color'],\n})\nexport class MatDatepickerContent<D> extends _MatDatepickerContentMixinBase\n implements AfterViewInit, CanColor {\n\n /** Reference to the internal calendar component. */\n @ViewChild(MatCalendar, {static: false}) _calendar: MatCalendar<D>;\n\n /** Reference to the datepicker that created the overlay. */\n datepicker: MatDatepicker<D>;\n\n /** Whether the datepicker is above or below the input. */\n _isAbove: boolean;\n\n constructor(elementRef: ElementRef) {\n super(elementRef);\n }\n\n ngAfterViewInit() {\n this._calendar.focusActiveCell();\n }\n}\n\n\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\n// template reference variables (e.g. #d vs #d=\"matDatepicker\"). We can change this to a directive\n// if angular adds support for `exportAs: '$implicit'` on directives.\n/** Component responsible for managing the datepicker popup/dialog. */\n@Component({\n moduleId: module.id,\n selector: 'mat-datepicker',\n template: '',\n exportAs: 'matDatepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MatDatepicker<D> implements OnDestroy, CanColor {\n private _scrollStrategy: () => ScrollStrategy;\n\n /** An input indicating the type of the custom header component for the calendar, if set. */\n @Input() calendarHeaderComponent: ComponentType<any>;\n\n /** The date to open the calendar to initially. */\n @Input()\n get startAt(): D | null {\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\n // selected value is.\n return this._startAt || (this._datepickerInput ? this._datepickerInput.value : null);\n }\n set startAt(value: D | null) {\n this._startAt = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _startAt: D | null;\n\n /** The view that the calendar should start in. */\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\n\n /** Color palette to use on the datepicker's calendar. */\n @Input()\n get color(): ThemePalette {\n return this._color ||\n (this._datepickerInput ? this._datepickerInput._getThemePalette() : undefined);\n }\n set color(value: ThemePalette) {\n this._color = value;\n }\n _color: ThemePalette;\n\n /**\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\n * than a popup and elements have more padding to allow for bigger touch targets.\n */\n @Input()\n get touchUi(): boolean { return this._touchUi; }\n set touchUi(value: boolean) {\n this._touchUi = coerceBooleanProperty(value);\n }\n private _touchUi = false;\n\n /** Whether the datepicker pop-up should be disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled === undefined && this._datepickerInput ?\n this._datepickerInput.disabled : !!this._disabled;\n }\n set disabled(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this._disabledChange.next(newValue);\n }\n }\n private _disabled: boolean;\n\n /**\n * Emits selected year in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /**\n * Emits selected month in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string | string[];\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => MatCalendarCellCssClasses;\n\n /** Emits when the datepicker has been opened. */\n @Output('opened') openedStream: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emits when the datepicker has been closed. */\n @Output('closed') closedStream: EventEmitter<void> = new EventEmitter<void>();\n\n\n /** Whether the calendar is open. */\n @Input()\n get opened(): boolean { return this._opened; }\n set opened(value: boolean) { value ? this.open() : this.close(); }\n private _opened = false;\n\n /** The id for the datepicker calendar. */\n id: string = `mat-datepicker-${datepickerUid++}`;\n\n /** The currently selected date. */\n get _selected(): D | null { return this._validSelected; }\n set _selected(value: D | null) { this._validSelected = value; }\n private _validSelected: D | null = null;\n\n /** The minimum selectable date. */\n get _minDate(): D | null {\n return this._datepickerInput && this._datepickerInput.min;\n }\n\n /** The maximum selectable date. */\n get _maxDate(): D | null {\n return this._datepickerInput && this._datepickerInput.max;\n }\n\n get _dateFilter(): (date: D | null) => boolean {\n return this._datepickerInput && this._datepickerInput._dateFilter;\n }\n\n /** A reference to the overlay when the calendar is opened as a popup. */\n _popupRef: OverlayRef;\n\n /** A reference to the dialog when the calendar is opened as a dialog. */\n private _dialogRef: MatDialogRef<MatDatepickerContent<D>> | null;\n\n /** A portal containing the calendar for this datepicker. */\n private _calendarPortal: ComponentPortal<MatDatepickerContent<D>>;\n\n /** Reference to the component instantiated in popup mode. */\n private _popupComponentRef: ComponentRef<MatDatepickerContent<D>> | null;\n\n /** The element that was focused before the datepicker was opened. */\n private _focusedElementBeforeOpen: HTMLElement | null = null;\n\n /** Subscription to value changes in the associated input element. */\n private _inputSubscription = Subscription.EMPTY;\n\n /** The input element this datepicker is associated with. */\n _datepickerInput: MatDatepickerInput<D>;\n\n /** Emits when the datepicker is disabled. */\n readonly _disabledChange = new Subject<boolean>();\n\n /** Emits new selected date when selected date changes. */\n readonly _selectedChanged = new Subject<D>();\n\n constructor(private _dialog: MatDialog,\n private _overlay: Overlay,\n private _ngZone: NgZone,\n private _viewContainerRef: ViewContainerRef,\n @Inject(MAT_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dateAdapter: DateAdapter<D>,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(DOCUMENT) private _document: any) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n\n this._scrollStrategy = scrollStrategy;\n }\n\n ngOnDestroy() {\n this.close();\n this._inputSubscription.unsubscribe();\n this._disabledChange.complete();\n\n if (this._popupRef) {\n this._popupRef.dispose();\n this._popupComponentRef = null;\n }\n }\n\n /** Selects the given date */\n select(date: D): void {\n let oldValue = this._selected;\n this._selected = date;\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\n this._selectedChanged.next(date);\n }\n }\n\n /** Emits the selected year in multiyear view */\n _selectYear(normalizedYear: D): void {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Emits selected month in year view */\n _selectMonth(normalizedMonth: D): void {\n this.monthSelected.emit(normalizedMonth);\n }\n\n /**\n * Register an input with this datepicker.\n * @param input The datepicker input to register with this datepicker.\n */\n _registerInput(input: MatDatepickerInput<D>): void {\n if (this._datepickerInput) {\n throw Error('A MatDatepicker can only be associated with a single input.');\n }\n this._datepickerInput = input;\n this._inputSubscription =\n this._datepickerInput._valueChange.subscribe((value: D | null) => this._selected = value);\n }\n\n /** Open the calendar. */\n open(): void {\n if (this._opened || this.disabled) {\n return;\n }\n if (!this._datepickerInput) {\n throw Error('Attempted to open an MatDatepicker with no associated input.');\n }\n if (this._document) {\n this._focusedElementBeforeOpen = this._document.activeElement;\n }\n\n this.touchUi ? this._openAsDialog() : this._openAsPopup();\n this._opened = true;\n this.openedStream.emit();\n }\n\n /** Close the calendar. */\n close(): void {\n if (!this._opened) {\n return;\n }\n if (this._popupRef && this._popupRef.hasAttached()) {\n this._popupRef.detach();\n }\n if (this._dialogRef) {\n this._dialogRef.close();\n this._dialogRef = null;\n }\n if (this._calendarPortal && this._calendarPortal.isAttached) {\n this._calendarPortal.detach();\n }\n\n const completeClose = () => {\n // The `_opened` could've been reset already if\n // we got two events in quick succession.\n if (this._opened) {\n this._opened = false;\n this.closedStream.emit();\n this._focusedElementBeforeOpen = null;\n }\n };\n\n if (this._focusedElementBeforeOpen &&\n typeof this._focusedElementBeforeOpen.focus === 'function') {\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\n // marked the datepicker as closed. If the event fires out of sequence and the element that\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\n // able to close the calendar at all. We work around it by making the logic, that marks\n // the datepicker as closed, async as well.\n this._focusedElementBeforeOpen.focus();\n setTimeout(completeClose);\n } else {\n completeClose();\n }\n }\n\n /** Open the calendar as a dialog. */\n private _openAsDialog(): void {\n // Usually this would be handled by `open` which ensures that we can only have one overlay\n // open at a time, however since we reset the variables in async handlers some overlays\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\n // by holding down the enter key).\n if (this._dialogRef) {\n this._dialogRef.close();\n }\n\n this._dialogRef = this._dialog.open<MatDatepickerContent<D>>(MatDatepickerContent, {\n direction: this._dir ? this._dir.value : 'ltr',\n viewContainerRef: this._viewContainerRef,\n panelClass: 'mat-datepicker-dialog',\n });\n\n this._dialogRef.afterClosed().subscribe(() => this.close());\n this._dialogRef.componentInstance.datepicker = this;\n this._setColor();\n }\n\n /** Open the calendar as a popup. */\n private _openAsPopup(): void {\n if (!this._calendarPortal) {\n this._calendarPortal = new ComponentPortal<MatDatepickerContent<D>>(MatDatepickerContent,\n this._viewContainerRef);\n }\n\n if (!this._popupRef) {\n this._createPopup();\n }\n\n if (!this._popupRef.hasAttached()) {\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\n this._popupComponentRef.instance.datepicker = this;\n this._setColor();\n\n // Update the position once the calendar has rendered.\n this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n this._popupRef.updatePosition();\n });\n }\n }\n\n /** Create the popup. */\n private _createPopup(): void {\n const overlayConfig = new OverlayConfig({\n positionStrategy: this._createPopupPositionStrategy(),\n hasBackdrop: true,\n backdropClass: 'mat-overlay-transparent-backdrop',\n direction: this._dir,\n scrollStrategy: this._scrollStrategy(),\n panelClass: 'mat-datepicker-popup',\n });\n\n this._popupRef = this._overlay.create(overlayConfig);\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\n\n merge(\n this._popupRef.backdropClick(),\n this._popupRef.detachments(),\n this._popupRef.keydownEvents().pipe(filter(event => {\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\n return event.keyCode === ESCAPE ||\n (this._datepickerInput && event.altKey && event.keyCode === UP_ARROW);\n }))\n ).subscribe(event => {\n if (event) {\n event.preventDefault();\n }\n\n this.close();\n });\n }\n\n /** Create the popup PositionStrategy. */\n private _createPopupPositionStrategy(): PositionStrategy {\n return this._overlay.position()\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\n .withTransformOriginOn('.mat-datepicker-content')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withLockedPosition()\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom'\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom'\n }\n ]);\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n\n /** Passes the current theme color along to the calendar overlay. */\n private _setColor(): void {\n const color = this.color;\n if (this._popupComponentRef) {\n this._popupComponentRef.instance.color = color;\n }\n if (this._dialogRef) {\n this._dialogRef.componentInstance.color = color;\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {DOWN_ARROW} from '@angular/cdk/keycodes';\nimport {\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\nimport {DateAdapter, MAT_DATE_FORMATS, MatDateFormats, ThemePalette} from '@angular/material/core';\nimport {MatFormField} from '@angular/material/form-field';\nimport {MAT_INPUT_VALUE_ACCESSOR} from '@angular/material/input';\nimport {Subscription} from 'rxjs';\nimport {MatDatepicker} from './datepicker';\nimport {createMissingDateImplError} from './datepicker-errors';\n\n/** @docs-private */\nexport const MAT_DATEPICKER_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatDatepickerInput),\n multi: true\n};\n\n/** @docs-private */\nexport const MAT_DATEPICKER_VALIDATORS: any = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MatDatepickerInput),\n multi: true\n};\n\n\n/**\n * An event used for datepicker input and change events. We don't always have access to a native\n * input or change event because the event may have been triggered by the user clicking on the\n * calendar popup. For consistency, we always use MatDatepickerInputEvent instead.\n */\nexport class MatDatepickerInputEvent<D> {\n /** The new value for the target datepicker input. */\n value: D | null;\n\n constructor(\n /** Reference to the datepicker input component that emitted the event. */\n public target: MatDatepickerInput<D>,\n /** Reference to the native input element associated with the datepicker input. */\n public targetElement: HTMLElement) {\n this.value = this.target.value;\n }\n}\n\n\n/** Directive used to connect an input to a MatDatepicker. */\n@Directive({\n selector: 'input[matDatepicker]',\n providers: [\n MAT_DATEPICKER_VALUE_ACCESSOR,\n MAT_DATEPICKER_VALIDATORS,\n {provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MatDatepickerInput},\n ],\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-owns]': '(_datepicker?.opened && _datepicker.id) || null',\n '[attr.min]': 'min ? _dateAdapter.toIso8601(min) : null',\n '[attr.max]': 'max ? _dateAdapter.toIso8601(max) : null',\n '[disabled]': 'disabled',\n '(input)': '_onInput($event.target.value)',\n '(change)': '_onChange()',\n '(blur)': '_onBlur()',\n '(keydown)': '_onKeydown($event)',\n },\n exportAs: 'matDatepickerInput',\n})\nexport class MatDatepickerInput<D> implements ControlValueAccessor, OnDestroy, Validator {\n /** The datepicker that this input is associated with. */\n @Input()\n set matDatepicker(value: MatDatepicker<D>) {\n if (!value) {\n return;\n }\n\n this._datepicker = value;\n this._datepicker._registerInput(this);\n this._datepickerSubscription.unsubscribe();\n\n this._datepickerSubscription = this._datepicker._selectedChanged.subscribe((selected: D) => {\n this.value = selected;\n this._cvaOnChange(selected);\n this._onTouched();\n this.dateInput.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n this.dateChange.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n });\n }\n _datepicker: MatDatepicker<D>;\n\n /** Function that can be used to filter out dates within the datepicker. */\n @Input()\n set matDatepickerFilter(value: (date: D | null) => boolean) {\n this._dateFilter = value;\n this._validatorOnChange();\n }\n _dateFilter: (date: D | null) => boolean;\n\n /** The value of the input. */\n @Input()\n get value(): D | null { return this._value; }\n set value(value: D | null) {\n value = this._dateAdapter.deserialize(value);\n this._lastValueValid = !value || this._dateAdapter.isValid(value);\n value = this._getValidDateOrNull(value);\n const oldDate = this.value;\n this._value = value;\n this._formatValue(value);\n\n if (!this._dateAdapter.sameDate(oldDate, value)) {\n this._valueChange.emit(value);\n }\n }\n private _value: D | null;\n\n /** The minimum valid date. */\n @Input()\n get min(): D | null { return this._min; }\n set min(value: D | null) {\n this._min = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n this._validatorOnChange();\n }\n private _min: D | null;\n\n /** The maximum valid date. */\n @Input()\n get max(): D | null { return this._max; }\n set max(value: D | null) {\n this._max = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n this._validatorOnChange();\n }\n private _max: D | null;\n\n /** Whether the datepicker-input is disabled. */\n @Input()\n get disabled(): boolean { return !!this._disabled; }\n set disabled(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n const element = this._elementRef.nativeElement;\n\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n this._disabledChange.emit(newValue);\n }\n\n // We need to null check the `blur` method, because it's undefined during SSR.\n if (newValue && element.blur) {\n // Normally, native input elements automatically blur if they turn disabled. This behavior\n // is problematic, because it would mean that it triggers another change detection cycle,\n // which then causes a changed after checked error if the input element was focused before.\n element.blur();\n }\n }\n private _disabled: boolean;\n\n /** Emits when a `change` event is fired on this `<input>`. */\n @Output() readonly dateChange: EventEmitter<MatDatepickerInputEvent<D>> =\n new EventEmitter<MatDatepickerInputEvent<D>>();\n\n /** Emits when an `input` event is fired on this `<input>`. */\n @Output() readonly dateInput: EventEmitter<MatDatepickerInputEvent<D>> =\n new EventEmitter<MatDatepickerInputEvent<D>>();\n\n /** Emits when the value changes (either due to user input or programmatic change). */\n _valueChange = new EventEmitter<D | null>();\n\n /** Emits when the disabled state has changed */\n _disabledChange = new EventEmitter<boolean>();\n\n _onTouched = () => {};\n\n private _cvaOnChange: (value: any) => void = () => {};\n\n private _validatorOnChange = () => {};\n\n private _datepickerSubscription = Subscription.EMPTY;\n\n private _localeSubscription = Subscription.EMPTY;\n\n /** The form control validator for whether the input parses. */\n private _parseValidator: ValidatorFn = (): ValidationErrors | null => {\n return this._lastValueValid ?\n null : {'matDatepickerParse': {'text': this._elementRef.nativeElement.value}};\n }\n\n /** The form control validator for the min date. */\n private _minValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {\n const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n return (!this.min || !controlValue ||\n this._dateAdapter.compareDate(this.min, controlValue) <= 0) ?\n null : {'matDatepickerMin': {'min': this.min, 'actual': controlValue}};\n }\n\n /** The form control validator for the max date. */\n private _maxValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {\n const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n return (!this.max || !controlValue ||\n this._dateAdapter.compareDate(this.max, controlValue) >= 0) ?\n null : {'matDatepickerMax': {'max': this.max, 'actual': controlValue}};\n }\n\n /** The form control validator for the date filter. */\n private _filterValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {\n const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n return !this._dateFilter || !controlValue || this._dateFilter(controlValue) ?\n null : {'matDatepickerFilter': true};\n }\n\n /** The combined form control validator for this input. */\n private _validator: ValidatorFn | null =\n Validators.compose(\n [this._parseValidator, this._minValidator, this._maxValidator, this._filterValidator]);\n\n /** Whether the last value set on the input was valid. */\n private _lastValueValid = false;\n\n constructor(\n private _elementRef: ElementRef<HTMLInputElement>,\n @Optional() public _dateAdapter: DateAdapter<D>,\n @Optional() @Inject(MAT_DATE_FORMATS) private _dateFormats: MatDateFormats,\n @Optional() private _formField: MatFormField) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n\n // Update the displayed date when the locale changes.\n this._localeSubscription = _dateAdapter.localeChanges.subscribe(() => {\n this.value = this.value;\n });\n }\n\n ngOnDestroy() {\n this._datepickerSubscription.unsubscribe();\n this._localeSubscription.unsubscribe();\n this._valueChange.complete();\n this._disabledChange.complete();\n }\n\n /** @docs-private */\n registerOnValidatorChange(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n\n /** @docs-private */\n validate(c: AbstractControl): ValidationErrors | null {\n return this._validator ? this._validator(c) : null;\n }\n\n /**\n * @deprecated\n * @breaking-change 8.0.0 Use `getConnectedOverlayOrigin` instead\n */\n getPopupConnectionElementRef(): ElementRef {\n return this.getConnectedOverlayOrigin();\n }\n\n /**\n * Gets the element that the datepicker popup should be connected to.\n * @return The element to connect the popup to.\n */\n getConnectedOverlayOrigin(): ElementRef {\n return this._formField ? this._formField.getConnectedOverlayOrigin() : this._elementRef;\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: D): void {\n this.value = value;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void): void {\n this._cvaOnChange = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n _onKeydown(event: KeyboardEvent) {\n const isAltDownArrow = event.altKey && event.keyCode === DOWN_ARROW;\n\n if (this._datepicker && isAltDownArrow && !this._elementRef.nativeElement.readOnly) {\n this._datepicker.open();\n event.preventDefault();\n }\n }\n\n _onInput(value: string) {\n let date = this._dateAdapter.parse(value, this._dateFormats.parse.dateInput);\n this._lastValueValid = !date || this._dateAdapter.isValid(date);\n date = this._getValidDateOrNull(date);\n\n if (!this._dateAdapter.sameDate(date, this._value)) {\n this._value = date;\n this._cvaOnChange(date);\n this._valueChange.emit(date);\n this.dateInput.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n } else {\n this._validatorOnChange();\n }\n }\n\n _onChange() {\n this.dateChange.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n }\n\n /** Returns the palette used by the input's form field, if any. */\n _getThemePalette(): ThemePalette {\n return this._formField ? this._formField.color : undefined;\n }\n\n /** Handles blur events on the input. */\n _onBlur() {\n // Reformat the input only if we have a valid value.\n if (this.value) {\n this._formatValue(this.value);\n }\n\n this._onTouched();\n }\n\n /** Formats a value and sets it on the input element. */\n private _formatValue(value: D | null) {\n this._elementRef.nativeElement.value =\n value ? this._dateAdapter.format(value, this._dateFormats.display.dateInput) : '';\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n Directive,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewEncapsulation,\n ViewChild,\n} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {merge, of as observableOf, Subscription} from 'rxjs';\nimport {MatDatepicker} from './datepicker';\nimport {MatDatepickerIntl} from './datepicker-intl';\n\n\n/** Can be used to override the icon of a `matDatepickerToggle`. */\n@Directive({\n selector: '[matDatepickerToggleIcon]'\n})\nexport class MatDatepickerToggleIcon {}\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-datepicker-toggle',\n templateUrl: 'datepicker-toggle.html',\n styleUrls: ['datepicker-toggle.css'],\n host: {\n 'class': 'mat-datepicker-toggle',\n // Always set the tabindex to -1 so that it doesn't overlap with any custom tabindex the\n // consumer may have provided, while still being able to receive focus.\n '[attr.tabindex]': '-1',\n '[class.mat-datepicker-toggle-active]': 'datepicker && datepicker.opened',\n '[class.mat-accent]': 'datepicker && datepicker.color === \"accent\"',\n '[class.mat-warn]': 'datepicker && datepicker.color === \"warn\"',\n '(focus)': '_button.focus()',\n },\n exportAs: 'matDatepickerToggle',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDatepickerToggle<D> implements AfterContentInit, OnChanges, OnDestroy {\n private _stateChanges = Subscription.EMPTY;\n\n /** Datepicker instance that the button will toggle. */\n @Input('for') datepicker: MatDatepicker<D>;\n\n /** Tabindex for the toggle. */\n @Input() tabIndex: number | null;\n\n /** Whether the toggle button is disabled. */\n @Input()\n get disabled(): boolean {\n if (this._disabled === undefined && this.datepicker) {\n return this.datepicker.disabled;\n }\n\n return !!this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n }\n private _disabled: boolean;\n\n /** Whether ripples on the toggle should be disabled. */\n @Input() disableRipple: boolean;\n\n /** Custom icon set by the consumer. */\n @ContentChild(MatDatepickerToggleIcon, {static: false}) _customIcon: MatDatepickerToggleIcon;\n\n /** Underlying button element. */\n @ViewChild('button', {static: false}) _button: MatButton;\n\n constructor(\n public _intl: MatDatepickerIntl,\n private _changeDetectorRef: ChangeDetectorRef,\n @Attribute('tabindex') defaultTabIndex: string) {\n\n const parsedTabIndex = Number(defaultTabIndex);\n this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['datepicker']) {\n this._watchStateChanges();\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.unsubscribe();\n }\n\n ngAfterContentInit() {\n this._watchStateChanges();\n }\n\n _open(event: Event): void {\n if (this.datepicker && !this.disabled) {\n this.datepicker.open();\n event.stopPropagation();\n }\n }\n\n private _watchStateChanges() {\n const datepickerDisabled = this.datepicker ? this.datepicker._disabledChange : observableOf();\n const inputDisabled = this.datepicker && this.datepicker._datepickerInput ?\n this.datepicker._datepickerInput._disabledChange : observableOf();\n const datepickerToggled = this.datepicker ?\n merge(this.datepicker.openedStream, this.datepicker.closedStream) :\n observableOf();\n\n this._stateChanges.unsubscribe();\n this._stateChanges = merge(\n this._intl.changes,\n datepickerDisabled,\n inputDisabled,\n datepickerToggled\n ).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {A11yModule} from '@angular/cdk/a11y';\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatCalendar, MatCalendarHeader} from './calendar';\nimport {MatCalendarBody} from './calendar-body';\nimport {\n MatDatepicker,\n MatDatepickerContent,\n MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n} from './datepicker';\nimport {MatDatepickerInput} from './datepicker-input';\nimport {MatDatepickerIntl} from './datepicker-intl';\nimport {MatDatepickerToggle, MatDatepickerToggleIcon} from './datepicker-toggle';\nimport {MatMonthView} from './month-view';\nimport {MatMultiYearView} from './multi-year-view';\nimport {MatYearView} from './year-view';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatButtonModule,\n MatDialogModule,\n OverlayModule,\n A11yModule,\n PortalModule,\n ],\n exports: [\n MatCalendar,\n MatCalendarBody,\n MatDatepicker,\n MatDatepickerContent,\n MatDatepickerInput,\n MatDatepickerToggle,\n MatDatepickerToggleIcon,\n MatMonthView,\n MatYearView,\n MatMultiYearView,\n MatCalendarHeader,\n ],\n declarations: [\n MatCalendar,\n MatCalendarBody,\n MatDatepicker,\n MatDatepickerContent,\n MatDatepickerInput,\n MatDatepickerToggle,\n MatDatepickerToggleIcon,\n MatMonthView,\n MatYearView,\n MatMultiYearView,\n MatCalendarHeader,\n ],\n providers: [\n MatDatepickerIntl,\n MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n ],\n entryComponents: [\n MatDatepickerContent,\n MatCalendarHeader,\n ]\n})\nexport class MatDatepickerModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\n\n@Component({\n moduleId: module.id,\n selector: 'mat-divider',\n host: {\n 'role': 'separator',\n '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n '[class.mat-divider-vertical]': 'vertical',\n '[class.mat-divider-horizontal]': '!vertical',\n '[class.mat-divider-inset]': 'inset',\n 'class': 'mat-divider'\n },\n template: '',\n styleUrls: ['divider.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDivider {\n /** Whether the divider is vertically aligned. */\n @Input()\n get vertical(): boolean { return this._vertical; }\n set vertical(value: boolean) { this._vertical = coerceBooleanProperty(value); }\n private _vertical: boolean = false;\n\n /** Whether the divider is an inset divider. */\n @Input()\n get inset(): boolean { return this._inset; }\n set inset(value: boolean) { this._inset = coerceBooleanProperty(value); }\n private _inset: boolean = false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatDivider} from './divider';\n\n\n@NgModule({\n imports: [MatCommonModule, CommonModule],\n exports: [MatDivider, MatCommonModule],\n declarations: [MatDivider],\n})\nexport class MatDividerModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport {CdkAccordion} from '@angular/cdk/accordion';\n\n/** MatAccordion's display modes. */\nexport type MatAccordionDisplayMode = 'default' | 'flat';\n\n/** MatAccordion's toggle positions. */\nexport type MatAccordionTogglePosition = 'before' | 'after';\n\n/**\n * Base interface for a `MatAccordion`.\n * @docs-private\n */\nexport interface MatAccordionBase extends CdkAccordion {\n /** Whether the expansion indicator should be hidden. */\n hideToggle: boolean;\n\n /** Display mode used for all expansion panels in the accordion. */\n displayMode: MatAccordionDisplayMode;\n\n /** The position of the expansion indicator. */\n togglePosition: MatAccordionTogglePosition;\n\n /** Handles keyboard events coming in from the panel headers. */\n _handleHeaderKeydown: (event: KeyboardEvent) => void;\n\n /** Handles focus events on the panel headers. */\n _handleHeaderFocus: (header: any) => void;\n}\n\n\n/**\n * Token used to provide a `MatAccordion` to `MatExpansionPanel`.\n * Used primarily to avoid circular imports between `MatAccordion` and `MatExpansionPanel`.\n */\nexport const MAT_ACCORDION = new InjectionToken<MatAccordionBase>('MAT_ACCORDION');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, TemplateRef} from '@angular/core';\n\n/**\n * Expansion panel content that will be rendered lazily\n * after the panel is opened for the first time.\n */\n@Directive({\n selector: 'ng-template[matExpansionPanelContent]'\n})\nexport class MatExpansionPanelContent {\n constructor(public _template: TemplateRef<any>) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {AnimationEvent} from '@angular/animations';\nimport {CdkAccordionItem} from '@angular/cdk/accordion';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {UniqueSelectionDispatcher} from '@angular/cdk/collections';\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n Directive,\n EventEmitter,\n ElementRef,\n Input,\n Inject,\n OnChanges,\n OnDestroy,\n Optional,\n Output,\n SimpleChanges,\n SkipSelf,\n ViewContainerRef,\n ViewEncapsulation,\n ViewChild,\n InjectionToken,\n} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {Subject} from 'rxjs';\nimport {filter, startWith, take, distinctUntilChanged} from 'rxjs/operators';\nimport {matExpansionAnimations} from './expansion-animations';\nimport {MatExpansionPanelContent} from './expansion-panel-content';\nimport {MAT_ACCORDION, MatAccordionBase, MatAccordionTogglePosition} from './accordion-base';\n\n/** MatExpansionPanel's states. */\nexport type MatExpansionPanelState = 'expanded' | 'collapsed';\n\n/** Counter for generating unique element ids. */\nlet uniqueId = 0;\n\n/**\n * Object that can be used to override the default options\n * for all of the expansion panels in a module.\n */\nexport interface MatExpansionPanelDefaultOptions {\n /** Height of the header while the panel is expanded. */\n expandedHeight: string;\n\n /** Height of the header while the panel is collapsed. */\n collapsedHeight: string;\n\n /** Whether the toggle indicator should be hidden. */\n hideToggle: boolean;\n}\n\n/**\n * Injection token that can be used to configure the defalt\n * options for the expansion panel component.\n */\nexport const MAT_EXPANSION_PANEL_DEFAULT_OPTIONS =\n new InjectionToken<MatExpansionPanelDefaultOptions>('MAT_EXPANSION_PANEL_DEFAULT_OPTIONS');\n\n/**\n * `<mat-expansion-panel>`\n *\n * This component can be used as a single element to show expandable content, or as one of\n * multiple children of an element with the MatAccordion directive attached.\n */\n@Component({\n moduleId: module.id,\n styleUrls: ['./expansion-panel.css'],\n selector: 'mat-expansion-panel',\n exportAs: 'matExpansionPanel',\n templateUrl: './expansion-panel.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['disabled', 'expanded'],\n outputs: ['opened', 'closed', 'expandedChange'],\n animations: [matExpansionAnimations.bodyExpansion],\n providers: [\n // Provide MatAccordion as undefined to prevent nested expansion panels from registering\n // to the same accordion.\n {provide: MAT_ACCORDION, useValue: undefined},\n ],\n host: {\n 'class': 'mat-expansion-panel',\n '[class.mat-expanded]': 'expanded',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[class.mat-expansion-panel-spacing]': '_hasSpacing()',\n }\n})\nexport class MatExpansionPanel extends CdkAccordionItem implements AfterContentInit, OnChanges,\n OnDestroy {\n private _document: Document;\n private _hideToggle = false;\n private _togglePosition: MatAccordionTogglePosition;\n\n /** Whether the toggle indicator should be hidden. */\n @Input()\n get hideToggle(): boolean {\n return this._hideToggle || (this.accordion && this.accordion.hideToggle);\n }\n set hideToggle(value: boolean) {\n this._hideToggle = coerceBooleanProperty(value);\n }\n\n /** Whether the toggle indicator should be hidden. */\n @Input()\n get togglePosition(): MatAccordionTogglePosition {\n return this._togglePosition || (this.accordion && this.accordion.togglePosition);\n }\n set togglePosition(value: MatAccordionTogglePosition) {\n this._togglePosition = value;\n }\n\n /** An event emitted after the body's expansion animation happens. */\n @Output() afterExpand = new EventEmitter<void>();\n\n /** An event emitted after the body's collapse animation happens. */\n @Output() afterCollapse = new EventEmitter<void>();\n\n /** Stream that emits for changes in `@Input` properties. */\n readonly _inputChanges = new Subject<SimpleChanges>();\n\n /** Optionally defined accordion the expansion panel belongs to. */\n accordion: MatAccordionBase;\n\n /** Content that will be rendered lazily. */\n @ContentChild(MatExpansionPanelContent, {static: false}) _lazyContent: MatExpansionPanelContent;\n\n /** Element containing the panel's user-provided content. */\n @ViewChild('body', {static: false}) _body: ElementRef<HTMLElement>;\n\n /** Portal holding the user's content. */\n _portal: TemplatePortal;\n\n /** ID for the associated header element. Used for a11y labelling. */\n _headerId = `mat-expansion-panel-header-${uniqueId++}`;\n\n /** Stream of body animation done events. */\n _bodyAnimationDone = new Subject<AnimationEvent>();\n\n constructor(@Optional() @SkipSelf() @Inject(MAT_ACCORDION) accordion: MatAccordionBase,\n _changeDetectorRef: ChangeDetectorRef,\n _uniqueSelectionDispatcher: UniqueSelectionDispatcher,\n private _viewContainerRef: ViewContainerRef,\n @Inject(DOCUMENT) _document: any,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode: string,\n @Inject(MAT_EXPANSION_PANEL_DEFAULT_OPTIONS) @Optional()\n defaultOptions?: MatExpansionPanelDefaultOptions) {\n super(accordion, _changeDetectorRef, _uniqueSelectionDispatcher);\n this.accordion = accordion;\n this._document = _document;\n\n // We need a Subject with distinctUntilChanged, because the `done` event\n // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\n this._bodyAnimationDone.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe(event => {\n if (event.fromState !== 'void') {\n if (event.toState === 'expanded') {\n this.afterExpand.emit();\n } else if (event.toState === 'collapsed') {\n this.afterCollapse.emit();\n }\n }\n });\n\n if (defaultOptions) {\n this.hideToggle = defaultOptions.hideToggle;\n }\n }\n\n /** Determines whether the expansion panel should have spacing between it and its siblings. */\n _hasSpacing(): boolean {\n if (this.accordion) {\n // We don't need to subscribe to the `stateChanges` of the parent accordion because each time\n // the [displayMode] input changes, the change detection will also cover the host bindings\n // of this expansion panel.\n return (this.expanded ? this.accordion.displayMode : this._getExpandedState()) === 'default';\n }\n return false;\n }\n\n /** Gets the expanded state string. */\n _getExpandedState(): MatExpansionPanelState {\n return this.expanded ? 'expanded' : 'collapsed';\n }\n\n ngAfterContentInit() {\n if (this._lazyContent) {\n // Render the content as soon as the panel becomes open.\n this.opened.pipe(\n startWith(null!),\n filter(() => this.expanded && !this._portal),\n take(1)\n ).subscribe(() => {\n this._portal = new TemplatePortal(this._lazyContent._template, this._viewContainerRef);\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this._inputChanges.next(changes);\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this._bodyAnimationDone.complete();\n this._inputChanges.complete();\n }\n\n /** Checks whether the expansion panel's content contains the currently-focused element. */\n _containsFocus(): boolean {\n if (this._body) {\n const focusedElement = this._document.activeElement;\n const bodyElement = this._body.nativeElement;\n return focusedElement === bodyElement || bodyElement.contains(focusedElement);\n }\n\n return false;\n }\n}\n\n@Directive({\n selector: 'mat-action-row',\n host: {\n class: 'mat-action-row'\n }\n})\nexport class MatExpansionPanelActionRow {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {getSupportedInputTypes, Platform} from '@angular/cdk/platform';\nimport {AutofillMonitor} from '@angular/cdk/text-field';\nimport {\n Directive,\n DoCheck,\n ElementRef,\n Inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Self,\n} from '@angular/core';\nimport {FormGroupDirective, NgControl, NgForm} from '@angular/forms';\nimport {\n CanUpdateErrorState,\n CanUpdateErrorStateCtor,\n ErrorStateMatcher,\n mixinErrorState,\n} from '@angular/material/core';\nimport {MatFormFieldControl} from '@angular/material/form-field';\nimport {Subject} from 'rxjs';\nimport {getMatInputUnsupportedTypeError} from './input-errors';\nimport {MAT_INPUT_VALUE_ACCESSOR} from './input-value-accessor';\n\n\n// Invalid input type. Using one of these will throw an MatInputUnsupportedTypeError.\nconst MAT_INPUT_INVALID_TYPES = [\n 'button',\n 'checkbox',\n 'file',\n 'hidden',\n 'image',\n 'radio',\n 'range',\n 'reset',\n 'submit'\n];\n\nlet nextUniqueId = 0;\n\n// Boilerplate for applying mixins to MatInput.\n/** @docs-private */\nclass MatInputBase {\n constructor(public _defaultErrorStateMatcher: ErrorStateMatcher,\n public _parentForm: NgForm,\n public _parentFormGroup: FormGroupDirective,\n /** @docs-private */\n public ngControl: NgControl) {}\n}\nconst _MatInputMixinBase: CanUpdateErrorStateCtor & typeof MatInputBase =\n mixinErrorState(MatInputBase);\n\n/** Directive that allows a native input to work inside a `MatFormField`. */\n@Directive({\n selector: `input[matInput], textarea[matInput], select[matNativeControl],\n input[matNativeControl], textarea[matNativeControl]`,\n exportAs: 'matInput',\n host: {\n /**\n * @breaking-change 8.0.0 remove .mat-form-field-autofill-control in favor of AutofillMonitor.\n */\n 'class': 'mat-input-element mat-form-field-autofill-control',\n '[class.mat-input-server]': '_isServer',\n // Native input properties that are overwritten by Angular inputs need to be synced with\n // the native input element. Otherwise property bindings for those don't work.\n '[attr.id]': 'id',\n '[attr.placeholder]': 'placeholder',\n '[disabled]': 'disabled',\n '[required]': 'required',\n '[attr.readonly]': 'readonly && !_isNativeSelect || null',\n '[attr.aria-describedby]': '_ariaDescribedby || null',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-required]': 'required.toString()',\n '(blur)': '_focusChanged(false)',\n '(focus)': '_focusChanged(true)',\n '(input)': '_onInput()',\n },\n providers: [{provide: MatFormFieldControl, useExisting: MatInput}],\n})\nexport class MatInput extends _MatInputMixinBase implements MatFormFieldControl<any>, OnChanges,\n OnDestroy, OnInit, DoCheck, CanUpdateErrorState {\n protected _uid = `mat-input-${nextUniqueId++}`;\n protected _previousNativeValue: any;\n private _inputValueAccessor: {value: any};\n /** The aria-describedby attribute on the input for improved a11y. */\n _ariaDescribedby: string;\n\n /** Whether the component is being rendered on the server. */\n _isServer = false;\n\n /** Whether the component is a native html select. */\n _isNativeSelect = false;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n focused: boolean = false;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n readonly stateChanges: Subject<void> = new Subject<void>();\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n controlType: string = 'mat-input';\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n autofilled = false;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get disabled(): boolean {\n if (this.ngControl && this.ngControl.disabled !== null) {\n return this.ngControl.disabled;\n }\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n\n // Browsers may not fire the blur event if the input is disabled too quickly.\n // Reset from here to ensure that the element doesn't become stuck.\n if (this.focused) {\n this.focused = false;\n this.stateChanges.next();\n }\n }\n protected _disabled = false;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get id(): string { return this._id; }\n set id(value: string) { this._id = value || this._uid; }\n protected _id: string;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input() placeholder: string;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) { this._required = coerceBooleanProperty(value); }\n protected _required = false;\n\n /** Input type of the element. */\n @Input()\n get type(): string { return this._type; }\n set type(value: string) {\n this._type = value || 'text';\n this._validateType();\n\n // When using Angular inputs, developers are no longer able to set the properties on the native\n // input element. To ensure that bindings for `type` work, we need to sync the setter\n // with the native property. Textarea elements don't support the type property or attribute.\n if (!this._isTextarea() && getSupportedInputTypes().has(this._type)) {\n (this._elementRef.nativeElement as HTMLInputElement).type = this._type;\n }\n }\n protected _type = 'text';\n\n /** An object used to control when error messages are shown. */\n @Input() errorStateMatcher: ErrorStateMatcher;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get value(): string { return this._inputValueAccessor.value; }\n set value(value: string) {\n if (value !== this.value) {\n this._inputValueAccessor.value = value;\n this.stateChanges.next();\n }\n }\n\n /** Whether the element is readonly. */\n @Input()\n get readonly(): boolean { return this._readonly; }\n set readonly(value: boolean) { this._readonly = coerceBooleanProperty(value); }\n private _readonly = false;\n\n protected _neverEmptyInputTypes = [\n 'date',\n 'datetime',\n 'datetime-local',\n 'month',\n 'time',\n 'week'\n ].filter(t => getSupportedInputTypes().has(t));\n\n constructor(\n protected _elementRef: ElementRef<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>,\n protected _platform: Platform,\n /** @docs-private */\n @Optional() @Self() public ngControl: NgControl,\n @Optional() _parentForm: NgForm,\n @Optional() _parentFormGroup: FormGroupDirective,\n _defaultErrorStateMatcher: ErrorStateMatcher,\n @Optional() @Self() @Inject(MAT_INPUT_VALUE_ACCESSOR) inputValueAccessor: any,\n private _autofillMonitor: AutofillMonitor,\n ngZone: NgZone) {\n\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n\n const element = this._elementRef.nativeElement;\n\n // If no input value accessor was explicitly specified, use the element as the input value\n // accessor.\n this._inputValueAccessor = inputValueAccessor || element;\n\n this._previousNativeValue = this.value;\n\n // Force setter to be called in case id was not specified.\n this.id = this.id;\n\n // On some versions of iOS the caret gets stuck in the wrong place when holding down the delete\n // key. In order to get around this we need to \"jiggle\" the caret loose. Since this bug only\n // exists on iOS, we only bother to install the listener on iOS.\n if (_platform.IOS) {\n ngZone.runOutsideAngular(() => {\n _elementRef.nativeElement.addEventListener('keyup', (event: Event) => {\n let el = event.target as HTMLInputElement;\n if (!el.value && !el.selectionStart && !el.selectionEnd) {\n // Note: Just setting `0, 0` doesn't fix the issue. Setting\n // `1, 1` fixes it for the first time that you type text and\n // then hold delete. Toggling to `1, 1` and then back to\n // `0, 0` seems to completely fix it.\n el.setSelectionRange(1, 1);\n el.setSelectionRange(0, 0);\n }\n });\n });\n }\n\n this._isServer = !this._platform.isBrowser;\n this._isNativeSelect = element.nodeName.toLowerCase() === 'select';\n\n if (this._isNativeSelect) {\n this.controlType = (element as HTMLSelectElement).multiple ? 'mat-native-select-multiple' :\n 'mat-native-select';\n }\n }\n\n ngOnInit() {\n if (this._platform.isBrowser) {\n this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(event => {\n this.autofilled = event.isAutofilled;\n this.stateChanges.next();\n });\n }\n }\n\n ngOnChanges() {\n this.stateChanges.next();\n }\n\n ngOnDestroy() {\n this.stateChanges.complete();\n\n if (this._platform.isBrowser) {\n this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement);\n }\n }\n\n ngDoCheck() {\n if (this.ngControl) {\n // We need to re-evaluate this on every change detection cycle, because there are some\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\n this.updateErrorState();\n }\n\n // We need to dirty-check the native element's value, because there are some cases where\n // we won't be notified when it changes (e.g. the consumer isn't using forms or they're\n // updating the value using `emitEvent: false`).\n this._dirtyCheckNativeValue();\n }\n\n /** Focuses the input. */\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n\n /** Callback for the cases where the focused state of the input changes. */\n _focusChanged(isFocused: boolean) {\n if (isFocused !== this.focused && (!this.readonly || !isFocused)) {\n this.focused = isFocused;\n this.stateChanges.next();\n }\n }\n\n _onInput() {\n // This is a noop function and is used to let Angular know whenever the value changes.\n // Angular will run a new change detection each time the `input` event has been dispatched.\n // It's necessary that Angular recognizes the value change, because when floatingLabel\n // is set to false and Angular forms aren't used, the placeholder won't recognize the\n // value changes and will not disappear.\n // Listening to the input event wouldn't be necessary when the input is using the\n // FormsModule or ReactiveFormsModule, because Angular forms also listens to input events.\n }\n\n /** Does some manual dirty checking on the native input `value` property. */\n protected _dirtyCheckNativeValue() {\n const newValue = this._elementRef.nativeElement.value;\n\n if (this._previousNativeValue !== newValue) {\n this._previousNativeValue = newValue;\n this.stateChanges.next();\n }\n }\n\n /** Make sure the input is a supported type. */\n protected _validateType() {\n if (MAT_INPUT_INVALID_TYPES.indexOf(this._type) > -1) {\n throw getMatInputUnsupportedTypeError(this._type);\n }\n }\n\n /** Checks whether the input type is one of the types that are never empty. */\n protected _isNeverEmpty() {\n return this._neverEmptyInputTypes.indexOf(this._type) > -1;\n }\n\n /** Checks whether the input is invalid based on the native validation. */\n protected _isBadInput() {\n // The `validity` property won't be present on platform-server.\n let validity = (this._elementRef.nativeElement as HTMLInputElement).validity;\n return validity && validity.badInput;\n }\n\n /** Determines if the component host is a textarea. */\n protected _isTextarea() {\n return this._elementRef.nativeElement.nodeName.toLowerCase() === 'textarea';\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get empty(): boolean {\n return !this._isNeverEmpty() && !this._elementRef.nativeElement.value && !this._isBadInput() &&\n !this.autofilled;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat(): boolean {\n if (this._isNativeSelect) {\n // For a single-selection `<select>`, the label should float when the selected option has\n // a non-empty display value. For a `<select multiple>`, the label *always* floats to avoid\n // overlapping the label with the options.\n const selectElement = this._elementRef.nativeElement as HTMLSelectElement;\n const firstOption: HTMLOptionElement | undefined = selectElement.options[0];\n\n // On most browsers the `selectedIndex` will always be 0, however on IE and Edge it'll be\n // -1 if the `value` is set to something, that isn't in the list of options, at a later point.\n return this.focused || selectElement.multiple || !this.empty ||\n !!(selectElement.selectedIndex > -1 && firstOption && firstOption.label);\n } else {\n return this.focused || !this.empty;\n }\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids: string[]) {\n this._ariaDescribedby = ids.join(' ');\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick() {\n // Do not re-focus the input element if the element is already focused. Otherwise it can happen\n // that someone clicks on a time input and the cursor resets to the \"hours\" field while the\n // \"minutes\" field was actually clicked. See: https://github.com/angular/components/issues/12849\n if (!this.focused) {\n this.focus();\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {TextFieldModule} from '@angular/cdk/text-field';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ErrorStateMatcher} from '@angular/material/core';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatTextareaAutosize} from './autosize';\nimport {MatInput} from './input';\n\n\n@NgModule({\n declarations: [MatInput, MatTextareaAutosize],\n imports: [\n CommonModule,\n TextFieldModule,\n MatFormFieldModule,\n ],\n exports: [\n TextFieldModule,\n // We re-export the `MatFormFieldModule` since `MatInput` will almost always\n // be used together with `MatFormField`.\n MatFormFieldModule,\n MatInput,\n MatTextareaAutosize,\n ],\n providers: [ErrorStateMatcher],\n})\nexport class MatInputModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n\n/** Datepicker data that requires internationalization. */\n@Injectable({providedIn: 'root'})\nexport class MatDatepickerIntl {\n /**\n * Stream that emits whenever the labels here are changed. Use this to notify\n * components if the labels have changed after initialization.\n */\n readonly changes: Subject<void> = new Subject<void>();\n\n /** A label for the calendar popup (used by screen readers). */\n calendarLabel: string = 'Calendar';\n\n /** A label for the button used to open the calendar popup (used by screen readers). */\n openCalendarLabel: string = 'Open calendar';\n\n /** A label for the previous month button (used by screen readers). */\n prevMonthLabel: string = 'Previous month';\n\n /** A label for the next month button (used by screen readers). */\n nextMonthLabel: string = 'Next month';\n\n /** A label for the previous year button (used by screen readers). */\n prevYearLabel: string = 'Previous year';\n\n /** A label for the next year button (used by screen readers). */\n nextYearLabel: string = 'Next year';\n\n /** A label for the previous multi-year button (used by screen readers). */\n prevMultiYearLabel: string = 'Previous 20 years';\n\n /** A label for the next multi-year button (used by screen readers). */\n nextMultiYearLabel: string = 'Next 20 years';\n\n /** A label for the 'switch to month view' button (used by screen readers). */\n switchToMonthViewLabel: string = 'Choose date';\n\n /** A label for the 'switch to year view' button (used by screen readers). */\n switchToMultiYearViewLabel: string = 'Choose month and year';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewEncapsulation,\n NgZone,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport {take} from 'rxjs/operators';\n\n/**\n * Extra CSS classes that can be associated with a calendar cell.\n */\nexport type MatCalendarCellCssClasses = string | string[] | Set<string> | {[key: string]: any};\n\n/**\n * An internal class that represents the data corresponding to a single calendar cell.\n * @docs-private\n */\nexport class MatCalendarCell {\n constructor(public value: number,\n public displayValue: string,\n public ariaLabel: string,\n public enabled: boolean,\n public cssClasses?: MatCalendarCellCssClasses) {}\n}\n\n\n/**\n * An internal component used to display calendar data in a table.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: '[mat-calendar-body]',\n templateUrl: 'calendar-body.html',\n styleUrls: ['calendar-body.css'],\n host: {\n 'class': 'mat-calendar-body',\n 'role': 'grid',\n 'aria-readonly': 'true'\n },\n exportAs: 'matCalendarBody',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatCalendarBody implements OnChanges {\n /** The label for the table. (e.g. \"Jan 2017\"). */\n @Input() label: string;\n\n /** The cells to display in the table. */\n @Input() rows: MatCalendarCell[][];\n\n /** The value in the table that corresponds to today. */\n @Input() todayValue: number;\n\n /** The value in the table that is currently selected. */\n @Input() selectedValue: number;\n\n /** The minimum number of free cells needed to fit the label in the first row. */\n @Input() labelMinRequiredCells: number;\n\n /** The number of columns in the table. */\n @Input() numCols = 7;\n\n /** The cell number of the active cell in the table. */\n @Input() activeCell = 0;\n\n /**\n * The aspect ratio (width / height) to use for the cells in the table. This aspect ratio will be\n * maintained even as the table resizes.\n */\n @Input() cellAspectRatio = 1;\n\n /** Emits when a new value is selected. */\n @Output() readonly selectedValueChange: EventEmitter<number> = new EventEmitter<number>();\n\n /** The number of blank cells to put at the beginning for the first row. */\n _firstRowOffset: number;\n\n /** Padding for the individual date cells. */\n _cellPadding: string;\n\n /** Width of an individual cell. */\n _cellWidth: string;\n\n constructor(private _elementRef: ElementRef<HTMLElement>, private _ngZone: NgZone) { }\n\n _cellClicked(cell: MatCalendarCell): void {\n if (cell.enabled) {\n this.selectedValueChange.emit(cell.value);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const columnChanges = changes['numCols'];\n const {rows, numCols} = this;\n\n if (changes['rows'] || columnChanges) {\n this._firstRowOffset = rows && rows.length && rows[0].length ? numCols - rows[0].length : 0;\n }\n\n if (changes['cellAspectRatio'] || columnChanges || !this._cellPadding) {\n this._cellPadding = `${50 * this.cellAspectRatio / numCols}%`;\n }\n\n if (columnChanges || !this._cellWidth) {\n this._cellWidth = `${100 / numCols}%`;\n }\n }\n\n _isActiveCell(rowIndex: number, colIndex: number): boolean {\n let cellNumber = rowIndex * this.numCols + colIndex;\n\n // Account for the fact that the first row may not have as many cells.\n if (rowIndex) {\n cellNumber -= this._firstRowOffset;\n }\n\n return cellNumber == this.activeCell;\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._ngZone.runOutsideAngular(() => {\n this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n const activeCell: HTMLElement | null =\n this._elementRef.nativeElement.querySelector('.mat-calendar-body-active');\n\n if (activeCell) {\n activeCell.focus();\n }\n });\n });\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n DOWN_ARROW,\n END,\n ENTER,\n HOME,\n LEFT_ARROW,\n PAGE_DOWN,\n PAGE_UP,\n RIGHT_ARROW,\n UP_ARROW,\n SPACE,\n} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Inject,\n Input,\n Optional,\n Output,\n ViewEncapsulation,\n ViewChild,\n} from '@angular/core';\nimport {DateAdapter, MAT_DATE_FORMATS, MatDateFormats} from '@angular/material/core';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {MatCalendarBody, MatCalendarCell, MatCalendarCellCssClasses} from './calendar-body';\nimport {createMissingDateImplError} from './datepicker-errors';\n\n\nconst DAYS_PER_WEEK = 7;\n\n\n/**\n * An internal component used to display a single month in the datepicker.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-month-view',\n templateUrl: 'month-view.html',\n exportAs: 'matMonthView',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatMonthView<D> implements AfterContentInit {\n /**\n * The date to display in this month view (everything other than the month and year is ignored).\n */\n @Input()\n get activeDate(): D { return this._activeDate; }\n set activeDate(value: D) {\n const oldActiveDate = this._activeDate;\n const validDate =\n this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n if (!this._hasSameMonthAndYear(oldActiveDate, this._activeDate)) {\n this._init();\n }\n }\n private _activeDate: D;\n\n /** The currently selected date. */\n @Input()\n get selected(): D | null { return this._selected; }\n set selected(value: D | null) {\n this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n this._selectedDate = this._getDateInCurrentMonth(this._selected);\n }\n private _selected: D | null;\n\n /** The minimum selectable date. */\n @Input()\n get minDate(): D | null { return this._minDate; }\n set minDate(value: D | null) {\n this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _minDate: D | null;\n\n /** The maximum selectable date. */\n @Input()\n get maxDate(): D | null { return this._maxDate; }\n set maxDate(value: D | null) {\n this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _maxDate: D | null;\n\n /** Function used to filter which dates are selectable. */\n @Input() dateFilter: (date: D) => boolean;\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => MatCalendarCellCssClasses;\n\n /** Emits when a new date is selected. */\n @Output() readonly selectedChange: EventEmitter<D | null> = new EventEmitter<D | null>();\n\n /** Emits when any date is selected. */\n @Output() readonly _userSelection: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emits when any date is activated. */\n @Output() readonly activeDateChange: EventEmitter<D> = new EventEmitter<D>();\n\n /** The body of calendar table */\n @ViewChild(MatCalendarBody, {static: false}) _matCalendarBody: MatCalendarBody;\n\n /** The label for this month (e.g. \"January 2017\"). */\n _monthLabel: string;\n\n /** Grid of calendar cells representing the dates of the month. */\n _weeks: MatCalendarCell[][];\n\n /** The number of blank cells in the first row before the 1st of the month. */\n _firstWeekOffset: number;\n\n /**\n * The date of the month that the currently selected Date falls on.\n * Null if the currently selected Date is in another month.\n */\n _selectedDate: number | null;\n\n /** The date of the month that today falls on. Null if today is in another month. */\n _todayDate: number | null;\n\n /** The names of the weekdays. */\n _weekdays: {long: string, narrow: string}[];\n\n constructor(private _changeDetectorRef: ChangeDetectorRef,\n @Optional() @Inject(MAT_DATE_FORMATS) private _dateFormats: MatDateFormats,\n @Optional() public _dateAdapter: DateAdapter<D>,\n @Optional() private _dir?: Directionality) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n\n const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();\n const narrowWeekdays = this._dateAdapter.getDayOfWeekNames('narrow');\n const longWeekdays = this._dateAdapter.getDayOfWeekNames('long');\n\n // Rotate the labels for days of the week based on the configured first day of the week.\n let weekdays = longWeekdays.map((long, i) => {\n return {long, narrow: narrowWeekdays[i]};\n });\n this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));\n\n this._activeDate = this._dateAdapter.today();\n }\n\n ngAfterContentInit() {\n this._init();\n }\n\n /** Handles when a new date is selected. */\n _dateSelected(date: number) {\n if (this._selectedDate != date) {\n const selectedYear = this._dateAdapter.getYear(this.activeDate);\n const selectedMonth = this._dateAdapter.getMonth(this.activeDate);\n const selectedDate = this._dateAdapter.createDate(selectedYear, selectedMonth, date);\n\n this.selectedChange.emit(selectedDate);\n }\n\n this._userSelection.emit();\n }\n\n /** Handles keydown events on the calendar body when calendar is in month view. */\n _handleCalendarBodyKeydown(event: KeyboardEvent): void {\n // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent\n // disabled ones from being selected. This may not be ideal, we should look into whether\n // navigation should skip over disabled dates, and if so, how to implement that efficiently.\n\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, -7);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, 7);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate,\n 1 - this._dateAdapter.getDate(this._activeDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate,\n (this._dateAdapter.getNumDaysInMonth(this._activeDate) -\n this._dateAdapter.getDate(this._activeDate)));\n break;\n case PAGE_UP:\n this.activeDate = event.altKey ?\n this._dateAdapter.addCalendarYears(this._activeDate, -1) :\n this._dateAdapter.addCalendarMonths(this._activeDate, -1);\n break;\n case PAGE_DOWN:\n this.activeDate = event.altKey ?\n this._dateAdapter.addCalendarYears(this._activeDate, 1) :\n this._dateAdapter.addCalendarMonths(this._activeDate, 1);\n break;\n case ENTER:\n case SPACE:\n if (!this.dateFilter || this.dateFilter(this._activeDate)) {\n this._dateSelected(this._dateAdapter.getDate(this._activeDate));\n this._userSelection.emit();\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n return;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n\n this._focusActiveCell();\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n\n /** Initializes this month view. */\n _init() {\n this._selectedDate = this._getDateInCurrentMonth(this.selected);\n this._todayDate = this._getDateInCurrentMonth(this._dateAdapter.today());\n this._monthLabel =\n this._dateAdapter.getMonthNames('short')[this._dateAdapter.getMonth(this.activeDate)]\n .toLocaleUpperCase();\n\n let firstOfMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),\n this._dateAdapter.getMonth(this.activeDate), 1);\n this._firstWeekOffset =\n (DAYS_PER_WEEK + this._dateAdapter.getDayOfWeek(firstOfMonth) -\n this._dateAdapter.getFirstDayOfWeek()) % DAYS_PER_WEEK;\n\n this._createWeekCells();\n this._changeDetectorRef.markForCheck();\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._matCalendarBody._focusActiveCell();\n }\n\n /** Creates MatCalendarCells for the dates in this month. */\n private _createWeekCells() {\n const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate);\n const dateNames = this._dateAdapter.getDateNames();\n this._weeks = [[]];\n for (let i = 0, cell = this._firstWeekOffset; i < daysInMonth; i++, cell++) {\n if (cell == DAYS_PER_WEEK) {\n this._weeks.push([]);\n cell = 0;\n }\n const date = this._dateAdapter.createDate(\n this._dateAdapter.getYear(this.activeDate),\n this._dateAdapter.getMonth(this.activeDate), i + 1);\n const enabled = this._shouldEnableDate(date);\n const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.dateA11yLabel);\n const cellClasses = this.dateClass ? this.dateClass(date) : undefined;\n\n this._weeks[this._weeks.length - 1]\n .push(new MatCalendarCell(i + 1, dateNames[i], ariaLabel, enabled, cellClasses));\n }\n }\n\n /** Date filter for the month */\n private _shouldEnableDate(date: D): boolean {\n return !!date &&\n (!this.dateFilter || this.dateFilter(date)) &&\n (!this.minDate || this._dateAdapter.compareDate(date, this.minDate) >= 0) &&\n (!this.maxDate || this._dateAdapter.compareDate(date, this.maxDate) <= 0);\n }\n\n /**\n * Gets the date in this month that the given Date falls on.\n * Returns null if the given Date is in another month.\n */\n private _getDateInCurrentMonth(date: D | null): number | null {\n return date && this._hasSameMonthAndYear(date, this.activeDate) ?\n this._dateAdapter.getDate(date) : null;\n }\n\n /** Checks whether the 2 dates are non-null and fall within the same month of the same year. */\n private _hasSameMonthAndYear(d1: D | null, d2: D | null): boolean {\n return !!(d1 && d2 && this._dateAdapter.getMonth(d1) == this._dateAdapter.getMonth(d2) &&\n this._dateAdapter.getYear(d1) == this._dateAdapter.getYear(d2));\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n\n /** Determines whether the user has the RTL layout direction. */\n private _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n DOWN_ARROW,\n END,\n ENTER,\n HOME,\n LEFT_ARROW,\n PAGE_DOWN,\n PAGE_UP,\n RIGHT_ARROW,\n UP_ARROW,\n SPACE,\n} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Inject,\n Input,\n Optional,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {DateAdapter, MAT_DATE_FORMATS, MatDateFormats} from '@angular/material/core';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {MatCalendarBody, MatCalendarCell} from './calendar-body';\nimport {createMissingDateImplError} from './datepicker-errors';\n\n/**\n * An internal component used to display a single year in the datepicker.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-year-view',\n templateUrl: 'year-view.html',\n exportAs: 'matYearView',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatYearView<D> implements AfterContentInit {\n /** The date to display in this year view (everything other than the year is ignored). */\n @Input()\n get activeDate(): D { return this._activeDate; }\n set activeDate(value: D) {\n let oldActiveDate = this._activeDate;\n const validDate =\n this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n if (this._dateAdapter.getYear(oldActiveDate) !== this._dateAdapter.getYear(this._activeDate)) {\n this._init();\n }\n }\n private _activeDate: D;\n\n /** The currently selected date. */\n @Input()\n get selected(): D | null { return this._selected; }\n set selected(value: D | null) {\n this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n this._selectedMonth = this._getMonthInCurrentYear(this._selected);\n }\n private _selected: D | null;\n\n /** The minimum selectable date. */\n @Input()\n get minDate(): D | null { return this._minDate; }\n set minDate(value: D | null) {\n this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _minDate: D | null;\n\n /** The maximum selectable date. */\n @Input()\n get maxDate(): D | null { return this._maxDate; }\n set maxDate(value: D | null) {\n this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n private _maxDate: D | null;\n\n /** A function used to filter which dates are selectable. */\n @Input() dateFilter: (date: D) => boolean;\n\n /** Emits when a new month is selected. */\n @Output() readonly selectedChange: EventEmitter<D> = new EventEmitter<D>();\n\n /** Emits the selected month. This doesn't imply a change on the selected date */\n @Output() readonly monthSelected: EventEmitter<D> = new EventEmitter<D>();\n\n /** Emits when any date is activated. */\n @Output() readonly activeDateChange: EventEmitter<D> = new EventEmitter<D>();\n\n /** The body of calendar table */\n @ViewChild(MatCalendarBody, {static: false}) _matCalendarBody: MatCalendarBody;\n\n /** Grid of calendar cells representing the months of the year. */\n _months: MatCalendarCell[][];\n\n /** The label for this year (e.g. \"2017\"). */\n _yearLabel: string;\n\n /** The month in this year that today falls on. Null if today is in a different year. */\n _todayMonth: number | null;\n\n /**\n * The month in this year that the selected Date falls on.\n * Null if the selected Date is in a different year.\n */\n _selectedMonth: number | null;\n\n constructor(private _changeDetectorRef: ChangeDetectorRef,\n @Optional() @Inject(MAT_DATE_FORMATS) private _dateFormats: MatDateFormats,\n @Optional() public _dateAdapter: DateAdapter<D>,\n @Optional() private _dir?: Directionality) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n\n this._activeDate = this._dateAdapter.today();\n }\n\n ngAfterContentInit() {\n this._init();\n }\n\n /** Handles when a new month is selected. */\n _monthSelected(month: number) {\n const normalizedDate =\n this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1);\n\n this.monthSelected.emit(normalizedDate);\n\n const daysInMonth = this._dateAdapter.getNumDaysInMonth(normalizedDate);\n\n this.selectedChange.emit(this._dateAdapter.createDate(\n this._dateAdapter.getYear(this.activeDate), month,\n Math.min(this._dateAdapter.getDate(this.activeDate), daysInMonth)));\n }\n\n /** Handles keydown events on the calendar body when calendar is in year view. */\n _handleCalendarBodyKeydown(event: KeyboardEvent): void {\n // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent\n // disabled ones from being selected. This may not be ideal, we should look into whether\n // navigation should skip over disabled dates, and if so, how to implement that efficiently.\n\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, -4);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, 4);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate,\n -this._dateAdapter.getMonth(this._activeDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate,\n 11 - this._dateAdapter.getMonth(this._activeDate));\n break;\n case PAGE_UP:\n this.activeDate =\n this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? -10 : -1);\n break;\n case PAGE_DOWN:\n this.activeDate =\n this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? 10 : 1);\n break;\n case ENTER:\n case SPACE:\n this._monthSelected(this._dateAdapter.getMonth(this._activeDate));\n break;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n\n this._focusActiveCell();\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n\n /** Initializes this year view. */\n _init() {\n this._selectedMonth = this._getMonthInCurrentYear(this.selected);\n this._todayMonth = this._getMonthInCurrentYear(this._dateAdapter.today());\n this._yearLabel = this._dateAdapter.getYearName(this.activeDate);\n\n let monthNames = this._dateAdapter.getMonthNames('short');\n // First row of months only contains 5 elements so we can fit the year label on the same row.\n this._months = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]].map(row => row.map(\n month => this._createCellForMonth(month, monthNames[month])));\n this._changeDetectorRef.markForCheck();\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._matCalendarBody._focusActiveCell();\n }\n\n /**\n * Gets the month in this year that the given Date falls on.\n * Returns null if the given Date is in another year.\n */\n private _getMonthInCurrentYear(date: D | null) {\n return date && this._dateAdapter.getYear(date) == this._dateAdapter.getYear(this.activeDate) ?\n this._dateAdapter.getMonth(date) : null;\n }\n\n /** Creates an MatCalendarCell for the given month. */\n private _createCellForMonth(month: number, monthName: string) {\n let ariaLabel = this._dateAdapter.format(\n this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1),\n this._dateFormats.display.monthYearA11yLabel);\n return new MatCalendarCell(\n month, monthName.toLocaleUpperCase(), ariaLabel, this._shouldEnableMonth(month));\n }\n\n /** Whether the given month is enabled. */\n private _shouldEnableMonth(month: number) {\n\n const activeYear = this._dateAdapter.getYear(this.activeDate);\n\n if (month === undefined || month === null ||\n this._isYearAndMonthAfterMaxDate(activeYear, month) ||\n this._isYearAndMonthBeforeMinDate(activeYear, month)) {\n return false;\n }\n\n if (!this.dateFilter) {\n return true;\n }\n\n const firstOfMonth = this._dateAdapter.createDate(activeYear, month, 1);\n\n // If any date in the month is enabled count the month as enabled.\n for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month;\n date = this._dateAdapter.addCalendarDays(date, 1)) {\n if (this.dateFilter(date)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Tests whether the combination month/year is after this.maxDate, considering\n * just the month and year of this.maxDate\n */\n private _isYearAndMonthAfterMaxDate(year: number, month: number) {\n if (this.maxDate) {\n const maxYear = this._dateAdapter.getYear(this.maxDate);\n const maxMonth = this._dateAdapter.getMonth(this.maxDate);\n\n return year > maxYear || (year === maxYear && month > maxMonth);\n }\n\n return false;\n }\n\n /**\n * Tests whether the combination month/year is before this.minDate, considering\n * just the month and year of this.minDate\n */\n private _isYearAndMonthBeforeMinDate(year: number, month: number) {\n if (this.minDate) {\n const minYear = this._dateAdapter.getYear(this.minDate);\n const minMonth = this._dateAdapter.getMonth(this.minDate);\n\n return year < minYear || (year === minYear && month < minMonth);\n }\n\n return false;\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;\n }\n\n /** Determines whether the user has the RTL layout direction. */\n private _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusKeyManager} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {BACKSPACE, END, HOME} from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n DoCheck,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Self,\n ViewEncapsulation,\n} from '@angular/core';\nimport {ControlValueAccessor, FormGroupDirective, NgControl, NgForm} from '@angular/forms';\nimport {\n CanUpdateErrorState,\n CanUpdateErrorStateCtor,\n ErrorStateMatcher,\n mixinErrorState,\n} from '@angular/material/core';\nimport {MatFormFieldControl} from '@angular/material/form-field';\nimport {merge, Observable, Subject, Subscription} from 'rxjs';\nimport {startWith, takeUntil} from 'rxjs/operators';\nimport {MatChip, MatChipEvent, MatChipSelectionChange} from './chip';\nimport {MatChipTextControl} from './chip-text-control';\n\n\n// Boilerplate for applying mixins to MatChipList.\n/** @docs-private */\nclass MatChipListBase {\n constructor(public _defaultErrorStateMatcher: ErrorStateMatcher,\n public _parentForm: NgForm,\n public _parentFormGroup: FormGroupDirective,\n /** @docs-private */\n public ngControl: NgControl) {}\n}\nconst _MatChipListMixinBase: CanUpdateErrorStateCtor & typeof MatChipListBase =\n mixinErrorState(MatChipListBase);\n\n\n// Increasing integer for generating unique ids for chip-list components.\nlet nextUniqueId = 0;\n\n/** Change event object that is emitted when the chip list value has changed. */\nexport class MatChipListChange {\n constructor(\n /** Chip list that emitted the event. */\n public source: MatChipList,\n /** Value of the chip list when the event was emitted. */\n public value: any) { }\n}\n\n\n/**\n * A material design chips component (named ChipList for its similarity to the List component).\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-chip-list',\n template: `<div class=\"mat-chip-list-wrapper\"><ng-content></ng-content></div>`,\n exportAs: 'matChipList',\n host: {\n '[attr.tabindex]': 'disabled ? null : _tabIndex',\n '[attr.aria-describedby]': '_ariaDescribedby || null',\n '[attr.aria-required]': 'required.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-multiselectable]': 'multiple',\n '[attr.role]': 'role',\n '[class.mat-chip-list-disabled]': 'disabled',\n '[class.mat-chip-list-invalid]': 'errorState',\n '[class.mat-chip-list-required]': 'required',\n '[attr.aria-orientation]': 'ariaOrientation',\n 'class': 'mat-chip-list',\n '(focus)': 'focus()',\n '(blur)': '_blur()',\n '(keydown)': '_keydown($event)',\n '[id]': '_uid',\n },\n providers: [{provide: MatFormFieldControl, useExisting: MatChipList}],\n styleUrls: ['chips.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatChipList extends _MatChipListMixinBase implements MatFormFieldControl<any>,\n ControlValueAccessor, AfterContentInit, DoCheck, OnInit, OnDestroy, CanUpdateErrorState {\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n readonly controlType: string = 'mat-chip-list';\n\n /**\n * When a chip is destroyed, we store the index of the destroyed chip until the chips\n * query list notifies about the update. This is necessary because we cannot determine an\n * appropriate chip that should receive focus until the array of chips updated completely.\n */\n private _lastDestroyedChipIndex: number | null = null;\n\n /** Subject that emits when the component has been destroyed. */\n private _destroyed = new Subject<void>();\n\n /** Subscription to focus changes in the chips. */\n private _chipFocusSubscription: Subscription | null;\n\n /** Subscription to blur changes in the chips. */\n private _chipBlurSubscription: Subscription | null;\n\n /** Subscription to selection changes in chips. */\n private _chipSelectionSubscription: Subscription | null;\n\n /** Subscription to remove changes in chips. */\n private _chipRemoveSubscription: Subscription | null;\n\n /** The chip input to add more chips */\n protected _chipInput: MatChipTextControl;\n\n /** Uid of the chip list */\n _uid: string = `mat-chip-list-${nextUniqueId++}`;\n\n /** The aria-describedby attribute on the chip list for improved a11y. */\n _ariaDescribedby: string;\n\n /** Tab index for the chip list. */\n _tabIndex = 0;\n\n /**\n * User defined tab index.\n * When it is not null, use user defined tab index. Otherwise use _tabIndex\n */\n _userTabIndex: number | null = null;\n\n /** The FocusKeyManager which handles focus. */\n _keyManager: FocusKeyManager<MatChip>;\n\n /** Function when touched */\n _onTouched = () => {};\n\n /** Function when changed */\n _onChange: (value: any) => void = () => {};\n\n _selectionModel: SelectionModel<MatChip>;\n\n /** The array of selected chips inside chip list. */\n get selected(): MatChip[] | MatChip {\n return this.multiple ? this._selectionModel.selected : this._selectionModel.selected[0];\n }\n\n /** The ARIA role applied to the chip list. */\n get role(): string | null { return this.empty ? null : 'listbox'; }\n\n /** An object used to control when error messages are shown. */\n @Input() errorStateMatcher: ErrorStateMatcher;\n\n /** Whether the user should be allowed to select multiple chips. */\n @Input()\n get multiple(): boolean { return this._multiple; }\n set multiple(value: boolean) {\n this._multiple = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n private _multiple: boolean = false;\n\n /**\n * A function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n @Input()\n get compareWith(): (o1: any, o2: any) => boolean { return this._compareWith; }\n set compareWith(fn: (o1: any, o2: any) => boolean) {\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n private _compareWith = (o1: any, o2: any) => o1 === o2;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get value(): any { return this._value; }\n set value(value: any) {\n this.writeValue(value);\n this._value = value;\n }\n protected _value: any;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get id(): string {\n return this._chipInput ? this._chipInput.id : this._uid;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n protected _required: boolean = false;\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get placeholder(): string {\n return this._chipInput ? this._chipInput.placeholder : this._placeholder;\n }\n set placeholder(value: string) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n protected _placeholder: string;\n\n /** Whether any chips or the matChipInput inside of this chip-list has focus. */\n get focused(): boolean {\n return (this._chipInput && this._chipInput.focused) || this._hasFocusedChip();\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get empty(): boolean {\n return (!this._chipInput || this._chipInput.empty) && this.chips.length === 0;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat(): boolean { return !this.empty || this.focused; }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n @Input()\n get disabled(): boolean { return this.ngControl ? !!this.ngControl.disabled : this._disabled; }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n protected _disabled: boolean = false;\n\n /** Orientation of the chip list. */\n @Input('aria-orientation') ariaOrientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Whether or not this chip list is selectable. When a chip list is not selectable,\n * the selected states for all the chips inside the chip list are always ignored.\n */\n @Input()\n get selectable(): boolean { return this._selectable; }\n set selectable(value: boolean) {\n this._selectable = coerceBooleanProperty(value);\n\n if (this.chips) {\n this.chips.forEach(chip => chip.chipListSelectable = this._selectable);\n }\n }\n protected _selectable: boolean = true;\n\n @Input()\n set tabIndex(value: number) {\n this._userTabIndex = value;\n this._tabIndex = value;\n }\n\n /** Combined stream of all of the child chips' selection change events. */\n get chipSelectionChanges(): Observable<MatChipSelectionChange> {\n return merge(...this.chips.map(chip => chip.selectionChange));\n }\n\n /** Combined stream of all of the child chips' focus change events. */\n get chipFocusChanges(): Observable<MatChipEvent> {\n return merge(...this.chips.map(chip => chip._onFocus));\n }\n\n /** Combined stream of all of the child chips' blur change events. */\n get chipBlurChanges(): Observable<MatChipEvent> {\n return merge(...this.chips.map(chip => chip._onBlur));\n }\n\n /** Combined stream of all of the child chips' remove change events. */\n get chipRemoveChanges(): Observable<MatChipEvent> {\n return merge(...this.chips.map(chip => chip.destroyed));\n }\n\n /** Event emitted when the selected chip list value has been changed by the user. */\n @Output() readonly change: EventEmitter<MatChipListChange> =\n new EventEmitter<MatChipListChange>();\n\n /**\n * Event that emits whenever the raw value of the chip-list changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n @Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();\n\n /** The chip components contained within this chip list. */\n @ContentChildren(MatChip, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }) chips: QueryList<MatChip>;\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n private _changeDetectorRef: ChangeDetectorRef,\n @Optional() private _dir: Directionality,\n @Optional() _parentForm: NgForm,\n @Optional() _parentFormGroup: FormGroupDirective,\n _defaultErrorStateMatcher: ErrorStateMatcher,\n /** @docs-private */\n @Optional() @Self() public ngControl: NgControl) {\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n ngAfterContentInit() {\n this._keyManager = new FocusKeyManager<MatChip>(this.chips)\n .withWrap()\n .withVerticalOrientation()\n .withHorizontalOrientation(this._dir ? this._dir.value : 'ltr');\n\n if (this._dir) {\n this._dir.change\n .pipe(takeUntil(this._destroyed))\n .subscribe(dir => this._keyManager.withHorizontalOrientation(dir));\n }\n\n this._keyManager.tabOut.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._allowFocusEscape();\n });\n\n // When the list changes, re-subscribe\n this.chips.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {\n if (this.disabled) {\n // Since this happens after the content has been\n // checked, we need to defer it to the next tick.\n Promise.resolve().then(() => {\n this._syncChipsState();\n });\n }\n\n this._resetChips();\n\n // Reset chips selected/deselected status\n this._initializeSelection();\n\n // Check to see if we need to update our tab index\n this._updateTabIndex();\n\n // Check to see if we have a destroyed chip and need to refocus\n this._updateFocusForDestroyedChips();\n\n this.stateChanges.next();\n });\n }\n\n ngOnInit() {\n this._selectionModel = new SelectionModel<MatChip>(this.multiple, undefined, false);\n this.stateChanges.next();\n }\n\n ngDoCheck() {\n if (this.ngControl) {\n // We need to re-evaluate this on every change detection cycle, because there are some\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\n this.updateErrorState();\n }\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this.stateChanges.complete();\n\n this._dropSubscriptions();\n }\n\n\n /** Associates an HTML input element with this chip list. */\n registerInput(inputElement: MatChipTextControl): void {\n this._chipInput = inputElement;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids: string[]) { this._ariaDescribedby = ids.join(' '); }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any): void {\n if (this.chips) {\n this._setSelectionByValue(value, false);\n }\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void): void {\n this._onChange = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.stateChanges.next();\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick(event: MouseEvent) {\n if (!this._originatesFromChip(event)) {\n this.focus();\n }\n }\n\n /**\n * Focuses the first non-disabled chip in this chip list, or the associated input when there\n * are no eligible chips.\n */\n focus(): void {\n if (this.disabled) {\n return;\n }\n\n // TODO: ARIA says this should focus the first `selected` chip if any are selected.\n // Focus on first element if there's no chipInput inside chip-list\n if (this._chipInput && this._chipInput.focused) {\n // do nothing\n } else if (this.chips.length > 0) {\n this._keyManager.setFirstItemActive();\n this.stateChanges.next();\n } else {\n this._focusInput();\n this.stateChanges.next();\n }\n }\n\n /** Attempt to focus an input if we have one. */\n _focusInput() {\n if (this._chipInput) {\n this._chipInput.focus();\n }\n }\n\n /**\n * Pass events to the keyboard manager. Available here for tests.\n */\n _keydown(event: KeyboardEvent) {\n const target = event.target as HTMLElement;\n\n // If they are on an empty input and hit backspace, focus the last chip\n if (event.keyCode === BACKSPACE && this._isInputEmpty(target)) {\n this._keyManager.setLastItemActive();\n event.preventDefault();\n } else if (target && target.classList.contains('mat-chip')) {\n if (event.keyCode === HOME) {\n this._keyManager.setFirstItemActive();\n event.preventDefault();\n } else if (event.keyCode === END) {\n this._keyManager.setLastItemActive();\n event.preventDefault();\n } else {\n this._keyManager.onKeydown(event);\n }\n\n this.stateChanges.next();\n }\n }\n\n\n /**\n * Check the tab index as you should not be allowed to focus an empty list.\n */\n protected _updateTabIndex(): void {\n // If we have 0 chips, we should not allow keyboard focus\n this._tabIndex = this._userTabIndex || (this.chips.length === 0 ? -1 : 0);\n }\n\n /**\n * If the amount of chips changed, we need to update the\n * key manager state and focus the next closest chip.\n */\n protected _updateFocusForDestroyedChips() {\n // Move focus to the closest chip. If no other chips remain, focus the chip-list itself.\n if (this._lastDestroyedChipIndex != null) {\n if (this.chips.length) {\n const newChipIndex = Math.min(this._lastDestroyedChipIndex, this.chips.length - 1);\n this._keyManager.setActiveItem(newChipIndex);\n } else {\n this.focus();\n }\n }\n\n this._lastDestroyedChipIndex = null;\n }\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 private _isValidIndex(index: number): boolean {\n return index >= 0 && index < this.chips.length;\n }\n\n private _isInputEmpty(element: HTMLElement): boolean {\n if (element && element.nodeName.toLowerCase() === 'input') {\n let input = element as HTMLInputElement;\n return !input.value;\n }\n\n return false;\n }\n\n _setSelectionByValue(value: any, isUserInput: boolean = true) {\n this._clearSelection();\n this.chips.forEach(chip => chip.deselect());\n\n if (Array.isArray(value)) {\n value.forEach(currentValue => this._selectValue(currentValue, isUserInput));\n this._sortValues();\n } else {\n const correspondingChip = this._selectValue(value, isUserInput);\n\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what chip the user interacted with last.\n if (correspondingChip) {\n if (isUserInput) {\n this._keyManager.setActiveItem(correspondingChip);\n }\n }\n }\n }\n\n /**\n * Finds and selects the chip based on its value.\n * @returns Chip that has the corresponding value.\n */\n private _selectValue(value: any, isUserInput: boolean = true): MatChip | undefined {\n\n const correspondingChip = this.chips.find(chip => {\n return chip.value != null && this._compareWith(chip.value, value);\n });\n\n if (correspondingChip) {\n isUserInput ? correspondingChip.selectViaInteraction() : correspondingChip.select();\n this._selectionModel.select(correspondingChip);\n }\n\n return correspondingChip;\n }\n\n private _initializeSelection(): void {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n if (this.ngControl || this._value) {\n this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value, false);\n this.stateChanges.next();\n }\n });\n }\n\n /**\n * Deselects every chip in the list.\n * @param skip Chip that should not be deselected.\n */\n private _clearSelection(skip?: MatChip): void {\n this._selectionModel.clear();\n this.chips.forEach(chip => {\n if (chip !== skip) {\n chip.deselect();\n }\n });\n this.stateChanges.next();\n }\n\n /**\n * Sorts the model values, ensuring that they keep the same\n * order that they have in the panel.\n */\n private _sortValues(): void {\n if (this._multiple) {\n this._selectionModel.clear();\n\n this.chips.forEach(chip => {\n if (chip.selected) {\n this._selectionModel.select(chip);\n }\n });\n this.stateChanges.next();\n }\n }\n\n /** Emits change event to set the model value. */\n private _propagateChanges(fallbackValue?: any): void {\n let valueToEmit: any = null;\n\n if (Array.isArray(this.selected)) {\n valueToEmit = this.selected.map(chip => chip.value);\n } else {\n valueToEmit = this.selected ? this.selected.value : fallbackValue;\n }\n this._value = valueToEmit;\n this.change.emit(new MatChipListChange(this, valueToEmit));\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this._changeDetectorRef.markForCheck();\n }\n\n /** When blurred, mark the field as touched when focus moved outside the chip list. */\n _blur() {\n if (!this._hasFocusedChip()) {\n this._keyManager.setActiveItem(-1);\n }\n\n if (!this.disabled) {\n if (this._chipInput) {\n // If there's a chip input, we should check whether the focus moved to chip input.\n // If the focus is not moved to chip input, mark the field as touched. If the focus moved\n // to chip input, do nothing.\n // Timeout is needed to wait for the focus() event trigger on chip input.\n setTimeout(() => {\n if (!this.focused) {\n this._markAsTouched();\n }\n });\n } else {\n // If there's no chip input, then mark the field as touched.\n this._markAsTouched();\n }\n }\n }\n\n /** Mark the field as touched */\n _markAsTouched() {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n\n /**\n * Removes the `tabindex` from the chip list and resets it back afterwards, allowing the\n * user to tab out of it. This prevents the list from capturing focus and redirecting\n * it back to the first chip, creating a focus trap, if it user tries to tab away.\n */\n _allowFocusEscape() {\n if (this._tabIndex !== -1) {\n this._tabIndex = -1;\n\n setTimeout(() => {\n this._tabIndex = this._userTabIndex || 0;\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n private _resetChips() {\n this._dropSubscriptions();\n this._listenToChipsFocus();\n this._listenToChipsSelection();\n this._listenToChipsRemoved();\n }\n\n private _dropSubscriptions() {\n if (this._chipFocusSubscription) {\n this._chipFocusSubscription.unsubscribe();\n this._chipFocusSubscription = null;\n }\n\n if (this._chipBlurSubscription) {\n this._chipBlurSubscription.unsubscribe();\n this._chipBlurSubscription = null;\n }\n\n if (this._chipSelectionSubscription) {\n this._chipSelectionSubscription.unsubscribe();\n this._chipSelectionSubscription = null;\n }\n\n if (this._chipRemoveSubscription) {\n this._chipRemoveSubscription.unsubscribe();\n this._chipRemoveSubscription = null;\n }\n }\n\n /** Listens to user-generated selection events on each chip. */\n private _listenToChipsSelection(): void {\n this._chipSelectionSubscription = this.chipSelectionChanges.subscribe(event => {\n event.source.selected\n ? this._selectionModel.select(event.source)\n : this._selectionModel.deselect(event.source);\n\n // For single selection chip list, make sure the deselected value is unselected.\n if (!this.multiple) {\n this.chips.forEach(chip => {\n if (!this._selectionModel.isSelected(chip) && chip.selected) {\n chip.deselect();\n }\n });\n }\n\n if (event.isUserInput) {\n this._propagateChanges();\n }\n });\n }\n\n /** Listens to user-generated selection events on each chip. */\n private _listenToChipsFocus(): void {\n this._chipFocusSubscription = this.chipFocusChanges.subscribe(event => {\n let chipIndex: number = this.chips.toArray().indexOf(event.chip);\n\n if (this._isValidIndex(chipIndex)) {\n this._keyManager.updateActiveItemIndex(chipIndex);\n }\n this.stateChanges.next();\n });\n\n this._chipBlurSubscription = this.chipBlurChanges.subscribe(() => {\n this._blur();\n this.stateChanges.next();\n });\n }\n\n private _listenToChipsRemoved(): void {\n this._chipRemoveSubscription = this.chipRemoveChanges.subscribe(event => {\n const chip = event.chip;\n const chipIndex = this.chips.toArray().indexOf(event.chip);\n\n // In case the chip that will be removed is currently focused, we temporarily store\n // the index in order to be able to determine an appropriate sibling chip that will\n // receive focus.\n if (this._isValidIndex(chipIndex) && chip._hasFocus) {\n this._lastDestroyedChipIndex = chipIndex;\n }\n });\n }\n\n /** Checks whether an event comes from inside a chip element. */\n private _originatesFromChip(event: Event): boolean {\n let currentElement = event.target as HTMLElement | null;\n\n while (currentElement && currentElement !== this._elementRef.nativeElement) {\n if (currentElement.classList.contains('mat-chip')) {\n return true;\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n }\n\n /** Checks whether any of the chips is focused. */\n private _hasFocusedChip() {\n return this.chips.some(chip => chip._hasFocus);\n }\n\n /** Syncs the list's state with the individual chips. */\n private _syncChipsState() {\n if (this.chips) {\n this.chips.forEach(chip => {\n chip.disabled = this._disabled;\n chip._chipListMultiple = this.multiple;\n });\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {Directive, ElementRef, EventEmitter, Inject, Input, OnChanges, Output} from '@angular/core';\nimport {hasModifierKey, TAB} from '@angular/cdk/keycodes';\nimport {MAT_CHIPS_DEFAULT_OPTIONS, MatChipsDefaultOptions} from './chip-default-options';\nimport {MatChipList} from './chip-list';\nimport {MatChipTextControl} from './chip-text-control';\n\n\n/** Represents an input event on a `matChipInput`. */\nexport interface MatChipInputEvent {\n /** The native `<input>` element that the event is being fired for. */\n input: HTMLInputElement;\n\n /** The value of the input. */\n value: string;\n}\n\n// Increasing integer for generating unique ids.\nlet nextUniqueId = 0;\n\n/**\n * Directive that adds chip-specific behaviors to an input element inside `<mat-form-field>`.\n * May be placed inside or outside of an `<mat-chip-list>`.\n */\n@Directive({\n selector: 'input[matChipInputFor]',\n exportAs: 'matChipInput, matChipInputFor',\n host: {\n 'class': 'mat-chip-input mat-input-element',\n '(keydown)': '_keydown($event)',\n '(blur)': '_blur()',\n '(focus)': '_focus()',\n '(input)': '_onInput()',\n '[id]': 'id',\n '[attr.disabled]': 'disabled || null',\n '[attr.placeholder]': 'placeholder || null',\n '[attr.aria-invalid]': '_chipList && _chipList.ngControl ? _chipList.ngControl.invalid : null',\n }\n})\nexport class MatChipInput implements MatChipTextControl, OnChanges {\n /** Whether the control is focused. */\n focused: boolean = false;\n _chipList: MatChipList;\n\n /** Register input for chip list */\n @Input('matChipInputFor')\n set chipList(value: MatChipList) {\n if (value) {\n this._chipList = value;\n this._chipList.registerInput(this);\n }\n }\n\n /**\n * Whether or not the chipEnd event will be emitted when the input is blurred.\n */\n @Input('matChipInputAddOnBlur')\n get addOnBlur(): boolean { return this._addOnBlur; }\n set addOnBlur(value: boolean) { this._addOnBlur = coerceBooleanProperty(value); }\n _addOnBlur: boolean = false;\n\n /**\n * The list of key codes that will trigger a chipEnd event.\n *\n * Defaults to `[ENTER]`.\n */\n @Input('matChipInputSeparatorKeyCodes')\n separatorKeyCodes: number[] | Set<number> = this._defaultOptions.separatorKeyCodes;\n\n /** Emitted when a chip is to be added. */\n @Output('matChipInputTokenEnd')\n chipEnd: EventEmitter<MatChipInputEvent> = new EventEmitter<MatChipInputEvent>();\n\n /** The input's placeholder text. */\n @Input() placeholder: string = '';\n\n /** Unique id for the input. */\n @Input() id: string = `mat-chip-list-input-${nextUniqueId++}`;\n\n /** Whether the input is disabled. */\n @Input()\n get disabled(): boolean { return this._disabled || (this._chipList && this._chipList.disabled); }\n set disabled(value: boolean) { this._disabled = coerceBooleanProperty(value); }\n private _disabled: boolean = false;\n\n /** Whether the input is empty. */\n get empty(): boolean { return !this._inputElement.value; }\n\n /** The native input element to which this directive is attached. */\n protected _inputElement: HTMLInputElement;\n\n constructor(\n protected _elementRef: ElementRef<HTMLInputElement>,\n @Inject(MAT_CHIPS_DEFAULT_OPTIONS) private _defaultOptions: MatChipsDefaultOptions) {\n this._inputElement = this._elementRef.nativeElement as HTMLInputElement;\n }\n\n ngOnChanges() {\n this._chipList.stateChanges.next();\n }\n\n /** Utility method to make host definition/tests more clear. */\n _keydown(event?: KeyboardEvent) {\n // Allow the user's focus to escape when they're tabbing forward. Note that we don't\n // want to do this when going backwards, because focus should go back to the first chip.\n if (event && event.keyCode === TAB && !hasModifierKey(event, 'shiftKey')) {\n this._chipList._allowFocusEscape();\n }\n\n this._emitChipEnd(event);\n }\n\n /** Checks to see if the blur should emit the (chipEnd) event. */\n _blur() {\n if (this.addOnBlur) {\n this._emitChipEnd();\n }\n this.focused = false;\n // Blur the chip list if it is not focused\n if (!this._chipList.focused) {\n this._chipList._blur();\n }\n this._chipList.stateChanges.next();\n }\n\n _focus() {\n this.focused = true;\n this._chipList.stateChanges.next();\n }\n\n /** Checks to see if the (chipEnd) event needs to be emitted. */\n _emitChipEnd(event?: KeyboardEvent) {\n if (!this._inputElement.value && !!event) {\n this._chipList._keydown(event);\n }\n if (!event || this._isSeparatorKey(event)) {\n this.chipEnd.emit({ input: this._inputElement, value: this._inputElement.value });\n\n if (event) {\n event.preventDefault();\n }\n }\n }\n\n _onInput() {\n // Let chip list know whenever the value changes.\n this._chipList.stateChanges.next();\n }\n\n /** Focuses the input. */\n focus(): void {\n this._inputElement.focus();\n }\n\n /** Checks whether a keycode is one of the configured separators. */\n private _isSeparatorKey(event: KeyboardEvent) {\n if (hasModifierKey(event)) {\n return false;\n }\n\n const separators = this.separatorKeyCodes;\n const keyCode = event.keyCode;\n return Array.isArray(separators) ? separators.indexOf(keyCode) > -1 : separators.has(keyCode);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ENTER} from '@angular/cdk/keycodes';\nimport {NgModule} from '@angular/core';\nimport {ErrorStateMatcher} from '@angular/material/core';\nimport {MatChip, MatChipAvatar, MatChipRemove, MatChipTrailingIcon} from './chip';\nimport {MAT_CHIPS_DEFAULT_OPTIONS, MatChipsDefaultOptions} from './chip-default-options';\nimport {MatChipInput} from './chip-input';\nimport {MatChipList} from './chip-list';\n\nconst CHIP_DECLARATIONS = [\n MatChipList,\n MatChip,\n MatChipInput,\n MatChipRemove,\n MatChipAvatar,\n MatChipTrailingIcon,\n];\n\n@NgModule({\n exports: CHIP_DECLARATIONS,\n declarations: CHIP_DECLARATIONS,\n providers: [\n ErrorStateMatcher,\n {\n provide: MAT_CHIPS_DEFAULT_OPTIONS,\n useValue: {\n separatorKeyCodes: [ENTER]\n } as MatChipsDefaultOptions\n }\n ]\n})\nexport class MatChipsModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ViewContainerRef} from '@angular/core';\nimport {Direction} from '@angular/cdk/bidi';\nimport {ScrollStrategy} from '@angular/cdk/overlay';\n\n/** Valid ARIA roles for a dialog element. */\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** Possible overrides for a dialog's position. */\nexport interface DialogPosition {\n /** Override for the dialog's top position. */\n top?: string;\n\n /** Override for the dialog's bottom position. */\n bottom?: string;\n\n /** Override for the dialog's left position. */\n left?: string;\n\n /** Override for the dialog's right position. */\n right?: string;\n}\n\n/**\n * Configuration for opening a modal dialog with the MatDialog service.\n */\nexport class MatDialogConfig<D = any> {\n\n /**\n * Where the attached component should live in Angular's *logical* component tree.\n * This affects what is available for injection and the change detection order for the\n * component instantiated inside of the dialog. This does not affect where the dialog\n * content will be rendered.\n */\n viewContainerRef?: ViewContainerRef;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The ARIA role of the dialog element. */\n role?: DialogRole = 'dialog';\n\n /** Custom class for the overlay pane. */\n panelClass?: string | string[] = '';\n\n /** Whether the dialog has a backdrop. */\n hasBackdrop?: boolean = true;\n\n /** Custom class for the backdrop, */\n backdropClass?: string = '';\n\n /** Whether the user can use escape or clicking on the backdrop to close the modal. */\n disableClose?: boolean = false;\n\n /** Width of the dialog. */\n width?: string = '';\n\n /** Height of the dialog. */\n height?: string = '';\n\n /** Min-width of the dialog. If a number is provided, pixel units are assumed. */\n minWidth?: number | string;\n\n /** Min-height of the dialog. If a number is provided, pixel units are assumed. */\n minHeight?: number | string;\n\n /** Max-width of the dialog. If a number is provided, pixel units are assumed. Defaults to 80vw */\n maxWidth?: number | string = '80vw';\n\n /** Max-height of the dialog. If a number is provided, pixel units are assumed. */\n maxHeight?: number | string;\n\n /** Position overrides. */\n position?: DialogPosition;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n /** Layout direction for the dialog's content. */\n direction?: Direction;\n\n /** ID of the element that describes the dialog. */\n ariaDescribedBy?: string | null = null;\n\n /** ID of the element that labels the dialog. */\n ariaLabelledBy?: string | null = null;\n\n /** Aria label to assign to the dialog element */\n ariaLabel?: string | null = null;\n\n /** Whether the dialog should focus the first focusable element on open. */\n autoFocus?: boolean = true;\n\n /**\n * Whether the dialog should restore focus to the\n * previously-focused element, after it's closed.\n */\n restoreFocus?: boolean = true;\n\n /** Scroll strategy to be used for the dialog. */\n scrollStrategy?: ScrollStrategy;\n\n /**\n * Whether the dialog should close when the user goes backwards/forwards in history.\n * Note that this usually doesn't include clicking on links (unless the user is using\n * the `HashLocationStrategy`).\n */\n closeOnNavigation?: boolean = true;\n\n // TODO(jelbourn): add configuration for lifecycle hooks, ARIA labelling.\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\nconst animationBody = [\n // Note: The `enter` animation transitions to `transform: none`, because for some reason\n // specifying the transform explicitly, causes IE both to blur the dialog content and\n // decimate the animation performance. Leaving it as `none` solves both issues.\n state('void, exit', style({opacity: 0, transform: 'scale(0.7)'})),\n state('enter', style({transform: 'none'})),\n transition('* => enter', animate('150ms cubic-bezier(0, 0, 0.2, 1)',\n style({transform: 'none', opacity: 1}))),\n transition('* => void, * => exit',\n animate('75ms cubic-bezier(0.4, 0.0, 0.2, 1)', style({opacity: 0}))),\n];\n\n/**\n * Animations used by MatDialog.\n * @docs-private\n */\nexport const matDialogAnimations: {\n readonly dialogContainer: AnimationTriggerMetadata;\n readonly slideDialog: AnimationTriggerMetadata;\n} = {\n /** Animation that is applied on the dialog container by defalt. */\n dialogContainer: trigger('dialogContainer', animationBody),\n\n /** @deprecated @breaking-change 8.0.0 Use `matDialogAnimations.dialogContainer` instead. */\n slideDialog: trigger('slideDialog', animationBody)\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n EventEmitter,\n Inject,\n Optional,\n ChangeDetectorRef,\n ViewChild,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {AnimationEvent} from '@angular/animations';\nimport {matDialogAnimations} from './dialog-animations';\nimport {\n BasePortalOutlet,\n ComponentPortal,\n CdkPortalOutlet,\n TemplatePortal\n} from '@angular/cdk/portal';\nimport {FocusTrap, FocusTrapFactory} from '@angular/cdk/a11y';\nimport {MatDialogConfig} from './dialog-config';\n\n\n/**\n * Throws an exception for the case when a ComponentPortal is\n * attached to a DomPortalOutlet without an origin.\n * @docs-private\n */\nexport function throwMatDialogContentAlreadyAttachedError() {\n throw Error('Attempting to attach dialog content after content is already attached');\n}\n\n/**\n * Internal component that wraps user-provided dialog content.\n * Animation is based on https://material.io/guidelines/motion/choreography.html.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-dialog-container',\n templateUrl: 'dialog-container.html',\n styleUrls: ['dialog.css'],\n encapsulation: ViewEncapsulation.None,\n // Using OnPush for dialogs caused some G3 sync issues. Disabled until we can track them down.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n animations: [matDialogAnimations.dialogContainer],\n host: {\n 'class': 'mat-dialog-container',\n 'tabindex': '-1',\n 'aria-modal': 'true',\n '[attr.id]': '_id',\n '[attr.role]': '_config.role',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledBy',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': '_config.ariaDescribedBy || null',\n '[@dialogContainer]': '_state',\n '(@dialogContainer.start)': '_onAnimationStart($event)',\n '(@dialogContainer.done)': '_onAnimationDone($event)',\n },\n})\nexport class MatDialogContainer extends BasePortalOutlet {\n /** The portal outlet inside of this container into which the dialog content will be loaded. */\n @ViewChild(CdkPortalOutlet, {static: true}) _portalOutlet: CdkPortalOutlet;\n\n /** The class that traps and manages focus within the dialog. */\n private _focusTrap: FocusTrap;\n\n /** Element that was focused before the dialog was opened. Save this to restore upon close. */\n private _elementFocusedBeforeDialogWasOpened: HTMLElement | null = null;\n\n /** State of the dialog animation. */\n _state: 'void' | 'enter' | 'exit' = 'enter';\n\n /** Emits when an animation state changes. */\n _animationStateChanged = new EventEmitter<AnimationEvent>();\n\n /** ID of the element that should be considered as the dialog's label. */\n _ariaLabelledBy: string | null;\n\n /** ID for the container DOM element. */\n _id: string;\n\n constructor(\n private _elementRef: ElementRef,\n private _focusTrapFactory: FocusTrapFactory,\n private _changeDetectorRef: ChangeDetectorRef,\n @Optional() @Inject(DOCUMENT) private _document: any,\n /** The dialog configuration. */\n public _config: MatDialogConfig) {\n\n super();\n this._ariaLabelledBy = _config.ariaLabelledBy || null;\n }\n\n /**\n * Attach a ComponentPortal as content to this dialog container.\n * @param portal Portal to be attached as the dialog content.\n */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n if (this._portalOutlet.hasAttached()) {\n throwMatDialogContentAlreadyAttachedError();\n }\n\n this._savePreviouslyFocusedElement();\n return this._portalOutlet.attachComponentPortal(portal);\n }\n\n /**\n * Attach a TemplatePortal as content to this dialog container.\n * @param portal Portal to be attached as the dialog content.\n */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n if (this._portalOutlet.hasAttached()) {\n throwMatDialogContentAlreadyAttachedError();\n }\n\n this._savePreviouslyFocusedElement();\n return this._portalOutlet.attachTemplatePortal(portal);\n }\n\n /** Moves the focus inside the focus trap. */\n private _trapFocus() {\n const element = this._elementRef.nativeElement;\n\n if (!this._focusTrap) {\n this._focusTrap = this._focusTrapFactory.create(element);\n }\n\n // If we 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 if (this._config.autoFocus) {\n this._focusTrap.focusInitialElementWhenReady();\n } else {\n const activeElement = this._document.activeElement;\n\n // Otherwise ensure that focus is on the dialog container. It's possible that a different\n // component tried to move focus while the open animation was running. See:\n // https://github.com/angular/components/issues/16215. Note that we only want to do this\n // if the focus isn't inside the dialog already, because it's possible that the consumer\n // turned off `autoFocus` in order to move focus themselves.\n if (activeElement !== element && !element.contains(activeElement)) {\n element.focus();\n }\n }\n }\n\n /** Restores focus to the element that was focused before the dialog opened. */\n private _restoreFocus() {\n const toFocus = this._elementFocusedBeforeDialogWasOpened;\n\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\n if (this._config.restoreFocus && toFocus && typeof toFocus.focus === 'function') {\n toFocus.focus();\n }\n\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n }\n\n /** Saves a reference to the element that was focused before the dialog was opened. */\n private _savePreviouslyFocusedElement() {\n if (this._document) {\n this._elementFocusedBeforeDialogWasOpened = this._document.activeElement as HTMLElement;\n\n // Note that there is no focus method when rendering on the server.\n if (this._elementRef.nativeElement.focus) {\n // Move focus onto the dialog immediately in order to prevent the user from accidentally\n // opening multiple dialogs at the same time. Needs to be async, because the element\n // may not be focusable immediately.\n Promise.resolve().then(() => this._elementRef.nativeElement.focus());\n }\n }\n }\n\n /** Callback, invoked whenever an animation on the host completes. */\n _onAnimationDone(event: AnimationEvent) {\n if (event.toState === 'enter') {\n this._trapFocus();\n } else if (event.toState === 'exit') {\n this._restoreFocus();\n }\n\n this._animationStateChanged.emit(event);\n }\n\n /** Callback, invoked when an animation on the host starts. */\n _onAnimationStart(event: AnimationEvent) {\n this._animationStateChanged.emit(event);\n }\n\n /** Starts the dialog exit animation. */\n _startExitAnimation(): void {\n this._state = 'exit';\n\n // Mark the container for check so it can react if the\n // view container is using OnPush change detection.\n this._changeDetectorRef.markForCheck();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {GlobalPositionStrategy, OverlayRef} from '@angular/cdk/overlay';\nimport {Location} from '@angular/common';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, take} from 'rxjs/operators';\nimport {DialogPosition} from './dialog-config';\nimport {MatDialogContainer} from './dialog-container';\n\n\n// TODO(jelbourn): resizing\n\n// Counter for unique dialog ids.\nlet uniqueId = 0;\n\n/**\n * Reference to a dialog opened via the MatDialog service.\n */\nexport class MatDialogRef<T, R = any> {\n /** The instance of component opened into the dialog. */\n componentInstance: T;\n\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined = this._containerInstance._config.disableClose;\n\n /** Subject for notifying the user that the dialog has finished opening. */\n private readonly _afterOpened = new Subject<void>();\n\n /** Subject for notifying the user that the dialog has finished closing. */\n private readonly _afterClosed = new Subject<R | undefined>();\n\n /** Subject for notifying the user that the dialog has started closing. */\n private readonly _beforeClosed = new Subject<R | undefined>();\n\n /** Result to be passed to afterClosed. */\n private _result: R | undefined;\n\n /** Handle to the timeout that's running as a fallback in case the exit animation doesn't fire. */\n private _closeFallbackTimeout: number;\n\n constructor(\n private _overlayRef: OverlayRef,\n public _containerInstance: MatDialogContainer,\n // @breaking-change 8.0.0 `_location` parameter to be removed.\n _location?: Location,\n readonly id: string = `mat-dialog-${uniqueId++}`) {\n\n // Pass the id along to the container.\n _containerInstance._id = id;\n\n // Emit when opening animation completes\n _containerInstance._animationStateChanged.pipe(\n filter(event => event.phaseName === 'done' && event.toState === 'enter'),\n take(1)\n )\n .subscribe(() => {\n this._afterOpened.next();\n this._afterOpened.complete();\n });\n\n // Dispose overlay when closing animation is complete\n _containerInstance._animationStateChanged.pipe(\n filter(event => event.phaseName === 'done' && event.toState === 'exit'),\n take(1)\n ).subscribe(() => {\n clearTimeout(this._closeFallbackTimeout);\n this._overlayRef.dispose();\n });\n\n _overlayRef.detachments().subscribe(() => {\n this._beforeClosed.next(this._result);\n this._beforeClosed.complete();\n this._afterClosed.next(this._result);\n this._afterClosed.complete();\n this.componentInstance = null!;\n this._overlayRef.dispose();\n });\n\n _overlayRef.keydownEvents()\n .pipe(filter(event => {\n return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);\n }))\n .subscribe(event => {\n event.preventDefault();\n this.close();\n });\n }\n\n /**\n * Close the dialog.\n * @param dialogResult Optional result to return to the dialog opener.\n */\n close(dialogResult?: R): void {\n this._result = dialogResult;\n\n // Transition the backdrop in parallel to the dialog.\n this._containerInstance._animationStateChanged.pipe(\n filter(event => event.phaseName === 'start'),\n take(1)\n )\n .subscribe(event => {\n this._beforeClosed.next(dialogResult);\n this._beforeClosed.complete();\n this._overlayRef.detachBackdrop();\n\n // The logic that disposes of the overlay depends on the exit animation completing, however\n // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback\n // timeout which will clean everything up if the animation hasn't fired within the specified\n // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the\n // vast majority of cases the timeout will have been cleared before it has the chance to fire.\n this._closeFallbackTimeout = setTimeout(() => {\n this._overlayRef.dispose();\n }, event.totalTime + 100);\n });\n\n this._containerInstance._startExitAnimation();\n }\n\n /**\n * Gets an observable that is notified when the dialog is finished opening.\n */\n afterOpened(): Observable<void> {\n return this._afterOpened.asObservable();\n }\n\n /**\n * Gets an observable that is notified when the dialog is finished closing.\n */\n afterClosed(): Observable<R | undefined> {\n return this._afterClosed.asObservable();\n }\n\n /**\n * Gets an observable that is notified when the dialog has started closing.\n */\n beforeClosed(): Observable<R | undefined> {\n return this._beforeClosed.asObservable();\n }\n\n /**\n * Gets an observable that emits when the overlay's backdrop has been clicked.\n */\n backdropClick(): Observable<MouseEvent> {\n return this._overlayRef.backdropClick();\n }\n\n /**\n * Gets an observable that emits when keydown events are targeted on the overlay.\n */\n keydownEvents(): Observable<KeyboardEvent> {\n return this._overlayRef.keydownEvents();\n }\n\n /**\n * Updates the dialog's position.\n * @param position New dialog position.\n */\n updatePosition(position?: DialogPosition): this {\n let strategy = this._getPositionStrategy();\n\n if (position && (position.left || position.right)) {\n position.left ? strategy.left(position.left) : strategy.right(position.right);\n } else {\n strategy.centerHorizontally();\n }\n\n if (position && (position.top || position.bottom)) {\n position.top ? strategy.top(position.top) : strategy.bottom(position.bottom);\n } else {\n strategy.centerVertically();\n }\n\n this._overlayRef.updatePosition();\n\n return this;\n }\n\n /**\n * Updates the dialog's width and height.\n * @param width New width of the dialog.\n * @param height New height of the dialog.\n */\n updateSize(width: string = '', height: string = ''): this {\n this._getPositionStrategy().width(width).height(height);\n this._overlayRef.updatePosition();\n return this;\n }\n\n /** Add a CSS class or an array of classes to the overlay pane. */\n addPanelClass(classes: string | string[]): this {\n this._overlayRef.addPanelClass(classes);\n return this;\n }\n\n /** Remove a CSS class or an array of classes from the overlay pane. */\n removePanelClass(classes: string | string[]): this {\n this._overlayRef.removePanelClass(classes);\n return this;\n }\n\n /**\n * Gets an observable that is notified when the dialog is finished opening.\n * @deprecated Use `afterOpened` instead.\n * @breaking-change 8.0.0\n */\n afterOpen(): Observable<void> {\n return this.afterOpened();\n }\n\n /**\n * Gets an observable that is notified when the dialog has started closing.\n * @deprecated Use `beforeClosed` instead.\n * @breaking-change 8.0.0\n */\n beforeClose(): Observable<R | undefined> {\n return this.beforeClosed();\n }\n\n /** Fetches the position strategy object from the overlay ref. */\n private _getPositionStrategy(): GlobalPositionStrategy {\n return this._overlayRef.getConfig().positionStrategy as GlobalPositionStrategy;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {\n Overlay,\n OverlayConfig,\n OverlayContainer,\n OverlayRef,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport {ComponentPortal, ComponentType, PortalInjector, TemplatePortal} from '@angular/cdk/portal';\nimport {Location} from '@angular/common';\nimport {\n Inject,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n Optional,\n SkipSelf,\n TemplateRef,\n} from '@angular/core';\nimport {defer, Observable, of as observableOf, Subject} from 'rxjs';\nimport {startWith} from 'rxjs/operators';\nimport {MatDialogConfig} from './dialog-config';\nimport {MatDialogContainer} from './dialog-container';\nimport {MatDialogRef} from './dialog-ref';\n\n\n/** Injection token that can be used to access the data that was passed in to a dialog. */\nexport const MAT_DIALOG_DATA = new InjectionToken<any>('MatDialogData');\n\n/** Injection token that can be used to specify default dialog options. */\nexport const MAT_DIALOG_DEFAULT_OPTIONS =\n new InjectionToken<MatDialogConfig>('mat-dialog-default-options');\n\n/** Injection token that determines the scroll handling while the dialog is open. */\nexport const MAT_DIALOG_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-dialog-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_DIALOG_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.block();\n}\n\n/** @docs-private */\nexport function MAT_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay):\n () => ScrollStrategy {\n return () => overlay.scrollStrategies.block();\n}\n\n/** @docs-private */\nexport const MAT_DIALOG_SCROLL_STRATEGY_PROVIDER = {\n provide: MAT_DIALOG_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n\n/**\n * Service to open Material Design modal dialogs.\n */\n@Injectable()\nexport class MatDialog implements OnDestroy {\n private _openDialogsAtThisLevel: MatDialogRef<any>[] = [];\n private readonly _afterAllClosedAtThisLevel = new Subject<void>();\n private readonly _afterOpenedAtThisLevel = new Subject<MatDialogRef<any>>();\n private _ariaHiddenElements = new Map<Element, string|null>();\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Keeps track of the currently-open dialogs. */\n get openDialogs(): MatDialogRef<any>[] {\n return this._parentDialog ? this._parentDialog.openDialogs : this._openDialogsAtThisLevel;\n }\n\n /** Stream that emits when a dialog has been opened. */\n get afterOpened(): Subject<MatDialogRef<any>> {\n return this._parentDialog ? this._parentDialog.afterOpened : this._afterOpenedAtThisLevel;\n }\n\n /**\n * Stream that emits when a dialog has been opened.\n * @deprecated Use `afterOpened` instead.\n * @breaking-change 8.0.0\n */\n get afterOpen(): Subject<MatDialogRef<any>> {\n return this.afterOpened;\n }\n\n get _afterAllClosed(): Subject<void> {\n const parent = this._parentDialog;\n return parent ? parent._afterAllClosed : this._afterAllClosedAtThisLevel;\n }\n\n // TODO (jelbourn): tighten the typing right-hand side of this expression.\n /**\n * Stream that emits when all open dialog have finished closing.\n * Will emit on subscribe if there are no open dialogs to begin with.\n */\n readonly afterAllClosed: Observable<void> = defer(() => this.openDialogs.length ?\n this._afterAllClosed :\n this._afterAllClosed.pipe(startWith(undefined))) as Observable<any>;\n\n constructor(\n private _overlay: Overlay,\n private _injector: Injector,\n @Optional() private _location: Location,\n @Optional() @Inject(MAT_DIALOG_DEFAULT_OPTIONS) private _defaultOptions: MatDialogConfig,\n @Inject(MAT_DIALOG_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() @SkipSelf() private _parentDialog: MatDialog,\n private _overlayContainer: OverlayContainer) {\n this._scrollStrategy = scrollStrategy;\n }\n\n /**\n * Opens a modal dialog containing the given component.\n * @param componentOrTemplateRef Type of the component to load into the dialog,\n * or a TemplateRef to instantiate as the dialog content.\n * @param config Extra configuration options.\n * @returns Reference to the newly-opened dialog.\n */\n open<T, D = any, R = any>(componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: MatDialogConfig<D>): MatDialogRef<T, R> {\n\n config = _applyConfigDefaults(config, this._defaultOptions || new MatDialogConfig());\n\n if (config.id && this.getDialogById(config.id)) {\n throw Error(`Dialog with id \"${config.id}\" exists already. The dialog id must be unique.`);\n }\n\n const overlayRef = this._createOverlay(config);\n const dialogContainer = this._attachDialogContainer(overlayRef, config);\n const dialogRef = this._attachDialogContent<T, R>(componentOrTemplateRef,\n dialogContainer,\n overlayRef,\n config);\n\n // If this is the first dialog that we're opening, hide all the non-overlay content.\n if (!this.openDialogs.length) {\n this._hideNonDialogContentFromAssistiveTechnology();\n }\n\n this.openDialogs.push(dialogRef);\n dialogRef.afterClosed().subscribe(() => this._removeOpenDialog(dialogRef));\n this.afterOpened.next(dialogRef);\n\n return dialogRef;\n }\n\n /**\n * Closes all of the currently-open dialogs.\n */\n closeAll(): void {\n this._closeDialogs(this.openDialogs);\n }\n\n /**\n * Finds an open dialog by its id.\n * @param id ID to use when looking up the dialog.\n */\n getDialogById(id: string): MatDialogRef<any> | undefined {\n return this.openDialogs.find(dialog => dialog.id === id);\n }\n\n ngOnDestroy() {\n // Only close the dialogs at this level on destroy\n // since the parent service may still be active.\n this._closeDialogs(this._openDialogsAtThisLevel);\n this._afterAllClosedAtThisLevel.complete();\n this._afterOpenedAtThisLevel.complete();\n }\n\n /**\n * Creates the overlay into which the dialog will be loaded.\n * @param config The dialog configuration.\n * @returns A promise resolving to the OverlayRef for the created overlay.\n */\n private _createOverlay(config: MatDialogConfig): OverlayRef {\n const overlayConfig = this._getOverlayConfig(config);\n return this._overlay.create(overlayConfig);\n }\n\n /**\n * Creates an overlay config from a dialog config.\n * @param dialogConfig The dialog configuration.\n * @returns The overlay configuration.\n */\n private _getOverlayConfig(dialogConfig: MatDialogConfig): OverlayConfig {\n const state = new OverlayConfig({\n positionStrategy: this._overlay.position().global(),\n scrollStrategy: dialogConfig.scrollStrategy || this._scrollStrategy(),\n panelClass: dialogConfig.panelClass,\n hasBackdrop: dialogConfig.hasBackdrop,\n direction: dialogConfig.direction,\n minWidth: dialogConfig.minWidth,\n minHeight: dialogConfig.minHeight,\n maxWidth: dialogConfig.maxWidth,\n maxHeight: dialogConfig.maxHeight,\n disposeOnNavigation: dialogConfig.closeOnNavigation\n });\n\n if (dialogConfig.backdropClass) {\n state.backdropClass = dialogConfig.backdropClass;\n }\n\n return state;\n }\n\n /**\n * Attaches an MatDialogContainer 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 private _attachDialogContainer(overlay: OverlayRef, config: MatDialogConfig): MatDialogContainer {\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n const injector = new PortalInjector(userInjector || this._injector, new WeakMap([\n [MatDialogConfig, config]\n ]));\n const containerPortal =\n new ComponentPortal(MatDialogContainer, config.viewContainerRef, injector);\n const containerRef = overlay.attach<MatDialogContainer>(containerPortal);\n\n return containerRef.instance;\n }\n\n /**\n * Attaches the user-provided component to the already-created MatDialogContainer.\n * @param componentOrTemplateRef The type of component being loaded into the dialog,\n * or a TemplateRef to instantiate as the content.\n * @param dialogContainer Reference to the wrapping MatDialogContainer.\n * @param overlayRef Reference to the overlay in which the dialog resides.\n * @param config The dialog configuration.\n * @returns A promise resolving to the MatDialogRef that should be returned to the user.\n */\n private _attachDialogContent<T, R>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n dialogContainer: MatDialogContainer,\n overlayRef: OverlayRef,\n config: MatDialogConfig): MatDialogRef<T, R> {\n\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 const dialogRef =\n new MatDialogRef<T, R>(overlayRef, dialogContainer, this._location, config.id);\n\n // When the dialog backdrop is clicked, we want to close it.\n if (config.hasBackdrop) {\n overlayRef.backdropClick().subscribe(() => {\n if (!dialogRef.disableClose) {\n dialogRef.close();\n }\n });\n }\n\n if (componentOrTemplateRef instanceof TemplateRef) {\n dialogContainer.attachTemplatePortal(\n new TemplatePortal<T>(componentOrTemplateRef, null!,\n <any>{ $implicit: config.data, dialogRef }));\n } else {\n const injector = this._createInjector<T>(config, dialogRef, dialogContainer);\n const contentRef = dialogContainer.attachComponentPortal<T>(\n new ComponentPortal(componentOrTemplateRef, undefined, injector));\n dialogRef.componentInstance = contentRef.instance;\n }\n\n dialogRef\n .updateSize(config.width, config.height)\n .updatePosition(config.position);\n\n return dialogRef;\n }\n\n /**\n * Creates a custom injector to be used inside the dialog. This allows a component loaded inside\n * of a dialog to close itself and, optionally, to return a value.\n * @param config Config object that is used to construct the dialog.\n * @param dialogRef Reference to the dialog.\n * @param container Dialog container element that wraps all of the contents.\n * @returns The custom injector that can be used inside the dialog.\n */\n private _createInjector<T>(\n config: MatDialogConfig,\n dialogRef: MatDialogRef<T>,\n dialogContainer: MatDialogContainer): PortalInjector {\n\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n\n // The MatDialogContainer is injected in the portal as the MatDialogContainer and the dialog's\n // content are created out of the same ViewContainerRef and as such, are siblings for injector\n // purposes. To allow the hierarchy that is expected, the MatDialogContainer is explicitly\n // added to the injection tokens.\n const injectionTokens = new WeakMap<any, any>([\n [MatDialogContainer, dialogContainer],\n [MAT_DIALOG_DATA, config.data],\n [MatDialogRef, dialogRef]\n ]);\n\n if (config.direction &&\n (!userInjector || !userInjector.get<Directionality | null>(Directionality, null))) {\n injectionTokens.set(Directionality, {\n value: config.direction,\n change: observableOf()\n });\n }\n\n return new PortalInjector(userInjector || this._injector, injectionTokens);\n }\n\n /**\n * Removes a dialog from the array of open dialogs.\n * @param dialogRef Dialog to be removed.\n */\n private _removeOpenDialog(dialogRef: MatDialogRef<any>) {\n const index = this.openDialogs.indexOf(dialogRef);\n\n if (index > -1) {\n this.openDialogs.splice(index, 1);\n\n // If all the dialogs were closed, remove/restore the `aria-hidden`\n // to a the siblings and emit to the `afterAllClosed` stream.\n if (!this.openDialogs.length) {\n this._ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue) {\n element.setAttribute('aria-hidden', previousValue);\n } else {\n element.removeAttribute('aria-hidden');\n }\n });\n\n this._ariaHiddenElements.clear();\n this._afterAllClosed.next();\n }\n }\n }\n\n /**\n * Hides all of the content that isn't an overlay from assistive technology.\n */\n private _hideNonDialogContentFromAssistiveTechnology() {\n const overlayContainer = this._overlayContainer.getContainerElement();\n\n // Ensure that the overlay container is attached to the DOM.\n if (overlayContainer.parentElement) {\n const siblings = overlayContainer.parentElement.children;\n\n for (let i = siblings.length - 1; i > -1; i--) {\n let sibling = siblings[i];\n\n if (sibling !== overlayContainer &&\n sibling.nodeName !== 'SCRIPT' &&\n sibling.nodeName !== 'STYLE' &&\n !sibling.hasAttribute('aria-live')) {\n\n this._ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n }\n }\n\n /** Closes all of the dialogs in an array. */\n private _closeDialogs(dialogs: MatDialogRef<any>[]) {\n let i = dialogs.length;\n\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 dialogs[i].close();\n }\n }\n\n}\n\n/**\n * Applies default options to the dialog config.\n * @param config Config to be modified.\n * @param defaultOptions Default options provided.\n * @returns The new configuration object.\n */\nfunction _applyConfigDefaults(\n config?: MatDialogConfig, defaultOptions?: MatDialogConfig): MatDialogConfig {\n return {...defaultOptions, ...config};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n} from '@angular/core';\nimport {MatDialog} from './dialog';\nimport {MatDialogRef} from './dialog-ref';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Button that will close the current dialog.\n */\n@Directive({\n selector: `button[mat-dialog-close], button[matDialogClose]`,\n exportAs: 'matDialogClose',\n host: {\n '(click)': 'dialogRef.close(dialogResult)',\n '[attr.aria-label]': 'ariaLabel || null',\n 'type': 'button', // Prevents accidental form submits.\n }\n})\nexport class MatDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label') ariaLabel: string;\n\n /** Dialog close input. */\n @Input('mat-dialog-close') dialogResult: any;\n\n @Input('matDialogClose') _matDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: MatDialogRef<any>,\n private _elementRef: ElementRef<HTMLElement>,\n private _dialog: MatDialog) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(this._elementRef, this._dialog.openDialogs)!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange = changes['_matDialogClose'] || changes['_matDialogCloseResult'];\n\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Title of a dialog element. Stays fixed to the top of the dialog when scrolling.\n */\n@Directive({\n selector: '[mat-dialog-title], [matDialogTitle]',\n exportAs: 'matDialogTitle',\n host: {\n 'class': 'mat-dialog-title',\n '[id]': 'id',\n },\n})\nexport class MatDialogTitle implements OnInit {\n @Input() id = `mat-dialog-title-${dialogElementUid++}`;\n\n constructor(\n @Optional() private _dialogRef: MatDialogRef<any>,\n private _elementRef: ElementRef<HTMLElement>,\n private _dialog: MatDialog) {}\n\n ngOnInit() {\n if (!this._dialogRef) {\n this._dialogRef = getClosestDialog(this._elementRef, this._dialog.openDialogs)!;\n }\n\n if (this._dialogRef) {\n Promise.resolve().then(() => {\n const container = this._dialogRef._containerInstance;\n\n if (container && !container._ariaLabelledBy) {\n container._ariaLabelledBy = this.id;\n }\n });\n }\n }\n}\n\n\n/**\n * Scrollable content container of a dialog.\n */\n@Directive({\n selector: `[mat-dialog-content], mat-dialog-content, [matDialogContent]`,\n host: {'class': 'mat-dialog-content'}\n})\nexport class MatDialogContent {}\n\n\n/**\n * Container for the bottom action buttons in a dialog.\n * Stays fixed to the bottom when scrolling.\n */\n@Directive({\n selector: `[mat-dialog-actions], mat-dialog-actions, [matDialogActions]`,\n host: {'class': 'mat-dialog-actions'}\n})\nexport class MatDialogActions {}\n\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(element: ElementRef<HTMLElement>, openDialogs: MatDialogRef<any>[]) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('mat-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find(dialog => dialog.id === parent!.id) : null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MAT_DIALOG_SCROLL_STRATEGY_PROVIDER, MatDialog} from './dialog';\nimport {MatDialogContainer} from './dialog-container';\nimport {\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatDialogTitle,\n} from './dialog-content-directives';\n\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n PortalModule,\n MatCommonModule,\n ],\n exports: [\n MatDialogContainer,\n MatDialogClose,\n MatDialogTitle,\n MatDialogContent,\n MatDialogActions,\n MatCommonModule,\n ],\n declarations: [\n MatDialogContainer,\n MatDialogClose,\n MatDialogTitle,\n MatDialogActions,\n MatDialogContent,\n ],\n providers: [\n MatDialog,\n MAT_DIALOG_SCROLL_STRATEGY_PROVIDER,\n ],\n entryComponents: [MatDialogContainer],\n})\nexport class MatDialogModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CdkTextareaAutosize} from '@angular/cdk/text-field';\nimport {Directive, Input} from '@angular/core';\n\n/**\n * Directive to automatically resize a textarea to fit its content.\n * @deprecated Use `cdkTextareaAutosize` from `@angular/cdk/text-field` instead.\n * @breaking-change 8.0.0\n */\n@Directive({\n selector: 'textarea[mat-autosize], textarea[matTextareaAutosize]',\n exportAs: 'matTextareaAutosize',\n inputs: ['cdkAutosizeMinRows', 'cdkAutosizeMaxRows'],\n host: {\n 'class': 'cdk-textarea-autosize mat-autosize',\n // Textarea elements that have the directive applied should have a single row by default.\n // Browsers normally show two rows by default and therefore this limits the minRows binding.\n 'rows': '1',\n '(input)': '_noopInputHandler()',\n },\n})\nexport class MatTextareaAutosize extends CdkTextareaAutosize {\n @Input()\n get matAutosizeMinRows(): number { return this.minRows; }\n set matAutosizeMinRows(value: number) { this.minRows = value; }\n\n @Input()\n get matAutosizeMaxRows(): number { return this.maxRows; }\n set matAutosizeMaxRows(value: number) { this.maxRows = value; }\n\n @Input('mat-autosize')\n get matAutosize(): boolean { return this.enabled; }\n set matAutosize(value: boolean) { this.enabled = value; }\n\n @Input()\n get matTextareaAutosize(): boolean { return this.enabled; }\n set matTextareaAutosize(value: boolean) { this.enabled = value; }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n\n/**\n * This token is used to inject the object whose value should be set into `MatInput`. If none is\n * provided, the native `HTMLInputElement` is used. Directives like `MatDatepickerInput` can provide\n * themselves for this token, in order to make `MatInput` delegate the getting and setting of the\n * value to them.\n */\nexport const MAT_INPUT_VALUE_ACCESSOR =\n new InjectionToken<{value: any}>('MAT_INPUT_VALUE_ACCESSOR');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n Directive,\n Input,\n Optional,\n Inject,\n} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/**\n * Content of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\n@Directive({\n selector: 'mat-card-content',\n host: {'class': 'mat-card-content'}\n})\nexport class MatCardContent {}\n\n/**\n * Title of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\n@Directive({\n selector: `mat-card-title, [mat-card-title], [matCardTitle]`,\n host: {\n 'class': 'mat-card-title'\n }\n})\nexport class MatCardTitle {}\n\n/**\n * Sub-title of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\n@Directive({\n selector: `mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]`,\n host: {\n 'class': 'mat-card-subtitle'\n }\n})\nexport class MatCardSubtitle {}\n\n/**\n * Action section of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\n@Directive({\n selector: 'mat-card-actions',\n exportAs: 'matCardActions',\n host: {\n 'class': 'mat-card-actions',\n '[class.mat-card-actions-align-end]': 'align === \"end\"',\n }\n})\nexport class MatCardActions {\n /** Position of the actions inside the card. */\n @Input() align: 'start' | 'end' = 'start';\n}\n\n/**\n * Footer of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\n@Directive({\n selector: 'mat-card-footer',\n host: {'class': 'mat-card-footer'}\n})\nexport class MatCardFooter {}\n\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-image], [matCardImage]',\n host: {'class': 'mat-card-image'}\n})\nexport class MatCardImage {}\n\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-sm-image], [matCardImageSmall]',\n host: {'class': 'mat-card-sm-image'}\n})\nexport class MatCardSmImage {}\n\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-md-image], [matCardImageMedium]',\n host: {'class': 'mat-card-md-image'}\n})\nexport class MatCardMdImage {}\n\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-lg-image], [matCardImageLarge]',\n host: {'class': 'mat-card-lg-image'}\n})\nexport class MatCardLgImage {}\n\n/**\n * Large image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-xl-image], [matCardImageXLarge]',\n host: {'class': 'mat-card-xl-image'}\n})\nexport class MatCardXlImage {}\n\n/**\n * Avatar image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\n@Directive({\n selector: '[mat-card-avatar], [matCardAvatar]',\n host: {'class': 'mat-card-avatar'}\n})\nexport class MatCardAvatar {}\n\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 * - mat-card-title\n * - mat-card-subtitle\n * - mat-card-content\n * - mat-card-actions\n * - mat-card-footer\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-card',\n exportAs: 'matCard',\n templateUrl: 'card.html',\n styleUrls: ['card.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'mat-card',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n }\n})\nexport class MatCard {\n // @breaking-change 9.0.0 `_animationMode` parameter to be made required.\n constructor(@Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {}\n}\n\n\n/**\n * Component intended to be used within the `<mat-card>` component. It adds styles for a\n * preset header section (i.e. a title, subtitle, and avatar layout).\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-card-header',\n templateUrl: 'card-header.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {'class': 'mat-card-header'}\n})\nexport class MatCardHeader {}\n\n\n/**\n * Component intended to be used within the `<mat-card>` component. It adds styles for a preset\n * layout that groups an image with a title section.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-card-title-group',\n templateUrl: 'card-title-group.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {'class': 'mat-card-title-group'}\n})\nexport class MatCardTitleGroup {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {\n MatCard,\n MatCardActions,\n MatCardAvatar,\n MatCardContent,\n MatCardFooter,\n MatCardHeader,\n MatCardImage,\n MatCardLgImage,\n MatCardMdImage,\n MatCardSmImage,\n MatCardSubtitle,\n MatCardTitle,\n MatCardTitleGroup,\n MatCardXlImage,\n} from './card';\n\n\n@NgModule({\n imports: [MatCommonModule],\n exports: [\n MatCard,\n MatCardHeader,\n MatCardTitleGroup,\n MatCardContent,\n MatCardTitle,\n MatCardSubtitle,\n MatCardActions,\n MatCardFooter,\n MatCardSmImage,\n MatCardMdImage,\n MatCardLgImage,\n MatCardImage,\n MatCardXlImage,\n MatCardAvatar,\n MatCommonModule,\n ],\n declarations: [\n MatCard, MatCardHeader, MatCardTitleGroup, MatCardContent, MatCardTitle, MatCardSubtitle,\n MatCardActions, MatCardFooter, MatCardSmImage, MatCardMdImage, MatCardLgImage, MatCardImage,\n MatCardXlImage, MatCardAvatar,\n ],\n})\nexport class MatCardModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {InjectionToken} from '@angular/core';\n\n\n/**\n * Checkbox click action when user click on input element.\n * noop: Do not toggle checked or indeterminate.\n * check: Only toggle checked status, ignore indeterminate.\n * check-indeterminate: Toggle checked status, set indeterminate to false. Default behavior.\n * undefined: Same as `check-indeterminate`.\n */\nexport type MatCheckboxClickAction = 'noop' | 'check' | 'check-indeterminate' | undefined;\n\n/**\n * Injection token that can be used to specify the checkbox click behavior.\n */\nexport const MAT_CHECKBOX_CLICK_ACTION =\n new InjectionToken<MatCheckboxClickAction>('mat-checkbox-click-action');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewEncapsulation,\n AfterViewChecked,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n CanColor,\n CanColorCtor,\n CanDisable,\n CanDisableCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n HasTabIndex,\n HasTabIndexCtor,\n MatRipple,\n mixinColor,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {MAT_CHECKBOX_CLICK_ACTION, MatCheckboxClickAction} from './checkbox-config';\n\n\n// Increasing integer for generating unique ids for checkbox components.\nlet nextUniqueId = 0;\n\n/**\n * Provider Expression that allows mat-checkbox to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nexport const MAT_CHECKBOX_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatCheckbox),\n multi: true\n};\n\n/**\n * Represents the different states that require custom transitions between them.\n * @docs-private\n */\nexport enum TransitionCheckState {\n /** The initial state of the component before any user interaction. */\n Init,\n /** The state representing the component when it's becoming checked. */\n Checked,\n /** The state representing the component when it's becoming unchecked. */\n Unchecked,\n /** The state representing the component when it's becoming indeterminate. */\n Indeterminate\n}\n\n/** Change event object emitted by MatCheckbox. */\nexport class MatCheckboxChange {\n /** The source MatCheckbox of the event. */\n source: MatCheckbox;\n /** The new `checked` value of the checkbox. */\n checked: boolean;\n}\n\n// Boilerplate for applying mixins to MatCheckbox.\n/** @docs-private */\nclass MatCheckboxBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatCheckboxMixinBase:\n HasTabIndexCtor &\n CanColorCtor &\n CanDisableRippleCtor &\n CanDisableCtor &\n typeof MatCheckboxBase =\n mixinTabIndex(mixinColor(mixinDisableRipple(mixinDisabled(MatCheckboxBase)), 'accent'));\n\n\n/**\n * A material design checkbox component. Supports all of the functionality of an HTML5 checkbox,\n * and exposes a similar API. A MatCheckbox 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://material.io/design/components/selection-controls.html\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-checkbox',\n templateUrl: 'checkbox.html',\n styleUrls: ['checkbox.css'],\n exportAs: 'matCheckbox',\n host: {\n 'class': 'mat-checkbox',\n '[id]': 'id',\n '[attr.tabindex]': 'null',\n '[class.mat-checkbox-indeterminate]': 'indeterminate',\n '[class.mat-checkbox-checked]': 'checked',\n '[class.mat-checkbox-disabled]': 'disabled',\n '[class.mat-checkbox-label-before]': 'labelPosition == \"before\"',\n '[class._mat-animation-noopable]': `_animationMode === 'NoopAnimations'`,\n },\n providers: [MAT_CHECKBOX_CONTROL_VALUE_ACCESSOR],\n inputs: ['disableRipple', 'color', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatCheckbox extends _MatCheckboxMixinBase implements ControlValueAccessor,\n AfterViewChecked, OnDestroy, CanColor, CanDisable, HasTabIndex, CanDisableRipple {\n\n /**\n * Attached to the aria-label attribute of the host element. In most cases, aria-labelledby will\n * take precedence so this may be omitted.\n */\n @Input('aria-label') ariaLabel: string = '';\n\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n @Input('aria-labelledby') ariaLabelledby: string | null = null;\n\n private _uniqueId: string = `mat-checkbox-${++nextUniqueId}`;\n\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\n @Input() id: string = this._uniqueId;\n\n /** Returns the unique id for the visual hidden input. */\n get inputId(): string { return `${this.id || this._uniqueId}-input`; }\n\n /** Whether the checkbox is required. */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) { this._required = coerceBooleanProperty(value); }\n private _required: boolean;\n\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n @Input() labelPosition: 'before' | 'after' = 'after';\n\n /** Name value will be applied to the input element if present */\n @Input() name: string | null = null;\n\n /** Event emitted when the checkbox's `checked` value changes. */\n @Output() readonly change: EventEmitter<MatCheckboxChange> =\n new EventEmitter<MatCheckboxChange>();\n\n /** Event emitted when the checkbox's `indeterminate` value changes. */\n @Output() readonly indeterminateChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** The value attribute of the native input element */\n @Input() value: string;\n\n /** The native `<input type=\"checkbox\">` element */\n @ViewChild('input', {static: false}) _inputElement: ElementRef<HTMLInputElement>;\n\n /** Reference to the ripple instance of the checkbox. */\n @ViewChild(MatRipple, {static: false}) ripple: MatRipple;\n\n /**\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n * @docs-private\n */\n _onTouched: () => any = () => {};\n\n private _currentAnimationClass: string = '';\n\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\n\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n constructor(elementRef: ElementRef<HTMLElement>,\n private _changeDetectorRef: ChangeDetectorRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string,\n @Optional() @Inject(MAT_CHECKBOX_CLICK_ACTION)\n private _clickAction: MatCheckboxClickAction,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n super(elementRef);\n\n this.tabIndex = parseInt(tabIndex) || 0;\n\n this._focusMonitor.monitor(elementRef, true).subscribe(focusOrigin => {\n if (!focusOrigin) {\n // When a focused element becomes disabled, the browser *immediately* fires a blur event.\n // Angular does not expect events to be raised during change detection, so any state change\n // (such as a form control's 'ng-touched') will cause a changed-after-checked error.\n // See https://github.com/angular/angular/issues/17793. To work around this, we defer\n // telling the form control it has been touched until the next tick.\n Promise.resolve().then(() => {\n this._onTouched();\n _changeDetectorRef.markForCheck();\n });\n }\n });\n }\n\n // TODO: Delete next major revision.\n ngAfterViewChecked() {}\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /**\n * Whether the checkbox is checked.\n */\n @Input()\n get checked(): boolean { return this._checked; }\n set checked(value: boolean) {\n if (value != this.checked) {\n this._checked = value;\n this._changeDetectorRef.markForCheck();\n }\n }\n private _checked: boolean = false;\n\n /**\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\n */\n @Input()\n get disabled() { return this._disabled; }\n set disabled(value: any) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this.disabled) {\n this._disabled = newValue;\n this._changeDetectorRef.markForCheck();\n }\n }\n private _disabled: boolean = false;\n\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 checkbox is manually clicked, indeterminate is immediately\n * set to false.\n */\n @Input()\n get indeterminate(): boolean { return this._indeterminate; }\n set indeterminate(value: boolean) {\n const changed = value != this._indeterminate;\n this._indeterminate = value;\n\n if (changed) {\n if (this._indeterminate) {\n this._transitionCheckState(TransitionCheckState.Indeterminate);\n } else {\n this._transitionCheckState(\n this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);\n }\n this.indeterminateChange.emit(this._indeterminate);\n }\n }\n private _indeterminate: boolean = false;\n\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n\n /** Method being called whenever the label text changes. */\n _onLabelTextChange() {\n // Since the event of the `cdkObserveContent` directive runs outside of the zone, the checkbox\n // component will be only marked for check, but no actual change detection runs automatically.\n // Instead of going back into the zone in order to trigger a change detection which causes\n // *all* components to be checked (if explicitly marked or not using OnPush), we only trigger\n // an explicit change detection for the checkbox view and it's children.\n this._changeDetectorRef.detectChanges();\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any) {\n this.checked = !!value;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n\n _getAriaChecked(): 'true' | 'false' | 'mixed' {\n return this.checked ? 'true' : (this.indeterminate ? 'mixed' : 'false');\n }\n\n private _transitionCheckState(newState: TransitionCheckState) {\n let oldState = this._currentCheckState;\n let element: HTMLElement = this._elementRef.nativeElement;\n\n if (oldState === newState) {\n return;\n }\n if (this._currentAnimationClass.length > 0) {\n element.classList.remove(this._currentAnimationClass);\n }\n\n this._currentAnimationClass = this._getAnimationClassForCheckStateTransition(\n oldState, newState);\n this._currentCheckState = newState;\n\n if (this._currentAnimationClass.length > 0) {\n element.classList.add(this._currentAnimationClass);\n\n // Remove the animation class to avoid animation when the checkbox is moved between containers\n const animationClass = this._currentAnimationClass;\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n element.classList.remove(animationClass);\n }, 1000);\n });\n }\n }\n\n private _emitChangeEvent() {\n const event = new MatCheckboxChange();\n event.source = this;\n event.checked = this.checked;\n\n this._controlValueAccessorChangeFn(this.checked);\n this.change.emit(event);\n }\n\n /** Toggles the `checked` state of the checkbox. */\n toggle(): void {\n this.checked = !this.checked;\n }\n\n /**\n * Event handler for checkbox input element.\n * Toggles checked state if element is not disabled.\n * Do not toggle on (change) event since IE doesn't fire change event when\n * indeterminate checkbox is clicked.\n * @param event\n */\n _onInputClick(event: 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 // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\n if (!this.disabled && this._clickAction !== 'noop') {\n // When user manually click on the checkbox, `indeterminate` is set to false.\n if (this.indeterminate && this._clickAction !== 'check') {\n\n Promise.resolve().then(() => {\n this._indeterminate = false;\n this.indeterminateChange.emit(this._indeterminate);\n });\n }\n\n this.toggle();\n this._transitionCheckState(\n this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);\n\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 } else if (!this.disabled && this._clickAction === 'noop') {\n // Reset native input when clicked with noop. The native checkbox becomes checked after\n // click, reset it to be align with `checked` value of `mat-checkbox`.\n this._inputElement.nativeElement.checked = this.checked;\n this._inputElement.nativeElement.indeterminate = this.indeterminate;\n }\n }\n\n /** Focuses the checkbox. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n\n _onInteractionEvent(event: 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 }\n\n private _getAnimationClassForCheckStateTransition(\n oldState: TransitionCheckState, newState: TransitionCheckState): string {\n // Don't transition if animations are disabled.\n if (this._animationMode === 'NoopAnimations') {\n return '';\n }\n\n let animSuffix: string = '';\n\n switch (oldState) {\n case 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 === TransitionCheckState.Checked) {\n animSuffix = 'unchecked-checked';\n } else if (newState == TransitionCheckState.Indeterminate) {\n animSuffix = 'unchecked-indeterminate';\n } else {\n return '';\n }\n break;\n case TransitionCheckState.Unchecked:\n animSuffix = newState === TransitionCheckState.Checked ?\n 'unchecked-checked' : 'unchecked-indeterminate';\n break;\n case TransitionCheckState.Checked:\n animSuffix = newState === TransitionCheckState.Unchecked ?\n 'checked-unchecked' : 'checked-indeterminate';\n break;\n case TransitionCheckState.Indeterminate:\n animSuffix = newState === TransitionCheckState.Checked ?\n 'indeterminate-checked' : 'indeterminate-unchecked';\n break;\n }\n\n return `mat-checkbox-anim-${animSuffix}`;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Directive,\n forwardRef,\n Provider,\n} from '@angular/core';\nimport {\n CheckboxRequiredValidator,\n NG_VALIDATORS,\n} from '@angular/forms';\n\nexport const MAT_CHECKBOX_REQUIRED_VALIDATOR: Provider = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MatCheckboxRequiredValidator),\n multi: true\n};\n\n/**\n * Validator for Material checkbox's required attribute in template-driven checkbox.\n * Current CheckboxRequiredValidator only work with `input type=checkbox` and does not\n * work with `mat-checkbox`.\n */\n@Directive({\n selector: `mat-checkbox[required][formControlName],\n mat-checkbox[required][formControl], mat-checkbox[required][ngModel]`,\n providers: [MAT_CHECKBOX_REQUIRED_VALIDATOR],\n host: {'[attr.required]': 'required ? \"\" : null'}\n})\nexport class MatCheckboxRequiredValidator extends CheckboxRequiredValidator {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatCheckbox} from './checkbox';\nimport {MatCheckboxRequiredValidator} from './checkbox-required-validator';\n\n/** This module is used by both original and MDC-based checkbox implementations. */\n@NgModule({\n exports: [MatCheckboxRequiredValidator],\n declarations: [MatCheckboxRequiredValidator],\n})\n// tslint:disable-next-line:class-name\nexport class _MatCheckboxRequiredValidatorModule {\n}\n\n@NgModule({\n imports: [\n CommonModule, MatRippleModule, MatCommonModule, ObserversModule,\n _MatCheckboxRequiredValidatorModule\n ],\n exports: [MatCheckbox, MatCommonModule, _MatCheckboxRequiredValidatorModule],\n declarations: [MatCheckbox],\n})\nexport class MatCheckboxModule {\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusableOption} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {BACKSPACE, DELETE, SPACE} from '@angular/cdk/keycodes';\nimport {Platform} from '@angular/cdk/platform';\nimport {\n ContentChild,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n} from '@angular/core';\nimport {\n CanColor,\n CanColorCtor,\n CanDisable,\n CanDisableCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n MAT_RIPPLE_GLOBAL_OPTIONS,\n mixinColor,\n mixinDisabled,\n mixinDisableRipple,\n RippleConfig,\n RippleGlobalOptions,\n RippleRenderer,\n RippleTarget,\n} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {take} from 'rxjs/operators';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/** Represents an event fired on an individual `mat-chip`. */\nexport interface MatChipEvent {\n /** The chip the event was fired on. */\n chip: MatChip;\n}\n\n/** Event object emitted by MatChip when selected or deselected. */\nexport class MatChipSelectionChange {\n constructor(\n /** Reference to the chip that emitted the event. */\n public source: MatChip,\n /** Whether the chip that emitted the event is selected. */\n public selected: boolean,\n /** Whether the selection change was a result of a user interaction. */\n public isUserInput = false) { }\n}\n\n\n// Boilerplate for applying mixins to MatChip.\n/** @docs-private */\nclass MatChipBase {\n constructor(public _elementRef: ElementRef) {}\n}\n\nconst _MatChipMixinBase: CanColorCtor & CanDisableRippleCtor & CanDisableCtor & typeof MatChipBase =\n mixinColor(mixinDisableRipple(mixinDisabled(MatChipBase)), 'primary');\n\n/**\n * Dummy directive to add CSS class to chip avatar.\n * @docs-private\n */\n@Directive({\n selector: 'mat-chip-avatar, [matChipAvatar]',\n host: {'class': 'mat-chip-avatar'}\n})\nexport class MatChipAvatar {}\n\n/**\n * Dummy directive to add CSS class to chip trailing icon.\n * @docs-private\n */\n@Directive({\n selector: 'mat-chip-trailing-icon, [matChipTrailingIcon]',\n host: {'class': 'mat-chip-trailing-icon'}\n})\nexport class MatChipTrailingIcon {}\n\n/**\n * Material design styled Chip component. Used inside the MatChipList component.\n */\n@Directive({\n selector: `mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]`,\n inputs: ['color', 'disabled', 'disableRipple'],\n exportAs: 'matChip',\n host: {\n 'class': 'mat-chip',\n '[attr.tabindex]': 'disabled ? null : -1',\n 'role': 'option',\n '[class.mat-chip-selected]': 'selected',\n '[class.mat-chip-with-avatar]': 'avatar',\n '[class.mat-chip-with-trailing-icon]': 'trailingIcon || removeIcon',\n '[class.mat-chip-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationsDisabled',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-selected]': 'ariaSelected',\n '(click)': '_handleClick($event)',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': 'focus()',\n '(blur)': '_blur()',\n },\n})\nexport class MatChip extends _MatChipMixinBase implements FocusableOption, OnDestroy, CanColor,\n CanDisable, CanDisableRipple, RippleTarget {\n\n /** Reference to the RippleRenderer for the chip. */\n private _chipRipple: RippleRenderer;\n\n /**\n * Ripple configuration for ripples that are launched on pointer down. The ripple config\n * is set to the global ripple options since we don't have any configurable options for\n * the chip ripples.\n * @docs-private\n */\n rippleConfig: RippleConfig & RippleGlobalOptions;\n\n /**\n * Whether ripples are disabled on interaction\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || !!this.rippleConfig.disabled;\n }\n\n /** Whether the chip has focus. */\n _hasFocus: boolean = false;\n\n /** Whether animations for the chip are enabled. */\n _animationsDisabled: boolean;\n\n /** Whether the chip list is selectable */\n chipListSelectable: boolean = true;\n\n /** Whether the chip list is in multi-selection mode. */\n _chipListMultiple: boolean = false;\n\n /** The chip avatar */\n @ContentChild(MatChipAvatar, {static: false}) avatar: MatChipAvatar;\n\n /** The chip's trailing icon. */\n @ContentChild(MatChipTrailingIcon, {static: false}) trailingIcon: MatChipTrailingIcon;\n\n /** The chip's remove toggler. */\n @ContentChild(forwardRef(() => MatChipRemove), {static: false}) removeIcon: MatChipRemove;\n\n /** Whether the chip is selected. */\n @Input()\n get selected(): boolean { return this._selected; }\n set selected(value: boolean) {\n const coercedValue = coerceBooleanProperty(value);\n\n if (coercedValue !== this._selected) {\n this._selected = coercedValue;\n this._dispatchSelectionChange();\n }\n }\n protected _selected: boolean = false;\n\n /** The value of the chip. Defaults to the content inside `<mat-chip>` tags. */\n @Input()\n get value(): any {\n return this._value != undefined\n ? this._value\n : this._elementRef.nativeElement.textContent;\n }\n set value(value: any) { this._value = value; }\n protected _value: any;\n\n /**\n * Whether or not the chip is selectable. When a chip is not selectable,\n * changes to its selected state are always ignored. By default a chip is\n * selectable, and it becomes non-selectable if its parent chip list is\n * not selectable.\n */\n @Input()\n get selectable(): boolean { return this._selectable && this.chipListSelectable; }\n set selectable(value: boolean) {\n this._selectable = coerceBooleanProperty(value);\n }\n protected _selectable: boolean = true;\n\n /**\n * Determines whether or not the chip displays the remove styling and emits (removed) events.\n */\n @Input()\n get removable(): boolean { return this._removable; }\n set removable(value: boolean) {\n this._removable = coerceBooleanProperty(value);\n }\n protected _removable: boolean = true;\n\n /** Emits when the chip is focused. */\n readonly _onFocus = new Subject<MatChipEvent>();\n\n /** Emits when the chip is blured. */\n readonly _onBlur = new Subject<MatChipEvent>();\n\n /** Emitted when the chip is selected or deselected. */\n @Output() readonly selectionChange: EventEmitter<MatChipSelectionChange> =\n new EventEmitter<MatChipSelectionChange>();\n\n /** Emitted when the chip is destroyed. */\n @Output() readonly destroyed: EventEmitter<MatChipEvent> = new EventEmitter<MatChipEvent>();\n\n /** Emitted when a chip is to be removed. */\n @Output() readonly removed: EventEmitter<MatChipEvent> = new EventEmitter<MatChipEvent>();\n\n /** The ARIA selected applied to the chip. */\n get ariaSelected(): string | null {\n // Remove the `aria-selected` when the chip is deselected in single-selection mode, because\n // it adds noise to NVDA users where \"not selected\" will be read out for each chip.\n return this.selectable && (this._chipListMultiple || this.selected) ?\n this.selected.toString() : null;\n }\n\n constructor(public _elementRef: ElementRef<HTMLElement>,\n private _ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS)\n globalRippleOptions: RippleGlobalOptions | null,\n // @breaking-change 8.0.0 `animationMode` parameter to become required.\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(_elementRef);\n\n this._addHostClassName();\n\n this._chipRipple = new RippleRenderer(this, _ngZone, _elementRef, platform);\n this._chipRipple.setupTriggerEvents(_elementRef.nativeElement);\n this.rippleConfig = globalRippleOptions || {};\n this._animationsDisabled = animationMode === 'NoopAnimations';\n }\n\n _addHostClassName() {\n const basicChipAttrName = 'mat-basic-chip';\n const element = this._elementRef.nativeElement as HTMLElement;\n\n if (element.hasAttribute(basicChipAttrName) ||\n element.tagName.toLowerCase() === basicChipAttrName) {\n element.classList.add(basicChipAttrName);\n return;\n } else {\n element.classList.add('mat-standard-chip');\n }\n }\n\n ngOnDestroy() {\n this.destroyed.emit({chip: this});\n this._chipRipple._removeTriggerEvents();\n }\n\n /** Selects the chip. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange();\n }\n }\n\n /** Deselects the chip. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._dispatchSelectionChange();\n }\n }\n\n /** Select this chip and emit selected event */\n selectViaInteraction(): void {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange(true);\n }\n }\n\n /** Toggles the current selected state of this chip. */\n toggleSelected(isUserInput: boolean = false): boolean {\n this._selected = !this.selected;\n this._dispatchSelectionChange(isUserInput);\n return this.selected;\n }\n\n /** Allows for programmatic focusing of the chip. */\n focus(): void {\n if (!this._hasFocus) {\n this._elementRef.nativeElement.focus();\n this._onFocus.next({chip: this});\n }\n this._hasFocus = true;\n }\n\n /**\n * Allows for programmatic removal of the chip. Called by the MatChipList when the DELETE or\n * BACKSPACE keys are pressed.\n *\n * Informs any listeners of the removal request. Does not remove the chip from the DOM.\n */\n remove(): void {\n if (this.removable) {\n this.removed.emit({chip: this});\n }\n }\n\n /** Handles click events on the chip. */\n _handleClick(event: Event) {\n if (this.disabled) {\n event.preventDefault();\n } else {\n event.stopPropagation();\n }\n }\n\n /** Handle custom key presses. */\n _handleKeydown(event: KeyboardEvent): void {\n if (this.disabled) {\n return;\n }\n\n switch (event.keyCode) {\n case DELETE:\n case BACKSPACE:\n // If we are removable, remove the focused chip\n this.remove();\n // Always prevent so page navigation does not occur\n event.preventDefault();\n break;\n case SPACE:\n // If we are selectable, toggle the focused chip\n if (this.selectable) {\n this.toggleSelected(true);\n }\n\n // Always prevent space from scrolling the page since the list has focus\n event.preventDefault();\n break;\n }\n }\n\n _blur(): void {\n // When animations are enabled, Angular may end up removing the chip from the DOM a little\n // earlier than usual, causing it to be blurred and throwing off the logic in the chip list\n // that moves focus not the next item. To work around the issue, we defer marking the chip\n // as not focused until the next time the zone stabilizes.\n this._ngZone.onStable\n .asObservable()\n .pipe(take(1))\n .subscribe(() => {\n this._ngZone.run(() => {\n this._hasFocus = false;\n this._onBlur.next({chip: this});\n });\n });\n }\n\n private _dispatchSelectionChange(isUserInput = false) {\n this.selectionChange.emit({\n source: this,\n isUserInput,\n selected: this._selected\n });\n }\n}\n\n\n/**\n * Applies proper (click) support and adds styling for use with the Material Design \"cancel\" icon\n * available at https://material.io/icons/#ic_cancel.\n *\n * Example:\n *\n * `<mat-chip>\n * <mat-icon matChipRemove>cancel</mat-icon>\n * </mat-chip>`\n *\n * You *may* use a custom icon, but you may need to override the `mat-chip-remove` positioning\n * styles to properly center the icon within the chip.\n */\n@Directive({\n selector: '[matChipRemove]',\n host: {\n 'class': 'mat-chip-remove mat-chip-trailing-icon',\n '(click)': '_handleClick($event)',\n }\n})\nexport class MatChipRemove {\n constructor(protected _parentChip: MatChip) {}\n\n /** Calls the parent chip's public `remove()` method if applicable. */\n _handleClick(event: Event): void {\n const parentChip = this._parentChip;\n\n if (parentChip.removable && !parentChip.disabled) {\n parentChip.remove();\n }\n\n // We need to stop event propagation because otherwise the event will bubble up to the\n // form field and cause the `onContainerClick` method to be invoked. This method would then\n // reset the focused chip that has been focused after chip removal. Usually the parent\n // the parent click listener of the `MatChip` would prevent propagation, but it can happen\n // that the chip is being removed before the event bubbles up.\n event.stopPropagation();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/** Default options, for the chips module, that can be overridden. */\nexport interface MatChipsDefaultOptions {\n /** The list of key codes that will trigger a chipEnd event. */\n separatorKeyCodes: number[] | Set<number>;\n}\n\n/** Injection token to be used to override the default options for the chips module. */\nexport const MAT_CHIPS_DEFAULT_OPTIONS =\n new InjectionToken<MatChipsDefaultOptions>('mat-chips-default-options');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n Optional,\n Inject,\n Input,\n} from '@angular/core';\nimport {\n CanColor,\n CanDisable,\n CanDisableRipple,\n CanColorCtor,\n CanDisableCtor,\n CanDisableRippleCtor,\n MatRipple,\n mixinColor,\n mixinDisabled,\n mixinDisableRipple,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n/** Default color palette for round buttons (mat-fab and mat-mini-fab) */\nconst DEFAULT_ROUND_BUTTON_COLOR = 'accent';\n\n/**\n * List of classes to add to MatButton instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'mat-button',\n 'mat-flat-button',\n 'mat-icon-button',\n 'mat-raised-button',\n 'mat-stroked-button',\n 'mat-mini-fab',\n 'mat-fab',\n];\n\n// Boilerplate for applying mixins to MatButton.\n/** @docs-private */\nclass MatButtonBase {\n constructor(public _elementRef: ElementRef) {}\n}\n\nconst _MatButtonMixinBase: CanDisableRippleCtor & CanDisableCtor & CanColorCtor &\n typeof MatButtonBase = mixinColor(mixinDisabled(mixinDisableRipple(MatButtonBase)));\n\n/**\n * Material design button.\n */\n@Component({\n moduleId: module.id,\n selector: `button[mat-button], button[mat-raised-button], button[mat-icon-button],\n button[mat-fab], button[mat-mini-fab], button[mat-stroked-button],\n button[mat-flat-button]`,\n exportAs: 'matButton',\n host: {\n '[attr.disabled]': 'disabled || null',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.css'],\n inputs: ['disabled', 'disableRipple', 'color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatButton extends _MatButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanDisableRipple {\n\n /** Whether the button is round. */\n readonly isRoundButton: boolean = this._hasHostAttributes('mat-fab', 'mat-mini-fab');\n\n /** Whether the button is icon button. */\n readonly isIconButton: boolean = this._hasHostAttributes('mat-icon-button');\n\n /** Reference to the MatRipple instance of the button. */\n @ViewChild(MatRipple, {static: false}) ripple: MatRipple;\n\n constructor(elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode: string) {\n super(elementRef);\n\n // For each of the variant selectors that is prevent in the button's host\n // attributes, add the correct corresponding class.\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this._hasHostAttributes(attr)) {\n (this._getHostElement() as HTMLElement).classList.add(attr);\n }\n }\n\n this._focusMonitor.monitor(this._elementRef, true);\n\n if (this.isRoundButton) {\n this.color = DEFAULT_ROUND_BUTTON_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Focuses the button. */\n focus(): void {\n this._getHostElement().focus();\n }\n\n _getHostElement() {\n return this._elementRef.nativeElement;\n }\n\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n\n /** Gets whether the button has one of the given attributes. */\n _hasHostAttributes(...attributes: string[]) {\n return attributes.some(attribute => this._getHostElement().hasAttribute(attribute));\n }\n}\n\n/**\n * Material design anchor button.\n */\n@Component({\n moduleId: module.id,\n selector: `a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab],\n a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]`,\n exportAs: 'matButton, matAnchor',\n host: {\n // Note that we ignore the user-specified tabindex when it's disabled for\n // consistency with the `mat-button` applied on native buttons where even\n // though they have an index, they're not tabbable.\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n },\n inputs: ['disabled', 'disableRipple', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatAnchor extends MatButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n\n constructor(\n focusMonitor: FocusMonitor,\n elementRef: ElementRef,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode: string) {\n super(elementRef, focusMonitor, animationMode);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatAnchor, MatButton} from './button';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatRippleModule,\n MatCommonModule,\n ],\n exports: [\n MatButton,\n MatAnchor,\n MatCommonModule,\n ],\n declarations: [\n MatButton,\n MatAnchor,\n ],\n})\nexport class MatButtonModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n InjectionToken,\n Inject,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n CanDisableRipple,\n mixinDisableRipple,\n CanDisableRippleCtor,\n} from '@angular/material/core';\n\n\n/** Acceptable types for a button toggle. */\nexport type ToggleType = 'checkbox' | 'radio';\n\n/** Possible appearance styles for the button toggle. */\nexport type MatButtonToggleAppearance = 'legacy' | 'standard';\n\n/**\n * Represents the default options for the button toggle that can be configured\n * using the `MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS` injection token.\n */\nexport interface MatButtonToggleDefaultOptions {\n appearance?: MatButtonToggleAppearance;\n}\n\n/**\n * Injection token that can be used to configure the\n * default options for all button toggles within an app.\n */\nexport const MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS =\n new InjectionToken<MatButtonToggleDefaultOptions>('MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS');\n\n\n\n/**\n * Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nexport const MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatButtonToggleGroup),\n multi: true\n};\n\n/**\n * @deprecated Use `MatButtonToggleGroup` instead.\n * @breaking-change 8.0.0\n */\nexport class MatButtonToggleGroupMultiple {}\n\nlet _uniqueIdCounter = 0;\n\n/** Change event object emitted by MatButtonToggle. */\nexport class MatButtonToggleChange {\n constructor(\n /** The MatButtonToggle that emits the event. */\n public source: MatButtonToggle,\n\n /** The value assigned to the MatButtonToggle. */\n public value: any) {}\n}\n\n/** Exclusive selection button toggle group that behaves like a radio-button group. */\n@Directive({\n selector: 'mat-button-toggle-group',\n providers: [\n MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,\n {provide: MatButtonToggleGroupMultiple, useExisting: MatButtonToggleGroup},\n ],\n host: {\n 'role': 'group',\n 'class': 'mat-button-toggle-group',\n '[attr.aria-disabled]': 'disabled',\n '[class.mat-button-toggle-vertical]': 'vertical',\n '[class.mat-button-toggle-group-appearance-standard]': 'appearance === \"standard\"',\n },\n exportAs: 'matButtonToggleGroup',\n})\nexport class MatButtonToggleGroup implements ControlValueAccessor, OnInit, AfterContentInit {\n private _vertical = false;\n private _multiple = false;\n private _disabled = false;\n private _selectionModel: SelectionModel<MatButtonToggle>;\n\n /**\n * Reference to the raw value that the consumer tried to assign. The real\n * value will exclude any values from this one that don't correspond to a\n * toggle. Useful for the cases where the value is assigned before the toggles\n * have been initialized or at the same that they're being swapped out.\n */\n private _rawValue: any;\n\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 _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n _onTouched: () => any = () => {};\n\n /** Child button toggle buttons. */\n @ContentChildren(forwardRef(() => MatButtonToggle)) _buttonToggles: QueryList<MatButtonToggle>;\n\n /** The appearance for all the buttons in the group. */\n @Input() appearance: MatButtonToggleAppearance;\n\n /** `name` attribute for the underlying `input` element. */\n @Input()\n get name(): string { return this._name; }\n set name(value: string) {\n this._name = value;\n\n if (this._buttonToggles) {\n this._buttonToggles.forEach(toggle => {\n toggle.name = this._name;\n toggle._markForCheck();\n });\n }\n }\n private _name = `mat-button-toggle-group-${_uniqueIdCounter++}`;\n\n /** Whether the toggle group is vertical. */\n @Input()\n get vertical(): boolean { return this._vertical; }\n set vertical(value: boolean) {\n this._vertical = coerceBooleanProperty(value);\n }\n\n /** Value of the toggle group. */\n @Input()\n get value(): any {\n const selected = this._selectionModel ? this._selectionModel.selected : [];\n\n if (this.multiple) {\n return selected.map(toggle => toggle.value);\n }\n\n return selected[0] ? selected[0].value : undefined;\n }\n set value(newValue: any) {\n this._setSelectionByValue(newValue);\n this.valueChange.emit(this.value);\n }\n\n /**\n * Event that emits whenever the value of the group changes.\n * Used to facilitate two-way data binding.\n * @docs-private\n */\n @Output() readonly valueChange = new EventEmitter<any>();\n\n /** Selected button toggles in the group. */\n get selected() {\n const selected = this._selectionModel.selected;\n return this.multiple ? selected : (selected[0] || null);\n }\n\n /** Whether multiple button toggles can be selected. */\n @Input()\n get multiple(): boolean { return this._multiple; }\n set multiple(value: boolean) {\n this._multiple = coerceBooleanProperty(value);\n }\n\n /** Whether multiple button toggle group is disabled. */\n @Input()\n get disabled(): boolean { return this._disabled; }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n\n if (this._buttonToggles) {\n this._buttonToggles.forEach(toggle => toggle._markForCheck());\n }\n }\n\n /** Event emitted when the group's value changes. */\n @Output() readonly change: EventEmitter<MatButtonToggleChange> =\n new EventEmitter<MatButtonToggleChange>();\n\n constructor(\n private _changeDetector: ChangeDetectorRef,\n @Optional() @Inject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS)\n defaultOptions?: MatButtonToggleDefaultOptions) {\n\n this.appearance =\n defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n }\n\n ngOnInit() {\n this._selectionModel = new SelectionModel<MatButtonToggle>(this.multiple, undefined, false);\n }\n\n ngAfterContentInit() {\n this._selectionModel.select(...this._buttonToggles.filter(toggle => toggle.checked));\n }\n\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value Value to be set to the model.\n */\n writeValue(value: any) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent(): void {\n const selected = this.selected;\n const source = Array.isArray(selected) ? selected[selected.length - 1] : selected;\n const event = new MatButtonToggleChange(source!, this.value);\n this._controlValueAccessorChangeFn(event.value);\n this.change.emit(event);\n }\n\n /**\n * Syncs a button toggle's selected state with the model value.\n * @param toggle Toggle to be synced.\n * @param select Whether the toggle should be selected.\n * @param isUserInput Whether the change was a result of a user interaction.\n * @param deferEvents Whether to defer emitting the change events.\n */\n _syncButtonToggle(toggle: MatButtonToggle,\n select: boolean,\n isUserInput = false,\n deferEvents = false) {\n // Deselect the currently-selected toggle, if we're in single-selection\n // mode and the button being toggled isn't selected at the moment.\n if (!this.multiple && this.selected && !toggle.checked) {\n (this.selected as MatButtonToggle).checked = false;\n }\n\n if (select) {\n this._selectionModel.select(toggle);\n } else {\n this._selectionModel.deselect(toggle);\n }\n\n // We need to defer in some cases in order to avoid \"changed after checked errors\", however\n // the side-effect is that we may end up updating the model value out of sequence in others\n // The `deferEvents` flag allows us to decide whether to do it on a case-by-case basis.\n if (deferEvents) {\n Promise.resolve(() => this._updateModelValue(isUserInput));\n } else {\n this._updateModelValue(isUserInput);\n }\n }\n\n /** Checks whether a button toggle is selected. */\n _isSelected(toggle: MatButtonToggle) {\n return this._selectionModel.isSelected(toggle);\n }\n\n /** Determines whether a button toggle should be checked on init. */\n _isPrechecked(toggle: MatButtonToggle) {\n if (typeof this._rawValue === 'undefined') {\n return false;\n }\n\n if (this.multiple && Array.isArray(this._rawValue)) {\n return this._rawValue.some(value => toggle.value != null && value === toggle.value);\n }\n\n return toggle.value === this._rawValue;\n }\n\n /** Updates the selection state of the toggles in the group based on a value. */\n private _setSelectionByValue(value: any|any[]) {\n this._rawValue = value;\n\n if (!this._buttonToggles) {\n return;\n }\n\n if (this.multiple && value) {\n if (!Array.isArray(value)) {\n throw Error('Value must be an array in multiple-selection mode.');\n }\n\n this._clearSelection();\n value.forEach((currentValue: any) => this._selectValue(currentValue));\n } else {\n this._clearSelection();\n this._selectValue(value);\n }\n }\n\n /** Clears the selected toggles. */\n private _clearSelection() {\n this._selectionModel.clear();\n this._buttonToggles.forEach(toggle => toggle.checked = false);\n }\n\n /** Selects a value if there's a toggle that corresponds to it. */\n private _selectValue(value: any) {\n const correspondingOption = this._buttonToggles.find(toggle => {\n return toggle.value != null && toggle.value === value;\n });\n\n if (correspondingOption) {\n correspondingOption.checked = true;\n this._selectionModel.select(correspondingOption);\n }\n }\n\n /** Syncs up the group's value with the model and emits the change event. */\n private _updateModelValue(isUserInput: boolean) {\n // Only emit the change event for user input.\n if (isUserInput) {\n this._emitChangeEvent();\n }\n\n // Note: we emit this one no matter whether it was a user interaction, because\n // it is used by Angular to sync up the two-way data binding.\n this.valueChange.emit(this.value);\n }\n}\n\n// Boilerplate for applying mixins to the MatButtonToggle class.\n/** @docs-private */\nclass MatButtonToggleBase {}\nconst _MatButtonToggleMixinBase: CanDisableRippleCtor & typeof MatButtonToggleBase =\n mixinDisableRipple(MatButtonToggleBase);\n\n/** Single button inside of a toggle group. */\n@Component({\n moduleId: module.id,\n selector: 'mat-button-toggle',\n templateUrl: 'button-toggle.html',\n styleUrls: ['button-toggle.css'],\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matButtonToggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['disableRipple'],\n host: {\n '[class.mat-button-toggle-standalone]': '!buttonToggleGroup',\n '[class.mat-button-toggle-checked]': 'checked',\n '[class.mat-button-toggle-disabled]': 'disabled',\n '[class.mat-button-toggle-appearance-standard]': 'appearance === \"standard\"',\n 'class': 'mat-button-toggle',\n // Always reset the tabindex to -1 so it doesn't conflict with the one on the `button`,\n // but can still receive focus from things like cdkFocusInitial.\n '[attr.tabindex]': '-1',\n '[attr.id]': 'id',\n '[attr.name]': 'null',\n '(focus)': 'focus()',\n }\n})\nexport class MatButtonToggle extends _MatButtonToggleMixinBase implements OnInit,\n CanDisableRipple, OnDestroy {\n\n private _isSingleSelector = false;\n private _checked = false;\n\n /**\n * Attached to the aria-label attribute of the host element. In most cases, aria-labelledby will\n * take precedence so this may be omitted.\n */\n @Input('aria-label') ariaLabel: string;\n\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n @Input('aria-labelledby') ariaLabelledby: string | null = null;\n\n /** Type of the button toggle. Either 'radio' or 'checkbox'. */\n _type: ToggleType;\n\n @ViewChild('button', {static: false}) _buttonElement: ElementRef<HTMLButtonElement>;\n\n /** The parent button toggle group (exclusive selection). Optional. */\n buttonToggleGroup: MatButtonToggleGroup;\n\n /** Unique ID for the underlying `button` element. */\n get buttonId(): string { return `${this.id}-button`; }\n\n /** The unique ID for this button toggle. */\n @Input() id: string;\n\n /** HTML's 'name' attribute used to group radios for unique selection. */\n @Input() name: string;\n\n /** MatButtonToggleGroup reads this to assign its own value. */\n @Input() value: any;\n\n /** Tabindex for the toggle. */\n @Input() tabIndex: number | null;\n\n /** The appearance style of the button. */\n @Input()\n get appearance(): MatButtonToggleAppearance {\n return this.buttonToggleGroup ? this.buttonToggleGroup.appearance : this._appearance;\n }\n set appearance(value: MatButtonToggleAppearance) {\n this._appearance = value;\n }\n private _appearance: MatButtonToggleAppearance;\n\n /** Whether the button is checked. */\n @Input()\n get checked(): boolean {\n return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;\n }\n set checked(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._checked) {\n this._checked = newValue;\n\n if (this.buttonToggleGroup) {\n this.buttonToggleGroup._syncButtonToggle(this, this._checked);\n }\n\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Whether the button is disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled || (this.buttonToggleGroup && this.buttonToggleGroup.disabled);\n }\n set disabled(value: boolean) { this._disabled = coerceBooleanProperty(value); }\n private _disabled: boolean = false;\n\n /** Event emitted when the group value changes. */\n @Output() readonly change: EventEmitter<MatButtonToggleChange> =\n new EventEmitter<MatButtonToggleChange>();\n\n constructor(@Optional() toggleGroup: MatButtonToggleGroup,\n private _changeDetectorRef: ChangeDetectorRef,\n private _elementRef: ElementRef<HTMLElement>,\n private _focusMonitor: FocusMonitor,\n // @breaking-change 8.0.0 `defaultTabIndex` to be made a required parameter.\n @Attribute('tabindex') defaultTabIndex: string,\n @Optional() @Inject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS)\n defaultOptions?: MatButtonToggleDefaultOptions) {\n super();\n\n const parsedTabIndex = Number(defaultTabIndex);\n this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n this.buttonToggleGroup = toggleGroup;\n this.appearance =\n defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n }\n\n ngOnInit() {\n this._isSingleSelector = this.buttonToggleGroup && !this.buttonToggleGroup.multiple;\n this._type = this._isSingleSelector ? 'radio' : 'checkbox';\n this.id = this.id || `mat-button-toggle-${_uniqueIdCounter++}`;\n\n if (this._isSingleSelector) {\n this.name = this.buttonToggleGroup.name;\n }\n\n if (this.buttonToggleGroup && this.buttonToggleGroup._isPrechecked(this)) {\n this.checked = true;\n }\n\n this._focusMonitor.monitor(this._elementRef, true);\n }\n\n ngOnDestroy() {\n const group = this.buttonToggleGroup;\n\n this._focusMonitor.stopMonitoring(this._elementRef);\n\n // Remove the toggle from the selection once it's destroyed. Needs to happen\n // on the next tick in order to avoid \"changed after checked\" errors.\n if (group && group._isSelected(this)) {\n group._syncButtonToggle(this, false, false, true);\n }\n }\n\n /** Focuses the button. */\n focus(): void {\n this._buttonElement.nativeElement.focus();\n }\n\n /** Checks the button toggle due to an interaction with the underlying native button. */\n _onButtonClick() {\n const newChecked = this._isSingleSelector ? true : !this._checked;\n\n if (newChecked !== this._checked) {\n this._checked = newChecked;\n if (this.buttonToggleGroup) {\n this.buttonToggleGroup._syncButtonToggle(this, this._checked, true);\n this.buttonToggleGroup._onTouched();\n }\n }\n // Emit a change event when it's the single selector\n this.change.emit(new MatButtonToggleChange(this, this.value));\n }\n\n /**\n * Marks the button toggle as needing checking for change detection.\n * This method is exposed because the parent button toggle group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When the group value changes, the button will not be notified.\n // Use `markForCheck` to explicit update button toggle's status.\n this._changeDetectorRef.markForCheck();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatButtonToggle, MatButtonToggleGroup} from './button-toggle';\n\n\n@NgModule({\n imports: [MatCommonModule, MatRippleModule],\n exports: [MatCommonModule, MatButtonToggleGroup, MatButtonToggle],\n declarations: [MatButtonToggleGroup, MatButtonToggle],\n})\nexport class MatButtonToggleModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n OnDestroy,\n} from '@angular/core';\nimport {\n CanColor, CanColorCtor,\n FloatLabelType,\n LabelOptions,\n MAT_LABEL_GLOBAL_OPTIONS,\n mixinColor,\n} from '@angular/material/core';\nimport {fromEvent, merge, Subject} from 'rxjs';\nimport {startWith, take, takeUntil} from 'rxjs/operators';\nimport {MatError} from './error';\nimport {matFormFieldAnimations} from './form-field-animations';\nimport {MatFormFieldControl} from './form-field-control';\nimport {\n getMatFormFieldDuplicatedHintError,\n getMatFormFieldMissingControlError,\n getMatFormFieldPlaceholderConflictError,\n} from './form-field-errors';\nimport {MatHint} from './hint';\nimport {MatLabel} from './label';\nimport {MatPlaceholder} from './placeholder';\nimport {MatPrefix} from './prefix';\nimport {MatSuffix} from './suffix';\nimport {Platform} from '@angular/cdk/platform';\nimport {NgControl} from '@angular/forms';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\nlet nextUniqueId = 0;\nconst floatingLabelScale = 0.75;\nconst outlineGapPadding = 5;\n\n\n/**\n * Boilerplate for applying mixins to MatFormField.\n * @docs-private\n */\nclass MatFormFieldBase {\n constructor(public _elementRef: ElementRef) { }\n}\n\n/**\n * Base class to which we're applying the form field mixins.\n * @docs-private\n */\nconst _MatFormFieldMixinBase: CanColorCtor & typeof MatFormFieldBase =\n mixinColor(MatFormFieldBase, 'primary');\n\n/** Possible appearance styles for the form field. */\nexport type MatFormFieldAppearance = 'legacy' | 'standard' | 'fill' | 'outline';\n\n/**\n * Represents the default options for the form field that can be configured\n * using the `MAT_FORM_FIELD_DEFAULT_OPTIONS` injection token.\n */\nexport interface MatFormFieldDefaultOptions {\n appearance?: MatFormFieldAppearance;\n}\n\n/**\n * Injection token that can be used to configure the\n * default options for all form field within an app.\n */\nexport const MAT_FORM_FIELD_DEFAULT_OPTIONS =\n new InjectionToken<MatFormFieldDefaultOptions>('MAT_FORM_FIELD_DEFAULT_OPTIONS');\n\n\n/** Container for form controls that applies Material Design styling and behavior. */\n@Component({\n moduleId: module.id,\n selector: 'mat-form-field',\n exportAs: 'matFormField',\n templateUrl: 'form-field.html',\n // MatInput is a directive and can't have styles, so we need to include its styles here\n // in form-field-input.css. The MatInput styles are fairly minimal so it shouldn't be a\n // big deal for people who aren't using MatInput.\n styleUrls: [\n 'form-field.css',\n 'form-field-fill.css',\n 'form-field-input.css',\n 'form-field-legacy.css',\n 'form-field-outline.css',\n 'form-field-standard.css',\n ],\n animations: [matFormFieldAnimations.transitionMessages],\n host: {\n 'class': 'mat-form-field',\n '[class.mat-form-field-appearance-standard]': 'appearance == \"standard\"',\n '[class.mat-form-field-appearance-fill]': 'appearance == \"fill\"',\n '[class.mat-form-field-appearance-outline]': 'appearance == \"outline\"',\n '[class.mat-form-field-appearance-legacy]': 'appearance == \"legacy\"',\n '[class.mat-form-field-invalid]': '_control.errorState',\n '[class.mat-form-field-can-float]': '_canLabelFloat',\n '[class.mat-form-field-should-float]': '_shouldLabelFloat()',\n '[class.mat-form-field-has-label]': '_hasFloatingLabel()',\n '[class.mat-form-field-hide-placeholder]': '_hideControlPlaceholder()',\n '[class.mat-form-field-disabled]': '_control.disabled',\n '[class.mat-form-field-autofilled]': '_control.autofilled',\n '[class.mat-focused]': '_control.focused',\n '[class.mat-accent]': 'color == \"accent\"',\n '[class.mat-warn]': 'color == \"warn\"',\n '[class.ng-untouched]': '_shouldForward(\"untouched\")',\n '[class.ng-touched]': '_shouldForward(\"touched\")',\n '[class.ng-pristine]': '_shouldForward(\"pristine\")',\n '[class.ng-dirty]': '_shouldForward(\"dirty\")',\n '[class.ng-valid]': '_shouldForward(\"valid\")',\n '[class.ng-invalid]': '_shouldForward(\"invalid\")',\n '[class.ng-pending]': '_shouldForward(\"pending\")',\n '[class._mat-animation-noopable]': '!_animationsEnabled',\n },\n inputs: ['color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class MatFormField extends _MatFormFieldMixinBase\n implements AfterContentInit, AfterContentChecked, AfterViewInit, OnDestroy, CanColor {\n private _labelOptions: LabelOptions;\n\n /**\n * Whether the outline gap needs to be calculated\n * immediately on the next change detection run.\n */\n private _outlineGapCalculationNeededImmediately = false;\n\n /** Whether the outline gap needs to be calculated next time the zone has stabilized. */\n private _outlineGapCalculationNeededOnStable = false;\n\n private _destroyed = new Subject<void>();\n\n /** The form-field appearance style. */\n @Input()\n get appearance(): MatFormFieldAppearance { return this._appearance; }\n set appearance(value: MatFormFieldAppearance) {\n const oldValue = this._appearance;\n\n this._appearance = value || (this._defaults && this._defaults.appearance) || 'legacy';\n\n if (this._appearance === 'outline' && oldValue !== value) {\n this._outlineGapCalculationNeededOnStable = true;\n }\n }\n _appearance: MatFormFieldAppearance;\n\n /** Whether the required marker should be hidden. */\n @Input()\n get hideRequiredMarker(): boolean { return this._hideRequiredMarker; }\n set hideRequiredMarker(value: boolean) {\n this._hideRequiredMarker = coerceBooleanProperty(value);\n }\n private _hideRequiredMarker: boolean;\n\n /** Override for the logic that disables the label animation in certain cases. */\n private _showAlwaysAnimate = false;\n\n /** Whether the floating label should always float or not. */\n get _shouldAlwaysFloat(): boolean {\n return this.floatLabel === 'always' && !this._showAlwaysAnimate;\n }\n\n /** Whether the label can float or not. */\n get _canLabelFloat(): boolean { return this.floatLabel !== 'never'; }\n\n /** State of the mat-hint and mat-error animations. */\n _subscriptAnimationState: string = '';\n\n /** Text for the form field hint. */\n @Input()\n get hintLabel(): string { return this._hintLabel; }\n set hintLabel(value: string) {\n this._hintLabel = value;\n this._processHints();\n }\n private _hintLabel = '';\n\n // Unique id for the hint label.\n _hintLabelId: string = `mat-hint-${nextUniqueId++}`;\n\n // Unique id for the internal form field label.\n _labelId = `mat-form-field-label-${nextUniqueId++}`;\n\n /**\n * Whether the label should always float, never float or float as the user types.\n *\n * Note: only the legacy appearance supports the `never` option. `never` was originally added as a\n * way to make the floating label emulate the behavior of a standard input placeholder. However\n * the form field now supports both floating labels and placeholders. Therefore in the non-legacy\n * appearances the `never` option has been disabled in favor of just using the placeholder.\n */\n @Input()\n get floatLabel(): FloatLabelType {\n return this.appearance !== 'legacy' && this._floatLabel === 'never' ? 'auto' : this._floatLabel;\n }\n set floatLabel(value: FloatLabelType) {\n if (value !== this._floatLabel) {\n this._floatLabel = value || this._labelOptions.float || 'auto';\n this._changeDetectorRef.markForCheck();\n }\n }\n private _floatLabel: FloatLabelType;\n\n /** Whether the Angular animations are enabled. */\n _animationsEnabled: boolean;\n\n /**\n * @deprecated\n * @breaking-change 8.0.0\n */\n @ViewChild('underline', {static: false}) underlineRef: ElementRef;\n\n @ViewChild('connectionContainer', {static: true}) _connectionContainerRef: ElementRef;\n @ViewChild('inputContainer', {static: false}) _inputContainerRef: ElementRef;\n @ViewChild('label', {static: false}) private _label: ElementRef;\n\n @ContentChild(MatFormFieldControl, {static: false}) _controlNonStatic: MatFormFieldControl<any>;\n @ContentChild(MatFormFieldControl, {static: true}) _controlStatic: MatFormFieldControl<any>;\n get _control() {\n // TODO(crisbeto): we need this hacky workaround in order to support both Ivy\n // and ViewEngine. We should clean this up once Ivy is the default renderer.\n return this._explicitFormFieldControl || this._controlNonStatic || this._controlStatic;\n }\n set _control(value) {\n this._explicitFormFieldControl = value;\n }\n private _explicitFormFieldControl: MatFormFieldControl<any>;\n\n @ContentChild(MatLabel, {static: false}) _labelChildNonStatic: MatLabel;\n @ContentChild(MatLabel, {static: true}) _labelChildStatic: MatLabel;\n get _labelChild() {\n return this._labelChildNonStatic || this._labelChildStatic;\n }\n\n @ContentChild(MatPlaceholder, {static: false}) _placeholderChild: MatPlaceholder;\n @ContentChildren(MatError) _errorChildren: QueryList<MatError>;\n @ContentChildren(MatHint) _hintChildren: QueryList<MatHint>;\n @ContentChildren(MatPrefix) _prefixChildren: QueryList<MatPrefix>;\n @ContentChildren(MatSuffix) _suffixChildren: QueryList<MatSuffix>;\n\n constructor(\n public _elementRef: ElementRef, private _changeDetectorRef: ChangeDetectorRef,\n @Optional() @Inject(MAT_LABEL_GLOBAL_OPTIONS) labelOptions: LabelOptions,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) private _defaults:\n MatFormFieldDefaultOptions, private _platform: Platform, private _ngZone: NgZone,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) _animationMode: string) {\n super(_elementRef);\n\n this._labelOptions = labelOptions ? labelOptions : {};\n this.floatLabel = this._labelOptions.float || 'auto';\n this._animationsEnabled = _animationMode !== 'NoopAnimations';\n\n // Set the default through here so we invoke the setter on the first run.\n this.appearance = (_defaults && _defaults.appearance) ? _defaults.appearance : 'legacy';\n }\n\n /**\n * Gets an ElementRef for the element that a overlay attached to the form-field should be\n * positioned relative to.\n */\n getConnectedOverlayOrigin(): ElementRef {\n return this._connectionContainerRef || this._elementRef;\n }\n\n ngAfterContentInit() {\n this._validateControlChild();\n\n const control = this._control;\n\n if (control.controlType) {\n this._elementRef.nativeElement.classList.add(`mat-form-field-type-${control.controlType}`);\n }\n\n // Subscribe to changes in the child control state in order to update the form field UI.\n control.stateChanges.pipe(startWith(null!)).subscribe(() => {\n this._validatePlaceholders();\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n\n // Run change detection if the value changes.\n if (control.ngControl && control.ngControl.valueChanges) {\n control.ngControl.valueChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n // Note that we have to run outside of the `NgZone` explicitly,\n // in order to avoid throwing users into an infinite loop\n // if `zone-patch-rxjs` is included.\n this._ngZone.runOutsideAngular(() => {\n this._ngZone.onStable.asObservable().pipe(takeUntil(this._destroyed)).subscribe(() => {\n if (this._outlineGapCalculationNeededOnStable) {\n this.updateOutlineGap();\n }\n });\n });\n\n // Run change detection and update the outline if the suffix or prefix changes.\n merge(this._prefixChildren.changes, this._suffixChildren.changes).subscribe(() => {\n this._outlineGapCalculationNeededOnStable = true;\n this._changeDetectorRef.markForCheck();\n });\n\n // Re-validate when the number of hints changes.\n this._hintChildren.changes.pipe(startWith(null)).subscribe(() => {\n this._processHints();\n this._changeDetectorRef.markForCheck();\n });\n\n // Update the aria-described by when the number of errors changes.\n this._errorChildren.changes.pipe(startWith(null)).subscribe(() => {\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n\n if (this._dir) {\n this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this.updateOutlineGap());\n }\n }\n\n ngAfterContentChecked() {\n this._validateControlChild();\n if (this._outlineGapCalculationNeededImmediately) {\n this.updateOutlineGap();\n }\n }\n\n ngAfterViewInit() {\n // Avoid animations on load.\n this._subscriptAnimationState = 'enter';\n this._changeDetectorRef.detectChanges();\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** Determines whether a class from the NgControl should be forwarded to the host element. */\n _shouldForward(prop: keyof NgControl): boolean {\n const ngControl = this._control ? this._control.ngControl : null;\n return ngControl && ngControl[prop];\n }\n\n _hasPlaceholder() {\n return !!(this._control && this._control.placeholder || this._placeholderChild);\n }\n\n _hasLabel() {\n return !!this._labelChild;\n }\n\n _shouldLabelFloat() {\n return this._canLabelFloat && (this._control.shouldLabelFloat || this._shouldAlwaysFloat);\n }\n\n _hideControlPlaceholder() {\n // In the legacy appearance the placeholder is promoted to a label if no label is given.\n return this.appearance === 'legacy' && !this._hasLabel() ||\n this._hasLabel() && !this._shouldLabelFloat();\n }\n\n _hasFloatingLabel() {\n // In the legacy appearance the placeholder is promoted to a label if no label is given.\n return this._hasLabel() || this.appearance === 'legacy' && this._hasPlaceholder();\n }\n\n /** Determines whether to display hints or errors. */\n _getDisplayedMessages(): 'error' | 'hint' {\n return (this._errorChildren && this._errorChildren.length > 0 &&\n this._control.errorState) ? 'error' : 'hint';\n }\n\n /** Animates the placeholder up and locks it in position. */\n _animateAndLockLabel(): void {\n if (this._hasFloatingLabel() && this._canLabelFloat) {\n // If animations are disabled, we shouldn't go in here,\n // because the `transitionend` will never fire.\n if (this._animationsEnabled) {\n this._showAlwaysAnimate = true;\n\n fromEvent(this._label.nativeElement, 'transitionend').pipe(take(1)).subscribe(() => {\n this._showAlwaysAnimate = false;\n });\n }\n\n this.floatLabel = 'always';\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * Ensure that there is only one placeholder (either `placeholder` attribute on the child control\n * or child element with the `mat-placeholder` directive).\n */\n private _validatePlaceholders() {\n if (this._control.placeholder && this._placeholderChild) {\n throw getMatFormFieldPlaceholderConflictError();\n }\n }\n\n /** Does any extra processing that is required when handling the hints. */\n private _processHints() {\n this._validateHints();\n this._syncDescribedByIds();\n }\n\n /**\n * Ensure that there is a maximum of one of each `<mat-hint>` alignment specified, with the\n * attribute being considered as `align=\"start\"`.\n */\n private _validateHints() {\n if (this._hintChildren) {\n let startHint: MatHint;\n let endHint: MatHint;\n this._hintChildren.forEach((hint: MatHint) => {\n if (hint.align === 'start') {\n if (startHint || this.hintLabel) {\n throw getMatFormFieldDuplicatedHintError('start');\n }\n startHint = hint;\n } else if (hint.align === 'end') {\n if (endHint) {\n throw getMatFormFieldDuplicatedHintError('end');\n }\n endHint = hint;\n }\n });\n }\n }\n\n /**\n * Sets the list of element IDs that describe the child control. This allows the control to update\n * its `aria-describedby` attribute accordingly.\n */\n private _syncDescribedByIds() {\n if (this._control) {\n let ids: string[] = [];\n\n if (this._getDisplayedMessages() === 'hint') {\n const startHint = this._hintChildren ?\n this._hintChildren.find(hint => hint.align === 'start') : null;\n const endHint = this._hintChildren ?\n this._hintChildren.find(hint => hint.align === 'end') : null;\n\n if (startHint) {\n ids.push(startHint.id);\n } else if (this._hintLabel) {\n ids.push(this._hintLabelId);\n }\n\n if (endHint) {\n ids.push(endHint.id);\n }\n } else if (this._errorChildren) {\n ids = this._errorChildren.map(error => error.id);\n }\n\n this._control.setDescribedByIds(ids);\n }\n }\n\n /** Throws an error if the form field's control is missing. */\n protected _validateControlChild() {\n if (!this._control) {\n throw getMatFormFieldMissingControlError();\n }\n }\n\n /**\n * Updates the width and position of the gap in the outline. Only relevant for the outline\n * appearance.\n */\n updateOutlineGap() {\n const labelEl = this._label ? this._label.nativeElement : null;\n\n if (this.appearance !== 'outline' || !labelEl || !labelEl.children.length ||\n !labelEl.textContent.trim()) {\n return;\n }\n\n if (!this._platform.isBrowser) {\n // getBoundingClientRect isn't available on the server.\n return;\n }\n // If the element is not present in the DOM, the outline gap will need to be calculated\n // the next time it is checked and in the DOM.\n if (!document.documentElement!.contains(this._elementRef.nativeElement)) {\n this._outlineGapCalculationNeededImmediately = true;\n return;\n }\n\n let startWidth = 0;\n let gapWidth = 0;\n\n const container = this._connectionContainerRef.nativeElement;\n const startEls = container.querySelectorAll('.mat-form-field-outline-start');\n const gapEls = container.querySelectorAll('.mat-form-field-outline-gap');\n\n if (this._label && this._label.nativeElement.children.length) {\n const containerRect = container.getBoundingClientRect();\n\n // If the container's width and height are zero, it means that the element is\n // invisible and we can't calculate the outline gap. Mark the element as needing\n // to be checked the next time the zone stabilizes. We can't do this immediately\n // on the next change detection, because even if the element becomes visible,\n // the `ClientRect` won't be reclaculated immediately. We reset the\n // `_outlineGapCalculationNeededImmediately` flag some we don't run the checks twice.\n if (containerRect.width === 0 && containerRect.height === 0) {\n this._outlineGapCalculationNeededOnStable = true;\n this._outlineGapCalculationNeededImmediately = false;\n return;\n }\n\n const containerStart = this._getStartEnd(containerRect);\n const labelStart = this._getStartEnd(labelEl.children[0].getBoundingClientRect());\n let labelWidth = 0;\n\n for (const child of labelEl.children) {\n labelWidth += child.offsetWidth;\n }\n startWidth = labelStart - containerStart - outlineGapPadding;\n gapWidth = labelWidth > 0 ? labelWidth * floatingLabelScale + outlineGapPadding * 2 : 0;\n }\n\n for (let i = 0; i < startEls.length; i++) {\n startEls.item(i).style.width = `${startWidth}px`;\n }\n for (let i = 0; i < gapEls.length; i++) {\n gapEls.item(i).style.width = `${gapWidth}px`;\n }\n\n this._outlineGapCalculationNeededOnStable =\n this._outlineGapCalculationNeededImmediately = false;\n }\n\n /** Gets the start end of the rect considering the current directionality. */\n private _getStartEnd(rect: ClientRect): number {\n return this._dir && this._dir.value === 'rtl' ? rect.right : rect.left;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {MatError} from './error';\nimport {MatFormField} from './form-field';\nimport {MatHint} from './hint';\nimport {MatLabel} from './label';\nimport {MatPlaceholder} from './placeholder';\nimport {MatPrefix} from './prefix';\nimport {MatSuffix} from './suffix';\n\n\n@NgModule({\n declarations: [\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n MatPlaceholder,\n MatPrefix,\n MatSuffix,\n ],\n imports: [\n CommonModule,\n ObserversModule,\n ],\n exports: [\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n MatPlaceholder,\n MatPrefix,\n MatSuffix,\n ],\n})\nexport class MatFormFieldModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ActiveDescendantKeyManager} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n Output,\n QueryList,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanDisableRipple,\n CanDisableRippleCtor,\n MAT_OPTION_PARENT_COMPONENT,\n MatOptgroup,\n MatOption,\n mixinDisableRipple,\n} from '@angular/material/core';\n\n\n/**\n * Autocomplete IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueAutocompleteIdCounter = 0;\n\n/** Event object that is emitted when an autocomplete option is selected. */\nexport class MatAutocompleteSelectedEvent {\n constructor(\n /** Reference to the autocomplete panel that emitted the event. */\n public source: MatAutocomplete,\n /** Option that was selected. */\n public option: MatOption) { }\n}\n\n\n// Boilerplate for applying mixins to MatAutocomplete.\n/** @docs-private */\nclass MatAutocompleteBase {}\nconst _MatAutocompleteMixinBase: CanDisableRippleCtor & typeof MatAutocompleteBase =\n mixinDisableRipple(MatAutocompleteBase);\n\n/** Default `mat-autocomplete` options that can be overridden. */\nexport interface MatAutocompleteDefaultOptions {\n /** Whether the first option should be highlighted when an autocomplete panel is opened. */\n autoActiveFirstOption?: boolean;\n}\n\n/** Injection token to be used to override the default options for `mat-autocomplete`. */\nexport const MAT_AUTOCOMPLETE_DEFAULT_OPTIONS =\n new InjectionToken<MatAutocompleteDefaultOptions>('mat-autocomplete-default-options', {\n providedIn: 'root',\n factory: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY(): MatAutocompleteDefaultOptions {\n return {autoActiveFirstOption: false};\n}\n\n@Component({\n moduleId: module.id,\n selector: 'mat-autocomplete',\n templateUrl: 'autocomplete.html',\n styleUrls: ['autocomplete.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'matAutocomplete',\n inputs: ['disableRipple'],\n host: {\n 'class': 'mat-autocomplete'\n },\n providers: [\n {provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete}\n ]\n})\nexport class MatAutocomplete extends _MatAutocompleteMixinBase implements AfterContentInit,\n CanDisableRipple {\n\n /** Manages active item in option list based on key events. */\n _keyManager: ActiveDescendantKeyManager<MatOption>;\n\n /** Whether the autocomplete panel should be visible, depending on option length. */\n showPanel: boolean = false;\n\n /** Whether the autocomplete panel is open. */\n get isOpen(): boolean { return this._isOpen && this.showPanel; }\n _isOpen: boolean = false;\n\n // The @ViewChild query for TemplateRef here needs to be static because some code paths\n // lead to the overlay being created before change detection has finished for this component.\n // Notably, another component may trigger `focus` on the autocomplete-trigger.\n\n /** @docs-private */\n @ViewChild(TemplateRef, {static: true}) template: TemplateRef<any>;\n\n /** Element for the panel containing the autocomplete options. */\n @ViewChild('panel', {static: false}) panel: ElementRef;\n\n /** @docs-private */\n @ContentChildren(MatOption, {descendants: true}) options: QueryList<MatOption>;\n\n /** @docs-private */\n @ContentChildren(MatOptgroup) optionGroups: QueryList<MatOptgroup>;\n\n /** Function that maps an option's control value to its display value in the trigger. */\n @Input() displayWith: ((value: any) => string) | null = null;\n\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened.\n * Can be configured globally through the `MAT_AUTOCOMPLETE_DEFAULT_OPTIONS` token.\n */\n @Input()\n get autoActiveFirstOption(): boolean { return this._autoActiveFirstOption; }\n set autoActiveFirstOption(value: boolean) {\n this._autoActiveFirstOption = coerceBooleanProperty(value);\n }\n private _autoActiveFirstOption: boolean;\n\n /**\n * Specify the width of the autocomplete panel. Can be any CSS sizing value, otherwise it will\n * match the width of its host.\n */\n @Input() panelWidth: string | number;\n\n /** Event that is emitted whenever an option from the list is selected. */\n @Output() readonly optionSelected: EventEmitter<MatAutocompleteSelectedEvent> =\n new EventEmitter<MatAutocompleteSelectedEvent>();\n\n /** Event that is emitted when the autocomplete panel is opened. */\n @Output() readonly opened: EventEmitter<void> = new EventEmitter<void>();\n\n /** Event that is emitted when the autocomplete panel is closed. */\n @Output() readonly closed: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * Takes classes set on the host mat-autocomplete element and applies them to the panel\n * inside the overlay container to allow for easy styling.\n */\n @Input('class')\n set classList(value: string) {\n if (value && value.length) {\n this._classList = value.split(' ').reduce((classList, className) => {\n classList[className.trim()] = true;\n return classList;\n }, {} as {[key: string]: boolean});\n } else {\n this._classList = {};\n }\n\n this._setVisibilityClasses(this._classList);\n this._elementRef.nativeElement.className = '';\n }\n _classList: {[key: string]: boolean} = {};\n\n /** Unique ID to be used by autocomplete trigger's \"aria-owns\" property. */\n id: string = `mat-autocomplete-${_uniqueAutocompleteIdCounter++}`;\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _elementRef: ElementRef<HTMLElement>,\n @Inject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS) defaults: MatAutocompleteDefaultOptions) {\n super();\n\n this._autoActiveFirstOption = !!defaults.autoActiveFirstOption;\n }\n\n ngAfterContentInit() {\n this._keyManager = new ActiveDescendantKeyManager<MatOption>(this.options).withWrap();\n // Set the initial visibility state.\n this._setVisibility();\n }\n\n /**\n * Sets the panel scrollTop. This allows us to manually scroll to display options\n * above or below the fold, as they are not actually being focused when active.\n */\n _setScrollTop(scrollTop: number): void {\n if (this.panel) {\n this.panel.nativeElement.scrollTop = scrollTop;\n }\n }\n\n /** Returns the panel's scrollTop. */\n _getScrollTop(): number {\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\n }\n\n /** Panel should hide itself when the option list is empty. */\n _setVisibility() {\n this.showPanel = !!this.options.length;\n this._setVisibilityClasses(this._classList);\n this._changeDetectorRef.markForCheck();\n }\n\n /** Emits the `select` event. */\n _emitSelectEvent(option: MatOption): void {\n const event = new MatAutocompleteSelectedEvent(this, option);\n this.optionSelected.emit(event);\n }\n\n /** Sets the autocomplete visibility classes on a classlist based on the panel is visible. */\n private _setVisibilityClasses(classList: {[key: string]: boolean}) {\n classList['mat-autocomplete-visible'] = this.showPanel;\n classList['mat-autocomplete-hidden'] = !this.showPanel;\n }\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef} from '@angular/core';\n\n/**\n * Directive applied to an element to make it usable\n * as a connection point for an autocomplete panel.\n */\n@Directive({\n selector: '[matAutocompleteOrigin]',\n exportAs: 'matAutocompleteOrigin',\n})\nexport class MatAutocompleteOrigin {\n constructor(\n /** Reference to the element on which the directive is applied. */\n public elementRef: ElementRef<HTMLElement>) { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {MatOptionModule, MatCommonModule} from '@angular/material/core';\nimport {MatAutocomplete} from './autocomplete';\nimport {\n MatAutocompleteTrigger,\n MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER,\n} from './autocomplete-trigger';\nimport {MatAutocompleteOrigin} from './autocomplete-origin';\n\n@NgModule({\n imports: [MatOptionModule, OverlayModule, MatCommonModule, CommonModule],\n exports: [\n MatAutocomplete,\n MatOptionModule,\n MatAutocompleteTrigger,\n MatAutocompleteOrigin,\n MatCommonModule\n ],\n declarations: [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin],\n providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER],\n})\nexport class MatAutocompleteModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {AriaDescriber} from '@angular/cdk/a11y';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n Directive,\n ElementRef,\n Inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Optional,\n Renderer2,\n SimpleChanges,\n isDevMode,\n} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled, ThemePalette} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\nlet nextId = 0;\n\n// Boilerplate for applying mixins to MatBadge.\n/** @docs-private */\nclass MatBadgeBase {}\n\nconst _MatBadgeMixinBase:\n CanDisableCtor & typeof MatBadgeBase = mixinDisabled(MatBadgeBase);\n\nexport type MatBadgePosition = 'above after' | 'above before' | 'below before' | 'below after';\nexport type MatBadgeSize = 'small' | 'medium' | 'large';\n\n/** Directive to display a text badge. */\n@Directive({\n selector: '[matBadge]',\n inputs: ['disabled: matBadgeDisabled'],\n host: {\n 'class': 'mat-badge',\n '[class.mat-badge-overlap]': 'overlap',\n '[class.mat-badge-above]': 'isAbove()',\n '[class.mat-badge-below]': '!isAbove()',\n '[class.mat-badge-before]': '!isAfter()',\n '[class.mat-badge-after]': 'isAfter()',\n '[class.mat-badge-small]': 'size === \"small\"',\n '[class.mat-badge-medium]': 'size === \"medium\"',\n '[class.mat-badge-large]': 'size === \"large\"',\n '[class.mat-badge-hidden]': 'hidden || !_hasContent',\n '[class.mat-badge-disabled]': 'disabled',\n },\n})\nexport class MatBadge extends _MatBadgeMixinBase implements OnDestroy, OnChanges, CanDisable {\n /** Whether the badge has any content. */\n _hasContent = false;\n\n /** The color of the badge. Can be `primary`, `accent`, or `warn`. */\n @Input('matBadgeColor')\n get color(): ThemePalette { return this._color; }\n set color(value: ThemePalette) {\n this._setColor(value);\n this._color = value;\n }\n private _color: ThemePalette = 'primary';\n\n /** Whether the badge should overlap its contents or not */\n @Input('matBadgeOverlap')\n get overlap(): boolean { return this._overlap; }\n set overlap(val: boolean) {\n this._overlap = coerceBooleanProperty(val);\n }\n private _overlap: boolean = true;\n\n /**\n * Position the badge should reside.\n * Accepts any combination of 'above'|'below' and 'before'|'after'\n */\n @Input('matBadgePosition') position: MatBadgePosition = 'above after';\n\n /** The content for the badge */\n @Input('matBadge') content: string;\n\n /** Message used to describe the decorated element via aria-describedby */\n @Input('matBadgeDescription')\n get description(): string { return this._description; }\n set description(newDescription: string) {\n if (newDescription !== this._description) {\n const badgeElement = this._badgeElement;\n this._updateHostAriaDescription(newDescription, this._description);\n this._description = newDescription;\n\n if (badgeElement) {\n newDescription ? badgeElement.setAttribute('aria-label', newDescription) :\n badgeElement.removeAttribute('aria-label');\n }\n }\n }\n private _description: string;\n\n /** Size of the badge. Can be 'small', 'medium', or 'large'. */\n @Input('matBadgeSize') size: MatBadgeSize = 'medium';\n\n /** Whether the badge is hidden. */\n @Input('matBadgeHidden')\n get hidden(): boolean { return this._hidden; }\n set hidden(val: boolean) {\n this._hidden = coerceBooleanProperty(val);\n }\n private _hidden: boolean;\n\n /** Unique id for the badge */\n _id: number = nextId++;\n\n private _badgeElement: HTMLElement | undefined;\n\n constructor(\n private _ngZone: NgZone,\n private _elementRef: ElementRef<HTMLElement>,\n private _ariaDescriber: AriaDescriber,\n private _renderer: Renderer2,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) private _animationMode?: string) {\n super();\n\n if (isDevMode()) {\n const nativeElement = _elementRef.nativeElement;\n if (nativeElement.nodeType !== nativeElement.ELEMENT_NODE) {\n throw Error('matBadge must be attached to an element node.');\n }\n }\n }\n\n /** Whether the badge is above the host or not */\n isAbove(): boolean {\n return this.position.indexOf('below') === -1;\n }\n\n /** Whether the badge is after the host or not */\n isAfter(): boolean {\n return this.position.indexOf('before') === -1;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const contentChange = changes['content'];\n\n if (contentChange) {\n const value = contentChange.currentValue;\n this._hasContent = value != null && `${value}`.trim().length > 0;\n this._updateTextContent();\n }\n }\n\n ngOnDestroy() {\n const badgeElement = this._badgeElement;\n\n if (badgeElement) {\n if (this.description) {\n this._ariaDescriber.removeDescription(badgeElement, this.description);\n }\n\n // When creating a badge through the Renderer, Angular will keep it in an index.\n // We have to destroy it ourselves, otherwise it'll be retained in memory.\n if (this._renderer.destroyNode) {\n this._renderer.destroyNode(badgeElement);\n }\n }\n }\n\n /**\n * Gets the element into which the badge's content is being rendered.\n * Undefined if the element hasn't been created (e.g. if the badge doesn't have content).\n */\n getBadgeElement(): HTMLElement | undefined {\n return this._badgeElement;\n }\n\n /** Injects a span element into the DOM with the content. */\n private _updateTextContent(): HTMLSpanElement {\n if (!this._badgeElement) {\n this._badgeElement = this._createBadgeElement();\n } else {\n this._badgeElement.textContent = this.content;\n }\n return this._badgeElement;\n }\n\n /** Creates the badge element */\n private _createBadgeElement(): HTMLElement {\n const badgeElement = this._renderer.createElement('span');\n const activeClass = 'mat-badge-active';\n const contentClass = 'mat-badge-content';\n\n // Clear any existing badges which may have persisted from a server-side render.\n this._clearExistingBadges(contentClass);\n badgeElement.setAttribute('id', `mat-badge-content-${this._id}`);\n badgeElement.classList.add(contentClass);\n badgeElement.textContent = this.content;\n\n if (this._animationMode === 'NoopAnimations') {\n badgeElement.classList.add('_mat-animation-noopable');\n }\n\n if (this.description) {\n badgeElement.setAttribute('aria-label', this.description);\n }\n\n this._elementRef.nativeElement.appendChild(badgeElement);\n\n // animate in after insertion\n if (typeof requestAnimationFrame === 'function' && this._animationMode !== 'NoopAnimations') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n badgeElement.classList.add(activeClass);\n });\n });\n } else {\n badgeElement.classList.add(activeClass);\n }\n\n return badgeElement;\n }\n\n /** Sets the aria-label property on the element */\n private _updateHostAriaDescription(newDescription: string, oldDescription: string): void {\n // ensure content available before setting label\n const content = this._updateTextContent();\n\n if (oldDescription) {\n this._ariaDescriber.removeDescription(content, oldDescription);\n }\n\n if (newDescription) {\n this._ariaDescriber.describe(content, newDescription);\n }\n }\n\n /** Adds css theme class given the color to the component host */\n private _setColor(colorPalette: ThemePalette) {\n if (colorPalette !== this._color) {\n if (this._color) {\n this._elementRef.nativeElement.classList.remove(`mat-badge-${this._color}`);\n }\n if (colorPalette) {\n this._elementRef.nativeElement.classList.add(`mat-badge-${colorPalette}`);\n }\n }\n }\n\n /** Clears any existing badges that might be left over from server-side rendering. */\n private _clearExistingBadges(cssClass: string) {\n const element = this._elementRef.nativeElement;\n let childCount = element.children.length;\n\n // Use a reverse while, because we'll be removing elements from the list as we're iterating.\n while (childCount--) {\n const currentChild = element.children[childCount];\n\n if (currentChild.classList.contains(cssClass)) {\n element.removeChild(currentChild);\n }\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {A11yModule} from '@angular/cdk/a11y';\nimport {MatBadge} from './badge';\n\n\n@NgModule({\n imports: [\n A11yModule,\n MatCommonModule\n ],\n exports: [MatBadge],\n declarations: [MatBadge],\n})\nexport class MatBadgeModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Direction} from '@angular/cdk/bidi';\nimport {ScrollStrategy} from '@angular/cdk/overlay';\nimport {InjectionToken, ViewContainerRef} from '@angular/core';\n\n/** Injection token that can be used to access the data that was passed in to a bottom sheet. */\nexport const MAT_BOTTOM_SHEET_DATA = new InjectionToken<any>('MatBottomSheetData');\n\n/**\n * Configuration used when opening a bottom sheet.\n */\nexport class MatBottomSheetConfig<D = any> {\n /** The view container to place the overlay for the bottom sheet into. */\n viewContainerRef?: ViewContainerRef;\n\n /** Extra CSS classes to be added to the bottom sheet container. */\n panelClass?: string | string[];\n\n /** Text layout direction for the bottom sheet. */\n direction?: Direction;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n /** Whether the bottom sheet has a backdrop. */\n hasBackdrop?: boolean = true;\n\n /** Custom class for the backdrop. */\n backdropClass?: string;\n\n /** Whether the user can use escape or clicking outside to close the bottom sheet. */\n disableClose?: boolean = false;\n\n /** Aria label to assign to the bottom sheet element. */\n ariaLabel?: string | null = null;\n\n /**\n * Whether the bottom sheet should close when the user goes backwards/forwards in history.\n * Note that this usually doesn't include clicking on links (unless the user is using\n * the `HashLocationStrategy`).\n */\n closeOnNavigation?: boolean = true;\n\n // Note that this is disabled by default, because while the a11y recommendations are to focus\n // the first focusable element, doing so prevents screen readers from reading out the\n // rest of the bottom sheet content.\n /** Whether the bottom sheet should focus the first focusable element on open. */\n autoFocus?: boolean = false;\n\n /**\n * Whether the bottom sheet should restore focus to the\n * previously-focused element, after it's closed.\n */\n restoreFocus?: boolean = true;\n\n /** Scroll strategy to be used for the bottom sheet. */\n scrollStrategy?: ScrollStrategy;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\nimport {AnimationCurves, AnimationDurations} from '@angular/material/core';\n\n/** Animations used by the Material bottom sheet. */\nexport const matBottomSheetAnimations: {\n readonly bottomSheetState: AnimationTriggerMetadata;\n} = {\n /** Animation that shows and hides a bottom sheet. */\n bottomSheetState: trigger('state', [\n state('void, hidden', style({transform: 'translateY(100%)'})),\n state('visible', style({transform: 'translateY(0%)'})),\n transition('visible => void, visible => hidden',\n animate(`${AnimationDurations.COMPLEX} ${AnimationCurves.ACCELERATION_CURVE}`)),\n transition('void => visible',\n animate(`${AnimationDurations.EXITING} ${AnimationCurves.DECELERATION_CURVE}`)),\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ComponentRef,\n EmbeddedViewRef,\n ViewChild,\n OnDestroy,\n ElementRef,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n ChangeDetectorRef,\n EventEmitter,\n Inject,\n Optional,\n} from '@angular/core';\nimport {AnimationEvent} from '@angular/animations';\nimport {\n BasePortalOutlet,\n ComponentPortal,\n TemplatePortal,\n CdkPortalOutlet,\n} from '@angular/cdk/portal';\nimport {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';\nimport {MatBottomSheetConfig} from './bottom-sheet-config';\nimport {matBottomSheetAnimations} from './bottom-sheet-animations';\nimport {Subscription} from 'rxjs';\nimport {DOCUMENT} from '@angular/common';\nimport {FocusTrap, FocusTrapFactory} from '@angular/cdk/a11y';\n\n// TODO(crisbeto): consolidate some logic between this, MatDialog and MatSnackBar\n\n/**\n * Internal component that wraps user-provided bottom sheet content.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-bottom-sheet-container',\n templateUrl: 'bottom-sheet-container.html',\n styleUrls: ['bottom-sheet-container.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n animations: [matBottomSheetAnimations.bottomSheetState],\n host: {\n 'class': 'mat-bottom-sheet-container',\n 'tabindex': '-1',\n 'role': 'dialog',\n 'aria-modal': 'true',\n '[attr.aria-label]': 'bottomSheetConfig?.ariaLabel',\n '[@state]': '_animationState',\n '(@state.start)': '_onAnimationStart($event)',\n '(@state.done)': '_onAnimationDone($event)'\n },\n})\nexport class MatBottomSheetContainer extends BasePortalOutlet implements OnDestroy {\n private _breakpointSubscription: Subscription;\n\n /** The portal outlet inside of this container into which the content will be loaded. */\n @ViewChild(CdkPortalOutlet, {static: true}) _portalOutlet: CdkPortalOutlet;\n\n /** The state of the bottom sheet animations. */\n _animationState: 'void' | 'visible' | 'hidden' = 'void';\n\n /** Emits whenever the state of the animation changes. */\n _animationStateChanged = new EventEmitter<AnimationEvent>();\n\n /** The class that traps and manages focus within the bottom sheet. */\n private _focusTrap: FocusTrap;\n\n /** Element that was focused before the bottom sheet was opened. */\n private _elementFocusedBeforeOpened: HTMLElement | null = null;\n\n /** Server-side rendering-compatible reference to the global document object. */\n private _document: Document;\n\n /** Whether the component has been destroyed. */\n private _destroyed: boolean;\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n private _changeDetectorRef: ChangeDetectorRef,\n private _focusTrapFactory: FocusTrapFactory,\n breakpointObserver: BreakpointObserver,\n @Optional() @Inject(DOCUMENT) document: any,\n /** The bottom sheet configuration. */\n public bottomSheetConfig: MatBottomSheetConfig) {\n super();\n\n this._document = document;\n this._breakpointSubscription = breakpointObserver\n .observe([Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\n .subscribe(() => {\n this._toggleClass('mat-bottom-sheet-container-medium',\n breakpointObserver.isMatched(Breakpoints.Medium));\n this._toggleClass('mat-bottom-sheet-container-large',\n breakpointObserver.isMatched(Breakpoints.Large));\n this._toggleClass('mat-bottom-sheet-container-xlarge',\n breakpointObserver.isMatched(Breakpoints.XLarge));\n });\n }\n\n /** Attach a component portal as content to this bottom sheet container. */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n this._validatePortalAttached();\n this._setPanelClass();\n this._savePreviouslyFocusedElement();\n return this._portalOutlet.attachComponentPortal(portal);\n }\n\n /** Attach a template portal as content to this bottom sheet container. */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n this._validatePortalAttached();\n this._setPanelClass();\n this._savePreviouslyFocusedElement();\n return this._portalOutlet.attachTemplatePortal(portal);\n }\n\n /** Begin animation of bottom sheet entrance into view. */\n enter(): void {\n if (!this._destroyed) {\n this._animationState = 'visible';\n this._changeDetectorRef.detectChanges();\n }\n }\n\n /** Begin animation of the bottom sheet exiting from view. */\n exit(): void {\n if (!this._destroyed) {\n this._animationState = 'hidden';\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this._breakpointSubscription.unsubscribe();\n this._destroyed = true;\n }\n\n _onAnimationDone(event: AnimationEvent) {\n if (event.toState === 'hidden') {\n this._restoreFocus();\n } else if (event.toState === 'visible') {\n this._trapFocus();\n }\n\n this._animationStateChanged.emit(event);\n }\n\n _onAnimationStart(event: AnimationEvent) {\n this._animationStateChanged.emit(event);\n }\n\n private _toggleClass(cssClass: string, add: boolean) {\n const classList = this._elementRef.nativeElement.classList;\n add ? classList.add(cssClass) : classList.remove(cssClass);\n }\n\n private _validatePortalAttached() {\n if (this._portalOutlet.hasAttached()) {\n throw Error('Attempting to attach bottom sheet content after content is already attached');\n }\n }\n\n private _setPanelClass() {\n const element: HTMLElement = this._elementRef.nativeElement;\n const panelClass = this.bottomSheetConfig.panelClass;\n\n if (Array.isArray(panelClass)) {\n // Note that we can't use a spread here, because IE doesn't support multiple arguments.\n panelClass.forEach(cssClass => element.classList.add(cssClass));\n } else if (panelClass) {\n element.classList.add(panelClass);\n }\n }\n\n\n /** Moves the focus inside the focus trap. */\n private _trapFocus() {\n if (!this._focusTrap) {\n this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);\n }\n\n if (this.bottomSheetConfig.autoFocus) {\n this._focusTrap.focusInitialElementWhenReady();\n }\n }\n\n /** Restores focus to the element that was focused before the bottom sheet was opened. */\n private _restoreFocus() {\n const toFocus = this._elementFocusedBeforeOpened;\n\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\n if (this.bottomSheetConfig.restoreFocus && toFocus && typeof toFocus.focus === 'function') {\n toFocus.focus();\n }\n\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n }\n\n /** Saves a reference to the element that was focused before the bottom sheet was opened. */\n private _savePreviouslyFocusedElement() {\n this._elementFocusedBeforeOpened = this._document.activeElement as HTMLElement;\n\n // The `focus` method isn't available during server-side rendering.\n if (this._elementRef.nativeElement.focus) {\n Promise.resolve().then(() => this._elementRef.nativeElement.focus());\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatBottomSheetContainer} from './bottom-sheet-container';\n\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n MatCommonModule,\n PortalModule,\n ],\n exports: [MatBottomSheetContainer, MatCommonModule],\n declarations: [MatBottomSheetContainer],\n entryComponents: [MatBottomSheetContainer],\n})\nexport class MatBottomSheetModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Location} from '@angular/common';\nimport {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {OverlayRef} from '@angular/cdk/overlay';\nimport {merge, Observable, Subject} from 'rxjs';\nimport {filter, take} from 'rxjs/operators';\nimport {MatBottomSheetContainer} from './bottom-sheet-container';\n\n\n/**\n * Reference to a bottom sheet dispatched from the bottom sheet service.\n */\nexport class MatBottomSheetRef<T = any, R = any> {\n /** Instance of the component making up the content of the bottom sheet. */\n instance: T;\n\n /**\n * Instance of the component into which the bottom sheet content is projected.\n * @docs-private\n */\n containerInstance: MatBottomSheetContainer;\n\n /** Whether the user is allowed to close the bottom sheet. */\n disableClose: boolean | undefined;\n\n /** Subject for notifying the user that the bottom sheet has been dismissed. */\n private readonly _afterDismissed = new Subject<R | undefined>();\n\n /** Subject for notifying the user that the bottom sheet has opened and appeared. */\n private readonly _afterOpened = new Subject<void>();\n\n /** Result to be passed down to the `afterDismissed` stream. */\n private _result: R | undefined;\n\n /** Handle to the timeout that's running as a fallback in case the exit animation doesn't fire. */\n private _closeFallbackTimeout: number;\n\n constructor(\n containerInstance: MatBottomSheetContainer,\n private _overlayRef: OverlayRef,\n // @breaking-change 8.0.0 `_location` parameter to be removed.\n _location?: Location) {\n this.containerInstance = containerInstance;\n this.disableClose = containerInstance.bottomSheetConfig.disableClose;\n\n // Emit when opening animation completes\n containerInstance._animationStateChanged.pipe(\n filter(event => event.phaseName === 'done' && event.toState === 'visible'),\n take(1)\n )\n .subscribe(() => {\n this._afterOpened.next();\n this._afterOpened.complete();\n });\n\n // Dispose overlay when closing animation is complete\n containerInstance._animationStateChanged\n .pipe(filter(event => event.phaseName === 'done' && event.toState === 'hidden'), take(1))\n .subscribe(() => {\n clearTimeout(this._closeFallbackTimeout);\n _overlayRef.dispose();\n });\n\n _overlayRef.detachments().pipe(take(1)).subscribe(() => {\n this._afterDismissed.next(this._result);\n this._afterDismissed.complete();\n });\n\n merge(\n _overlayRef.backdropClick(),\n _overlayRef.keydownEvents().pipe(filter(event => event.keyCode === ESCAPE))\n ).subscribe(event => {\n if (!this.disableClose &&\n (event.type !== 'keydown' || !hasModifierKey(event as KeyboardEvent))) {\n event.preventDefault();\n this.dismiss();\n }\n });\n }\n\n /**\n * Dismisses the bottom sheet.\n * @param result Data to be passed back to the bottom sheet opener.\n */\n dismiss(result?: R): void {\n if (!this._afterDismissed.closed) {\n // Transition the backdrop in parallel to the bottom sheet.\n this.containerInstance._animationStateChanged.pipe(\n filter(event => event.phaseName === 'start'),\n take(1)\n ).subscribe(event => {\n // The logic that disposes of the overlay depends on the exit animation completing, however\n // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback\n // timeout which will clean everything up if the animation hasn't fired within the specified\n // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the\n // vast majority of cases the timeout will have been cleared before it has fired.\n this._closeFallbackTimeout = setTimeout(() => {\n this._overlayRef.dispose();\n }, event.totalTime + 100);\n\n this._overlayRef.detachBackdrop();\n });\n\n this._result = result;\n this.containerInstance.exit();\n }\n }\n\n /** Gets an observable that is notified when the bottom sheet is finished closing. */\n afterDismissed(): Observable<R | undefined> {\n return this._afterDismissed.asObservable();\n }\n\n /** Gets an observable that is notified when the bottom sheet has opened and appeared. */\n afterOpened(): Observable<void> {\n return this._afterOpened.asObservable();\n }\n\n /**\n * Gets an observable that emits when the overlay's backdrop has been clicked.\n */\n backdropClick(): Observable<MouseEvent> {\n return this._overlayRef.backdropClick();\n }\n\n /**\n * Gets an observable that emits when keydown events are targeted on the overlay.\n */\n keydownEvents(): Observable<KeyboardEvent> {\n return this._overlayRef.keydownEvents();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {Overlay, OverlayConfig, OverlayRef} from '@angular/cdk/overlay';\nimport {ComponentPortal, ComponentType, PortalInjector, TemplatePortal} from '@angular/cdk/portal';\nimport {\n ComponentRef,\n Injectable,\n Injector,\n Optional,\n SkipSelf,\n TemplateRef,\n InjectionToken,\n Inject,\n OnDestroy,\n} from '@angular/core';\nimport {Location} from '@angular/common';\nimport {of as observableOf} from 'rxjs';\nimport {MAT_BOTTOM_SHEET_DATA, MatBottomSheetConfig} from './bottom-sheet-config';\nimport {MatBottomSheetContainer} from './bottom-sheet-container';\nimport {MatBottomSheetModule} from './bottom-sheet-module';\nimport {MatBottomSheetRef} from './bottom-sheet-ref';\n\n\n/** Injection token that can be used to specify default bottom sheet options. */\nexport const MAT_BOTTOM_SHEET_DEFAULT_OPTIONS =\n new InjectionToken<MatBottomSheetConfig>('mat-bottom-sheet-default-options');\n\n/**\n * Service to trigger Material Design bottom sheets.\n */\n@Injectable({providedIn: MatBottomSheetModule})\nexport class MatBottomSheet implements OnDestroy {\n private _bottomSheetRefAtThisLevel: MatBottomSheetRef<any> | null = null;\n\n /** Reference to the currently opened bottom sheet. */\n get _openedBottomSheetRef(): MatBottomSheetRef<any> | null {\n const parent = this._parentBottomSheet;\n return parent ? parent._openedBottomSheetRef : this._bottomSheetRefAtThisLevel;\n }\n\n set _openedBottomSheetRef(value: MatBottomSheetRef<any> | null) {\n if (this._parentBottomSheet) {\n this._parentBottomSheet._openedBottomSheetRef = value;\n } else {\n this._bottomSheetRefAtThisLevel = value;\n }\n }\n\n constructor(\n private _overlay: Overlay,\n private _injector: Injector,\n @Optional() @SkipSelf() private _parentBottomSheet: MatBottomSheet,\n @Optional() private _location?: Location,\n @Optional() @Inject(MAT_BOTTOM_SHEET_DEFAULT_OPTIONS)\n private _defaultOptions?: MatBottomSheetConfig) {}\n\n open<T, D = any, R = any>(component: ComponentType<T>,\n config?: MatBottomSheetConfig<D>): MatBottomSheetRef<T, R>;\n open<T, D = any, R = any>(template: TemplateRef<T>,\n config?: MatBottomSheetConfig<D>): MatBottomSheetRef<T, R>;\n\n open<T, D = any, R = any>(componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: MatBottomSheetConfig<D>): MatBottomSheetRef<T, R> {\n\n const _config =\n _applyConfigDefaults(this._defaultOptions || new MatBottomSheetConfig(), config);\n const overlayRef = this._createOverlay(_config);\n const container = this._attachContainer(overlayRef, _config);\n const ref = new MatBottomSheetRef<T, R>(container, overlayRef, this._location);\n\n if (componentOrTemplateRef instanceof TemplateRef) {\n container.attachTemplatePortal(new TemplatePortal<T>(componentOrTemplateRef, null!, {\n $implicit: _config.data,\n bottomSheetRef: ref\n } as any));\n } else {\n const portal = new ComponentPortal(componentOrTemplateRef, undefined,\n this._createInjector(_config, ref));\n const contentRef = container.attachComponentPortal(portal);\n ref.instance = contentRef.instance;\n }\n\n // When the bottom sheet is dismissed, clear the reference to it.\n ref.afterDismissed().subscribe(() => {\n // Clear the bottom sheet ref if it hasn't already been replaced by a newer one.\n if (this._openedBottomSheetRef == ref) {\n this._openedBottomSheetRef = null;\n }\n });\n\n if (this._openedBottomSheetRef) {\n // If a bottom sheet is already in view, dismiss it and enter the\n // new bottom sheet after exit animation is complete.\n this._openedBottomSheetRef.afterDismissed().subscribe(() => ref.containerInstance.enter());\n this._openedBottomSheetRef.dismiss();\n } else {\n // If no bottom sheet is in view, enter the new bottom sheet.\n ref.containerInstance.enter();\n }\n\n this._openedBottomSheetRef = ref;\n\n return ref;\n }\n\n /**\n * Dismisses the currently-visible bottom sheet.\n */\n dismiss(): void {\n if (this._openedBottomSheetRef) {\n this._openedBottomSheetRef.dismiss();\n }\n }\n\n ngOnDestroy() {\n if (this._bottomSheetRefAtThisLevel) {\n this._bottomSheetRefAtThisLevel.dismiss();\n }\n }\n\n /**\n * Attaches the bottom sheet container component to the overlay.\n */\n private _attachContainer(overlayRef: OverlayRef,\n config: MatBottomSheetConfig): MatBottomSheetContainer {\n\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n const injector = new PortalInjector(userInjector || this._injector, new WeakMap([\n [MatBottomSheetConfig, config]\n ]));\n\n const containerPortal =\n new ComponentPortal(MatBottomSheetContainer, config.viewContainerRef, injector);\n const containerRef: ComponentRef<MatBottomSheetContainer> = overlayRef.attach(containerPortal);\n return containerRef.instance;\n }\n\n /**\n * Creates a new overlay and places it in the correct location.\n * @param config The user-specified bottom sheet config.\n */\n private _createOverlay(config: MatBottomSheetConfig): OverlayRef {\n const overlayConfig = new OverlayConfig({\n direction: config.direction,\n hasBackdrop: config.hasBackdrop,\n disposeOnNavigation: config.closeOnNavigation,\n maxWidth: '100%',\n scrollStrategy: config.scrollStrategy || this._overlay.scrollStrategies.block(),\n positionStrategy: this._overlay.position().global().centerHorizontally().bottom('0')\n });\n\n if (config.backdropClass) {\n overlayConfig.backdropClass = config.backdropClass;\n }\n\n return this._overlay.create(overlayConfig);\n }\n\n /**\n * Creates an injector to be used inside of a bottom sheet component.\n * @param config Config that was used to create the bottom sheet.\n * @param bottomSheetRef Reference to the bottom sheet.\n */\n private _createInjector<T>(config: MatBottomSheetConfig,\n bottomSheetRef: MatBottomSheetRef<T>): PortalInjector {\n\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n const injectionTokens = new WeakMap<any, any>([\n [MatBottomSheetRef, bottomSheetRef],\n [MAT_BOTTOM_SHEET_DATA, config.data]\n ]);\n\n if (config.direction &&\n (!userInjector || !userInjector.get<Directionality | null>(Directionality, null))) {\n injectionTokens.set(Directionality, {\n value: config.direction,\n change: observableOf()\n });\n }\n\n return new PortalInjector(userInjector || this._injector, injectionTokens);\n }\n}\n\n/**\n * Applies default options to the bottom sheet config.\n * @param defaults Object containing the default values to which to fall back.\n * @param config The configuration to which the defaults will be applied.\n * @returns The new configuration object with defaults applied.\n */\nfunction _applyConfigDefaults(defaults: MatBottomSheetConfig,\n config?: MatBottomSheetConfig): MatBottomSheetConfig {\n return {...defaults, ...config};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {ENTER, SPACE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport {MatOptgroup} from './optgroup';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by MatOption when selected or deselected. */\nexport class MatOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: MatOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false) { }\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n * @docs-private\n */\nexport interface MatOptionParentComponent {\n disableRipple?: boolean;\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const MAT_OPTION_PARENT_COMPONENT =\n new InjectionToken<MatOptionParentComponent>('MAT_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `<mat-select>` element.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-option',\n exportAs: 'matOption',\n host: {\n 'role': 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.mat-selected]': 'selected',\n '[class.mat-option-multiple]': 'multiple',\n '[class.mat-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.mat-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n 'class': 'mat-option',\n },\n styleUrls: ['option.css'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() { return this._parent && this._parent.multiple; }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean { return this._selected; }\n\n /** The form value of the option. */\n @Input() value: any;\n\n /** The unique ID of the option. */\n @Input() id: string = `mat-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() { return (this.group && this.group.disabled) || this._disabled; }\n set disabled(value: any) { this._disabled = coerceBooleanProperty(value); }\n\n /** Whether ripples for the option are disabled. */\n get disableRipple() { return this._parent && this._parent.disableRipple; }\n\n /** Event emitted when the option is selected or deselected. */\n // tslint:disable-next-line:no-output-on-prefix\n @Output() readonly onSelectionChange = new EventEmitter<MatOptionSelectionChange>();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject<void>();\n\n constructor(\n private _element: ElementRef<HTMLElement>,\n private _changeDetectorRef: ChangeDetectorRef,\n @Optional() @Inject(MAT_OPTION_PARENT_COMPONENT) private _parent: MatOptionParentComponent,\n @Optional() readonly group: MatOptgroup) {}\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\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 viewValue(): string {\n // TODO(kara): Add input property alternative for node envs.\n return (this._getHostElement().textContent || '').trim();\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\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 _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /**\n * Gets the `aria-selected` value for the option. We explicitly omit the `aria-selected`\n * attribute from single-selection, unselected options. Including the `aria-selected=\"false\"`\n * attributes adds a significant amount of noise to screen-reader users without providing useful\n * information.\n */\n _getAriaSelected(): boolean|null {\n return this.selected || (this.multiple ? false : null);\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(new MatOptionSelectionChange(this, isUserInput));\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(optionIndex: number, options: QueryList<MatOption>,\n optionGroups: QueryList<MatOptgroup>): number {\n\n if (optionGroups.length) {\n let optionsArray = options.toArray();\n let groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i < optionIndex + 1; i++) {\n if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(optionIndex: number, optionHeight: number,\n currentScrollPosition: number, panelHeight: number): number {\n const optionOffset = optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatRippleModule} from '../ripple/index';\nimport {MatPseudoCheckboxModule} from '../selection/index';\nimport {MatOption} from './option';\nimport {MatOptgroup} from './optgroup';\n\n\n@NgModule({\n imports: [MatRippleModule, CommonModule, MatPseudoCheckboxModule],\n exports: [MatOption, MatOptgroup],\n declarations: [MatOption, MatOptgroup]\n})\nexport class MatOptionModule {}\n\n\nexport * from './option';\nexport * from './optgroup';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/** InjectionToken that can be used to specify the global label options. */\nexport const MAT_LABEL_GLOBAL_OPTIONS =\n new InjectionToken<LabelOptions>('mat-label-global-options');\n\n/** Type for the available floatLabel values. */\nexport type FloatLabelType = 'always' | 'never' | 'auto';\n\n/** Configurable options for floating labels. */\nexport interface LabelOptions {\n /**\n * Whether the label should float `always`, `never`, or `auto` (only when necessary).\n * Default behavior is assumed to be `auto`.\n */\n float?: FloatLabelType;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, Input} from '@angular/core';\n\n\nlet nextUniqueId = 0;\n\n\n/** Single error message to be shown underneath the form field. */\n@Directive({\n selector: 'mat-error',\n host: {\n 'class': 'mat-error',\n 'role': 'alert',\n '[attr.id]': 'id',\n }\n})\nexport class MatError {\n @Input() id: string = `mat-error-${nextUniqueId++}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the MatFormField.\n * @docs-private\n */\nexport const matFormFieldAnimations: {\n readonly transitionMessages: AnimationTriggerMetadata\n} = {\n /** Animation that transitions the form field's error and hint messages. */\n transitionMessages: trigger('transitionMessages', [\n // TODO(mmalerba): Use angular animations for label animation as well.\n state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),\n transition('void => enter', [\n style({ opacity: 0, transform: 'translateY(-100%)' }),\n animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)'),\n ]),\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Observable} from 'rxjs';\nimport {NgControl} from '@angular/forms';\n\n\n/** An interface which allows a control to work inside of a `MatFormField`. */\nexport abstract class MatFormFieldControl<T> {\n /** The value of the control. */\n value: T | null;\n\n /**\n * Stream that emits whenever the state of the control changes such that the parent `MatFormField`\n * needs to run change detection.\n */\n readonly stateChanges: Observable<void>;\n\n /** The element ID for this control. */\n readonly id: string;\n\n /** The placeholder for this control. */\n readonly placeholder: string;\n\n /** Gets the NgControl for this control. */\n readonly ngControl: NgControl | null;\n\n /** Whether the control is focused. */\n readonly focused: boolean;\n\n /** Whether the control is empty. */\n readonly empty: boolean;\n\n /** Whether the `MatFormField` label should try to float. */\n readonly shouldLabelFloat: boolean;\n\n /** Whether the control is required. */\n readonly required: boolean;\n\n /** Whether the control is disabled. */\n readonly disabled: boolean;\n\n /** Whether the control is in an error state. */\n readonly errorState: boolean;\n\n /**\n * An optional name for the control type that can be used to distinguish `mat-form-field` elements\n * based on their control type. The form field will add a class,\n * `mat-form-field-type-{{controlType}}` to its root element.\n */\n readonly controlType?: string;\n\n /**\n * Whether the input is currently in an autofilled state. If property is not present on the\n * control it is assumed to be false.\n */\n readonly autofilled?: boolean;\n\n /** Sets the list of element IDs that currently describe this control. */\n abstract setDescribedByIds(ids: string[]): void;\n\n /** Handles a click on the control's container. */\n abstract onContainerClick(event: MouseEvent): void;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, Input} from '@angular/core';\n\n\nlet nextUniqueId = 0;\n\n\n/** Hint text to be shown underneath the form field control. */\n@Directive({\n selector: 'mat-hint',\n host: {\n 'class': 'mat-hint',\n '[class.mat-right]': 'align == \"end\"',\n '[attr.id]': 'id',\n // Remove align attribute to prevent it from interfering with layout.\n '[attr.align]': 'null',\n }\n})\nexport class MatHint {\n /** Whether to align the hint label at the start or end of the line. */\n @Input() align: 'start' | 'end' = 'start';\n\n /** Unique ID for the hint. Used for the aria-describedby on the form field control. */\n @Input() id: string = `mat-hint-${nextUniqueId++}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\n\n\n/** The floating label for a `mat-form-field`. */\n@Directive({\n selector: 'mat-label'\n})\nexport class MatLabel {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\n\n\n/**\n * The placeholder text for an `MatFormField`.\n * @deprecated Use `<mat-label>` to specify the label and the `placeholder` attribute to specify the\n * placeholder.\n * @breaking-change 8.0.0\n */\n@Directive({\n selector: 'mat-placeholder'\n})\nexport class MatPlaceholder {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\n\n\n/** Prefix to be placed in front of the form field. */\n@Directive({\n selector: '[matPrefix]',\n})\nexport class MatPrefix {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\n\n\n/** Suffix to be placed at the end of the form field. */\n@Directive({\n selector: '[matSuffix]',\n})\nexport class MatSuffix {}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule, InjectionToken, Optional, Inject, isDevMode, Version} from '@angular/core';\nimport {HammerLoader, HAMMER_LOADER} from '@angular/platform-browser';\nimport {BidiModule} from '@angular/cdk/bidi';\nimport {VERSION as CDK_VERSION} from '@angular/cdk';\n\n// Private version constant to circumvent test/build issues,\n// i.e. avoid core to depend on the @angular/material primary entry-point\n// Can be removed once the Material primary entry-point no longer\n// re-exports all secondary entry-points\nconst VERSION = new Version('8.1.0');\n\n\n/** Injection token that configures whether the Material sanity checks are enabled. */\nexport const MATERIAL_SANITY_CHECKS = new InjectionToken<boolean>('mat-sanity-checks', {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n});\n\n/** @docs-private */\nexport function MATERIAL_SANITY_CHECKS_FACTORY(): boolean {\n return true;\n}\n\n/**\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\n * components. This includes Bidi, etc.\n *\n * This module should be imported to each top-level component module (e.g., MatTabsModule).\n */\n@NgModule({\n imports: [BidiModule],\n exports: [BidiModule],\n})\nexport class MatCommonModule {\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\n private _hasDoneGlobalChecks = false;\n\n /** Whether we've already checked for HammerJs availability. */\n private _hasCheckedHammer = false;\n\n /** Reference to the global `document` object. */\n private _document = typeof document === 'object' && document ? document : null;\n\n /** Reference to the global 'window' object. */\n private _window = typeof window === 'object' && window ? window : null;\n\n constructor(\n @Optional() @Inject(MATERIAL_SANITY_CHECKS) private _sanityChecksEnabled: boolean,\n @Optional() @Inject(HAMMER_LOADER) private _hammerLoader?: HammerLoader) {\n\n if (this._areChecksEnabled() && !this._hasDoneGlobalChecks) {\n this._checkDoctypeIsDefined();\n this._checkThemeIsPresent();\n this._checkCdkVersionMatch();\n this._hasDoneGlobalChecks = true;\n }\n }\n\n /** Whether any sanity checks are enabled */\n private _areChecksEnabled(): boolean {\n return this._sanityChecksEnabled && isDevMode() && !this._isTestEnv();\n }\n\n /** Whether the code is running in tests. */\n private _isTestEnv() {\n const window = this._window as any;\n return window && (window.__karma__ || window.jasmine);\n }\n\n private _checkDoctypeIsDefined(): void {\n if (this._document && !this._document.doctype) {\n console.warn(\n 'Current document does not have a doctype. This may cause ' +\n 'some Angular Material components not to behave as expected.'\n );\n }\n }\n\n private _checkThemeIsPresent(): void {\n // We need to assert that the `body` is defined, because these checks run very early\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\n if (!this._document || !this._document.body || typeof getComputedStyle !== 'function') {\n return;\n }\n\n const testElement = this._document.createElement('div');\n\n testElement.classList.add('mat-theme-loaded-marker');\n this._document.body.appendChild(testElement);\n\n const computedStyle = getComputedStyle(testElement);\n\n // In some situations the computed style of the test element can be null. For example in\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n if (computedStyle && computedStyle.display !== 'none') {\n console.warn(\n 'Could not find Angular Material core theme. Most Material ' +\n 'components may not work as expected. For more info refer ' +\n 'to the theming guide: https://material.angular.io/guide/theming'\n );\n }\n\n this._document.body.removeChild(testElement);\n }\n\n /** Checks whether the material version matches the cdk version */\n private _checkCdkVersionMatch(): void {\n if (VERSION.full !== CDK_VERSION.full) {\n console.warn(\n 'The Angular Material version (' + VERSION.full + ') does not match ' +\n 'the Angular CDK version (' + CDK_VERSION.full + ').\\n' +\n 'Please ensure the versions of these two packages exactly match.'\n );\n }\n }\n\n /** Checks whether HammerJS is available. */\n _checkHammerIsAvailable(): void {\n if (this._hasCheckedHammer || !this._window) {\n return;\n }\n\n if (this._areChecksEnabled() && !(this._window as any)['Hammer'] && !this._hammerLoader) {\n console.warn(\n 'Could not find HammerJS. Certain Angular Material components may not work correctly.');\n }\n this._hasCheckedHammer = true;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {Constructor} from './constructor';\n\n/** @docs-private */\nexport interface CanDisable {\n /** Whether the component is disabled. */\n disabled: boolean;\n}\n\n/** @docs-private */\nexport type CanDisableCtor = Constructor<CanDisable>;\n\n/** Mixin to augment a directive with a `disabled` property. */\nexport function mixinDisabled<T extends Constructor<{}>>(base: T): CanDisableCtor & T {\n return class extends base {\n private _disabled: boolean = false;\n\n get disabled() { return this._disabled; }\n set disabled(value: any) { this._disabled = coerceBooleanProperty(value); }\n\n constructor(...args: any[]) { super(...args); }\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Constructor} from './constructor';\nimport {ElementRef} from '@angular/core';\n\n/** @docs-private */\nexport interface CanColor {\n /** Theme color palette for the component. */\n color: ThemePalette;\n}\n\n/** @docs-private */\nexport type CanColorCtor = Constructor<CanColor>;\n\n/** @docs-private */\nexport interface HasElementRef {\n _elementRef: ElementRef;\n}\n\n/** Possible color palette values. */\nexport type ThemePalette = 'primary' | 'accent' | 'warn' | undefined;\n\n/** Mixin to augment a directive with a `color` property. */\nexport function mixinColor<T extends Constructor<HasElementRef>>(\n base: T, defaultColor?: ThemePalette): CanColorCtor & T {\n return class extends base {\n private _color: ThemePalette;\n\n get color(): ThemePalette { return this._color; }\n set color(value: ThemePalette) {\n const colorPalette = value || defaultColor;\n\n if (colorPalette !== this._color) {\n if (this._color) {\n this._elementRef.nativeElement.classList.remove(`mat-${this._color}`);\n }\n if (colorPalette) {\n this._elementRef.nativeElement.classList.add(`mat-${colorPalette}`);\n }\n\n this._color = colorPalette;\n }\n }\n\n constructor(...args: any[]) {\n super(...args);\n\n // Set the default color that can be specified from the mixin.\n this.color = defaultColor;\n }\n };\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {Constructor} from './constructor';\n\n/** @docs-private */\nexport interface CanDisableRipple {\n /** Whether ripples are disabled. */\n disableRipple: boolean;\n}\n\n/** @docs-private */\nexport type CanDisableRippleCtor = Constructor<CanDisableRipple>;\n\n/** Mixin to augment a directive with a `disableRipple` property. */\nexport function mixinDisableRipple<T extends Constructor<{}>>(base: T): CanDisableRippleCtor & T {\n return class extends base {\n private _disableRipple: boolean = false;\n\n /** Whether the ripple effect is disabled or not. */\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n\n constructor(...args: any[]) { super(...args); }\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Constructor} from './constructor';\nimport {CanDisable} from './disabled';\n\n\n/** @docs-private */\nexport interface HasTabIndex {\n /** Tabindex of the component. */\n tabIndex: number;\n}\n\n/** @docs-private */\nexport type HasTabIndexCtor = Constructor<HasTabIndex>;\n\n/** Mixin to augment a directive with a `tabIndex` property. */\nexport function mixinTabIndex<T extends Constructor<CanDisable>>(base: T, defaultTabIndex = 0)\n : HasTabIndexCtor & T {\n return class extends base {\n private _tabIndex: number = defaultTabIndex;\n\n get tabIndex(): number { return this.disabled ? -1 : this._tabIndex; }\n set tabIndex(value: number) {\n // If the specified tabIndex value is null or undefined, fall back to the default value.\n this._tabIndex = value != null ? value : defaultTabIndex;\n }\n\n constructor(...args: any[]) {\n super(...args);\n }\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FormControl, FormGroupDirective, NgControl, NgForm} from '@angular/forms';\nimport {Subject} from 'rxjs';\nimport {ErrorStateMatcher} from '../error/error-options';\nimport {Constructor} from './constructor';\n\n\n/** @docs-private */\nexport interface CanUpdateErrorState {\n updateErrorState(): void;\n readonly stateChanges: Subject<void>;\n errorState: boolean;\n errorStateMatcher: ErrorStateMatcher;\n}\n\n/** @docs-private */\nexport type CanUpdateErrorStateCtor = Constructor<CanUpdateErrorState>;\n\n/** @docs-private */\nexport interface HasErrorState {\n _parentFormGroup: FormGroupDirective;\n _parentForm: NgForm;\n _defaultErrorStateMatcher: ErrorStateMatcher;\n ngControl: NgControl;\n}\n\n/**\n * Mixin to augment a directive with updateErrorState method.\n * For component with `errorState` and need to update `errorState`.\n */\nexport function mixinErrorState<T extends Constructor<HasErrorState>>(base: T)\n: CanUpdateErrorStateCtor & T {\n return class extends base {\n /** Whether the component is in an error state. */\n errorState: boolean = false;\n\n /**\n * Stream that emits whenever the state of the input changes such that the wrapping\n * `MatFormField` needs to run change detection.\n */\n readonly stateChanges = new Subject<void>();\n\n errorStateMatcher: ErrorStateMatcher;\n\n updateErrorState() {\n const oldState = this.errorState;\n const parent = this._parentFormGroup || this._parentForm;\n const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;\n const control = this.ngControl ? this.ngControl.control as FormControl : null;\n const newState = matcher.isErrorState(control, parent);\n\n if (newState !== oldState) {\n this.errorState = newState;\n this.stateChanges.next();\n }\n }\n\n constructor(...args: any[]) {\n super(...args);\n }\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Observable, Subscriber} from 'rxjs';\nimport {Constructor} from './constructor';\n\n\n/**\n * Mixin that adds an initialized property to a directive which, when subscribed to, will emit a\n * value once markInitialized has been called, which should be done during the ngOnInit function.\n * If the subscription is made after it has already been marked as initialized, then it will trigger\n * an emit immediately.\n * @docs-private\n */\nexport interface HasInitialized {\n /** Stream that emits once during the directive/component's ngOnInit. */\n initialized: Observable<void>;\n\n /**\n * Sets the state as initialized and must be called during ngOnInit to notify subscribers that\n * the directive has been initialized.\n * @docs-private\n */\n _markInitialized: () => void;\n}\n\n/** @docs-private */\nexport type HasInitializedCtor = Constructor<HasInitialized>;\n\n/** Mixin to augment a directive with an initialized property that will emits when ngOnInit ends. */\nexport function mixinInitialized<T extends Constructor<{}>>(base: T):\n HasInitializedCtor & T {\n return class extends base {\n /** Whether this directive has been marked as initialized. */\n _isInitialized = false;\n\n /**\n * List of subscribers that subscribed before the directive was initialized. Should be notified\n * during _markInitialized. Set to null after pending subscribers are notified, and should\n * not expect to be populated after.\n */\n _pendingSubscribers: Subscriber<void>[] | null = [];\n\n /**\n * Observable stream that emits when the directive initializes. If already initialized, the\n * subscriber is stored to be notified once _markInitialized is called.\n */\n initialized = new Observable<void>(subscriber => {\n // If initialized, immediately notify the subscriber. Otherwise store the subscriber to notify\n // when _markInitialized is called.\n if (this._isInitialized) {\n this._notifySubscriber(subscriber);\n } else {\n this._pendingSubscribers!.push(subscriber);\n }\n });\n\n constructor(...args: any[]) { super(...args); }\n\n /**\n * Marks the state as initialized and notifies pending subscribers. Should be called at the end\n * of ngOnInit.\n * @docs-private\n */\n _markInitialized(): void {\n if (this._isInitialized) {\n throw Error('This directive has already been marked as initialized and ' +\n 'should not be called twice.');\n }\n\n this._isInitialized = true;\n\n this._pendingSubscribers!.forEach(this._notifySubscriber);\n this._pendingSubscribers = null;\n }\n\n /** Emits and completes the subscriber stream (should only emit once). */\n _notifySubscriber(subscriber: Subscriber<void>): void {\n subscriber.next();\n subscriber.complete();\n }\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {inject, InjectionToken, LOCALE_ID} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\n\n/** InjectionToken for datepicker that can be used to override default locale code. */\nexport const MAT_DATE_LOCALE = new InjectionToken<string>('MAT_DATE_LOCALE', {\n providedIn: 'root',\n factory: MAT_DATE_LOCALE_FACTORY,\n});\n\n/** @docs-private */\nexport function MAT_DATE_LOCALE_FACTORY(): string {\n return inject(LOCALE_ID);\n}\n\n/**\n * No longer needed since MAT_DATE_LOCALE has been changed to a scoped injectable.\n * If you are importing and providing this in your code you can simply remove it.\n * @deprecated\n * @breaking-change 8.0.0\n */\nexport const MAT_DATE_LOCALE_PROVIDER = {provide: MAT_DATE_LOCALE, useExisting: LOCALE_ID};\n\n/** Adapts type `D` to be usable as a date by cdk-based components that work with dates. */\nexport abstract class DateAdapter<D> {\n /** The locale to use for all dates. */\n protected locale: any;\n\n /** A stream that emits when the locale changes. */\n get localeChanges(): Observable<void> { return this._localeChanges; }\n protected _localeChanges = new Subject<void>();\n\n /**\n * Gets the year component of the given date.\n * @param date The date to extract the year from.\n * @returns The year component.\n */\n abstract getYear(date: D): number;\n\n /**\n * Gets the month component of the given date.\n * @param date The date to extract the month from.\n * @returns The month component (0-indexed, 0 = January).\n */\n abstract getMonth(date: D): number;\n\n /**\n * Gets the date of the month component of the given date.\n * @param date The date to extract the date of the month from.\n * @returns The month component (1-indexed, 1 = first of month).\n */\n abstract getDate(date: D): number;\n\n /**\n * Gets the day of the week component of the given date.\n * @param date The date to extract the day of the week from.\n * @returns The month component (0-indexed, 0 = Sunday).\n */\n abstract getDayOfWeek(date: D): number;\n\n /**\n * Gets a list of names for the months.\n * @param style The naming style (e.g. long = 'January', short = 'Jan', narrow = 'J').\n * @returns An ordered list of all month names, starting with January.\n */\n abstract getMonthNames(style: 'long' | 'short' | 'narrow'): string[];\n\n /**\n * Gets a list of names for the dates of the month.\n * @returns An ordered list of all date of the month names, starting with '1'.\n */\n abstract getDateNames(): string[];\n\n /**\n * Gets a list of names for the days of the week.\n * @param style The naming style (e.g. long = 'Sunday', short = 'Sun', narrow = 'S').\n * @returns An ordered list of all weekday names, starting with Sunday.\n */\n abstract getDayOfWeekNames(style: 'long' | 'short' | 'narrow'): string[];\n\n /**\n * Gets the name for the year of the given date.\n * @param date The date to get the year name for.\n * @returns The name of the given year (e.g. '2017').\n */\n abstract getYearName(date: D): string;\n\n /**\n * Gets the first day of the week.\n * @returns The first day of the week (0-indexed, 0 = Sunday).\n */\n abstract getFirstDayOfWeek(): number;\n\n /**\n * Gets the number of days in the month of the given date.\n * @param date The date whose month should be checked.\n * @returns The number of days in the month of the given date.\n */\n abstract getNumDaysInMonth(date: D): number;\n\n /**\n * Clones the given date.\n * @param date The date to clone\n * @returns A new date equal to the given date.\n */\n abstract clone(date: D): D;\n\n /**\n * Creates a date with the given year, month, and date. Does not allow over/under-flow of the\n * month and date.\n * @param year The full year of the date. (e.g. 89 means the year 89, not the year 1989).\n * @param month The month of the date (0-indexed, 0 = January). Must be an integer 0 - 11.\n * @param date The date of month of the date. Must be an integer 1 - length of the given month.\n * @returns The new date, or null if invalid.\n */\n abstract createDate(year: number, month: number, date: number): D;\n\n /**\n * Gets today's date.\n * @returns Today's date.\n */\n abstract today(): D;\n\n /**\n * Parses a date from a user-provided value.\n * @param value The value to parse.\n * @param parseFormat The expected format of the value being parsed\n * (type is implementation-dependent).\n * @returns The parsed date.\n */\n abstract parse(value: any, parseFormat: any): D | null;\n\n /**\n * Formats a date as a string according to the given format.\n * @param date The value to format.\n * @param displayFormat The format to use to display the date as a string.\n * @returns The formatted date string.\n */\n abstract format(date: D, displayFormat: any): string;\n\n /**\n * Adds the given number of years to the date. Years are counted as if flipping 12 pages on the\n * calendar for each year and then finding the closest date in the new month. For example when\n * adding 1 year to Feb 29, 2016, the resulting date will be Feb 28, 2017.\n * @param date The date to add years to.\n * @param years The number of years to add (may be negative).\n * @returns A new date equal to the given one with the specified number of years added.\n */\n abstract addCalendarYears(date: D, years: number): D;\n\n /**\n * Adds the given number of months to the date. Months are counted as if flipping a page on the\n * calendar for each month and then finding the closest date in the new month. For example when\n * adding 1 month to Jan 31, 2017, the resulting date will be Feb 28, 2017.\n * @param date The date to add months to.\n * @param months The number of months to add (may be negative).\n * @returns A new date equal to the given one with the specified number of months added.\n */\n abstract addCalendarMonths(date: D, months: number): D;\n\n /**\n * Adds the given number of days to the date. Days are counted as if moving one cell on the\n * calendar for each day.\n * @param date The date to add days to.\n * @param days The number of days to add (may be negative).\n * @returns A new date equal to the given one with the specified number of days added.\n */\n abstract addCalendarDays(date: D, days: number): D;\n\n /**\n * Gets the RFC 3339 compatible string (https://tools.ietf.org/html/rfc3339) for the given date.\n * This method is used to generate date strings that are compatible with native HTML attributes\n * such as the `min` or `max` attribute of an `<input>`.\n * @param date The date to get the ISO date string for.\n * @returns The ISO date string date string.\n */\n abstract toIso8601(date: D): string;\n\n /**\n * Checks whether the given object is considered a date instance by this DateAdapter.\n * @param obj The object to check\n * @returns Whether the object is a date instance.\n */\n abstract isDateInstance(obj: any): boolean;\n\n /**\n * Checks whether the given date is valid.\n * @param date The date to check.\n * @returns Whether the date is valid.\n */\n abstract isValid(date: D): boolean;\n\n /**\n * Gets date instance that is not valid.\n * @returns An invalid date.\n */\n abstract invalid(): D;\n\n /**\n * Attempts to deserialize a value to a valid date object. This is different from parsing in that\n * deserialize should only accept non-ambiguous, locale-independent formats (e.g. a ISO 8601\n * string). The default implementation does not allow any deserialization, it simply checks that\n * the given value is already a valid date object or null. The `<mat-datepicker>` will call this\n * method on all of it's `@Input()` properties that accept dates. It is therefore possible to\n * support passing values from your backend directly to these properties by overriding this method\n * to also deserialize the format used by your backend.\n * @param value The value to be deserialized into a date object.\n * @returns The deserialized date object, either a valid date, null if the value can be\n * deserialized into a null date (e.g. the empty string), or an invalid date.\n */\n deserialize(value: any): D | null {\n if (value == null || this.isDateInstance(value) && this.isValid(value)) {\n return value;\n }\n return this.invalid();\n }\n\n /**\n * Sets the locale used for all dates.\n * @param locale The new locale.\n */\n setLocale(locale: any) {\n this.locale = locale;\n this._localeChanges.next();\n }\n\n /**\n * Compares two dates.\n * @param first The first date to compare.\n * @param second The second date to compare.\n * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,\n * a number greater than 0 if the first date is later.\n */\n compareDate(first: D, second: D): number {\n return this.getYear(first) - this.getYear(second) ||\n this.getMonth(first) - this.getMonth(second) ||\n this.getDate(first) - this.getDate(second);\n }\n\n /**\n * Checks if two dates are equal.\n * @param first The first date to check.\n * @param second The second date to check.\n * @returns Whether the two dates are equal.\n * Null dates are considered equal to other null dates.\n */\n sameDate(first: D | null, second: D | null): boolean {\n if (first && second) {\n let firstValid = this.isValid(first);\n let secondValid = this.isValid(second);\n if (firstValid && secondValid) {\n return !this.compareDate(first, second);\n }\n return firstValid == secondValid;\n }\n return first == second;\n }\n\n /**\n * Clamp the given date between min and max dates.\n * @param date The date to clamp.\n * @param min The minimum value to allow. If null or omitted no min is enforced.\n * @param max The maximum value to allow. If null or omitted no max is enforced.\n * @returns `min` if `date` is less than `min`, `max` if date is greater than `max`,\n * otherwise `date`.\n */\n clampDate(date: D, min?: D | null, max?: D | null): D {\n if (min && this.compareDate(date, min) < 0) {\n return min;\n }\n if (max && this.compareDate(date, max) > 0) {\n return max;\n }\n return date;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {Inject, Injectable, Optional} from '@angular/core';\nimport {DateAdapter, MAT_DATE_LOCALE} from './date-adapter';\n\n// TODO(mmalerba): Remove when we no longer support safari 9.\n/** Whether the browser supports the Intl API. */\nlet SUPPORTS_INTL_API: boolean;\n\n// We need a try/catch around the reference to `Intl`, because accessing it in some cases can\n// cause IE to throw. These cases are tied to particular versions of Windows and can happen if\n// the consumer is providing a polyfilled `Map`. See:\n// https://github.com/Microsoft/ChakraCore/issues/3189\n// https://github.com/angular/components/issues/15687\ntry {\n SUPPORTS_INTL_API = typeof Intl != 'undefined';\n} catch {\n SUPPORTS_INTL_API = false;\n}\n\n/** The default month names to use if Intl API is not available. */\nconst DEFAULT_MONTH_NAMES = {\n 'long': [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',\n 'October', 'November', 'December'\n ],\n 'short': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n 'narrow': ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']\n};\n\n\n/** The default date names to use if Intl API is not available. */\nconst DEFAULT_DATE_NAMES = range(31, i => String(i + 1));\n\n\n/** The default day of the week names to use if Intl API is not available. */\nconst DEFAULT_DAY_OF_WEEK_NAMES = {\n 'long': ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n 'short': ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n 'narrow': ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n};\n\n\n/**\n * Matches strings that have the form of a valid RFC 3339 string\n * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\n * because the regex will match strings an with out of bounds month, date, etc.\n */\nconst ISO_8601_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/;\n\n\n/** Creates an array and fills it with values. */\nfunction range<T>(length: number, valueFunction: (index: number) => T): T[] {\n const valuesArray = Array(length);\n for (let i = 0; i < length; i++) {\n valuesArray[i] = valueFunction(i);\n }\n return valuesArray;\n}\n\n/** Adapts the native JS Date for use with cdk-based components that work with dates. */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n /** Whether to clamp the date between 1 and 9999 to avoid IE and Edge errors. */\n private readonly _clampDate: boolean;\n\n /**\n * Whether to use `timeZone: 'utc'` with `Intl.DateTimeFormat` when formatting dates.\n * Without this `Intl.DateTimeFormat` sometimes chooses the wrong timeZone, which can throw off\n * the result. (e.g. in the en-US locale `new Date(1800, 7, 14).toLocaleDateString()`\n * will produce `'8/13/1800'`.\n *\n * TODO(mmalerba): drop this variable. It's not being used in the code right now. We're now\n * getting the string representation of a Date object from it's utc representation. We're keeping\n * it here for sometime, just for precaution, in case we decide to revert some of these changes\n * though.\n */\n useUtcForDisplay: boolean = true;\n\n constructor(@Optional() @Inject(MAT_DATE_LOCALE) matDateLocale: string, platform: Platform) {\n super();\n super.setLocale(matDateLocale);\n\n // IE does its own time zone correction, so we disable this on IE.\n this.useUtcForDisplay = !platform.TRIDENT;\n this._clampDate = platform.TRIDENT || platform.EDGE;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDayOfWeek(date: Date): number {\n return date.getDay();\n }\n\n getMonthNames(style: 'long' | 'short' | 'narrow'): string[] {\n if (SUPPORTS_INTL_API) {\n const dtf = new Intl.DateTimeFormat(this.locale, {month: style, timeZone: 'utc'});\n return range(12, i =>\n this._stripDirectionalityCharacters(this._format(dtf, new Date(2017, i, 1))));\n }\n return DEFAULT_MONTH_NAMES[style];\n }\n\n getDateNames(): string[] {\n if (SUPPORTS_INTL_API) {\n const dtf = new Intl.DateTimeFormat(this.locale, {day: 'numeric', timeZone: 'utc'});\n return range(31, i => this._stripDirectionalityCharacters(\n this._format(dtf, new Date(2017, 0, i + 1))));\n }\n return DEFAULT_DATE_NAMES;\n }\n\n getDayOfWeekNames(style: 'long' | 'short' | 'narrow'): string[] {\n if (SUPPORTS_INTL_API) {\n const dtf = new Intl.DateTimeFormat(this.locale, {weekday: style, timeZone: 'utc'});\n return range(7, i => this._stripDirectionalityCharacters(\n this._format(dtf, new Date(2017, 0, i + 1))));\n }\n return DEFAULT_DAY_OF_WEEK_NAMES[style];\n }\n\n getYearName(date: Date): string {\n if (SUPPORTS_INTL_API) {\n const dtf = new Intl.DateTimeFormat(this.locale, {year: 'numeric', timeZone: 'utc'});\n return this._stripDirectionalityCharacters(this._format(dtf, date));\n }\n return String(this.getYear(date));\n }\n\n getFirstDayOfWeek(): number {\n // We can't tell using native JS Date what the first day of the week is, we default to Sunday.\n return 0;\n }\n\n getNumDaysInMonth(date: Date): number {\n return this.getDate(this._createDateWithOverflow(\n this.getYear(date), this.getMonth(date) + 1, 0));\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n createDate(year: number, month: number, date: number): Date {\n // Check for invalid month and date (except upper bound on date which we have to check after\n // creating the Date).\n if (month < 0 || month > 11) {\n throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\n }\n\n if (date < 1) {\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\n }\n\n let result = this._createDateWithOverflow(year, month, date);\n // Check that the date wasn't above the upper bound for the month, causing the month to overflow\n if (result.getMonth() != month) {\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\n }\n\n return result;\n }\n\n today(): Date {\n return new Date();\n }\n\n parse(value: any): Date | null {\n // We have no way using the native JS Date to set the parse format or locale, so we ignore these\n // parameters.\n if (typeof value == 'number') {\n return new Date(value);\n }\n return value ? new Date(Date.parse(value)) : null;\n }\n\n format(date: Date, displayFormat: Object): string {\n if (!this.isValid(date)) {\n throw Error('NativeDateAdapter: Cannot format invalid date.');\n }\n\n if (SUPPORTS_INTL_API) {\n // On IE and Edge the i18n API will throw a hard error that can crash the entire app\n // if we attempt to format a date whose year is less than 1 or greater than 9999.\n if (this._clampDate && (date.getFullYear() < 1 || date.getFullYear() > 9999)) {\n date = this.clone(date);\n date.setFullYear(Math.max(1, Math.min(9999, date.getFullYear())));\n }\n\n displayFormat = {...displayFormat, timeZone: 'utc'};\n\n const dtf = new Intl.DateTimeFormat(this.locale, displayFormat);\n return this._stripDirectionalityCharacters(this._format(dtf, date));\n }\n return this._stripDirectionalityCharacters(date.toDateString());\n }\n\n addCalendarYears(date: Date, years: number): Date {\n return this.addCalendarMonths(date, years * 12);\n }\n\n addCalendarMonths(date: Date, months: number): Date {\n let newDate = this._createDateWithOverflow(\n this.getYear(date), this.getMonth(date) + months, this.getDate(date));\n\n // It's possible to wind up in the wrong month if the original month has more days than the new\n // month. In this case we want to go to the last day of the desired month.\n // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\n // guarantee this.\n if (this.getMonth(newDate) != ((this.getMonth(date) + months) % 12 + 12) % 12) {\n newDate = this._createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);\n }\n\n return newDate;\n }\n\n addCalendarDays(date: Date, days: number): Date {\n return this._createDateWithOverflow(\n this.getYear(date), this.getMonth(date), this.getDate(date) + days);\n }\n\n toIso8601(date: Date): string {\n return [\n date.getUTCFullYear(),\n this._2digit(date.getUTCMonth() + 1),\n this._2digit(date.getUTCDate())\n ].join('-');\n }\n\n /**\n * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings\n * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an\n * invalid date for all other values.\n */\n deserialize(value: any): Date | null {\n if (typeof value === 'string') {\n if (!value) {\n return null;\n }\n // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the\n // string is the right format first.\n if (ISO_8601_REGEX.test(value)) {\n let date = new Date(value);\n if (this.isValid(date)) {\n return date;\n }\n }\n }\n return super.deserialize(value);\n }\n\n isDateInstance(obj: any) {\n return obj instanceof Date;\n }\n\n isValid(date: Date) {\n return !isNaN(date.getTime());\n }\n\n invalid(): Date {\n return new Date(NaN);\n }\n\n /** Creates a date but allows the month and date to overflow. */\n private _createDateWithOverflow(year: number, month: number, date: number) {\n const result = new Date(year, month, date);\n\n // We need to correct for the fact that JS native Date treats years in range [0, 99] as\n // abbreviations for 19xx.\n if (year >= 0 && year < 100) {\n result.setFullYear(this.getYear(result) - 1900);\n }\n return result;\n }\n\n /**\n * Pads a number to make it two digits.\n * @param n The number to pad.\n * @returns The padded number.\n */\n private _2digit(n: number) {\n return ('00' + n).slice(-2);\n }\n\n /**\n * Strip out unicode LTR and RTL characters. Edge and IE insert these into formatted dates while\n * other browsers do not. We remove them to make output consistent and because they interfere with\n * date parsing.\n * @param str The string to strip direction characters from.\n * @returns The stripped string.\n */\n private _stripDirectionalityCharacters(str: string) {\n return str.replace(/[\\u200e\\u200f]/g, '');\n }\n\n /**\n * When converting Date object to string, javascript built-in functions may return wrong\n * results because it applies its internal DST rules. The DST rules around the world change\n * very frequently, and the current valid rule is not always valid in previous years though.\n * We work around this problem building a new Date object which has its internal UTC\n * representation with the local date and time.\n * @param dtf Intl.DateTimeFormat object, containg the desired string format. It must have\n * timeZone set to 'utc' to work fine.\n * @param date Date from which we want to get the string representation according to dtf\n * @returns A Date object with its UTC representation based on the passed in date info\n */\n private _format(dtf: Intl.DateTimeFormat, date: Date) {\n const d = new Date(Date.UTC(\n date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(),\n date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n return dtf.format(d);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n NgModule,\n Directive,\n ElementRef,\n QueryList,\n} from '@angular/core';\nimport {startWith} from 'rxjs/operators';\nimport {MatCommonModule} from '../common-behaviors/common-module';\n\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(MatLine) query, then\n * counted by checking the query list's length.\n */\n@Directive({\n selector: '[mat-line], [matLine]',\n host: {'class': 'mat-line'}\n})\nexport class MatLine {}\n\n/**\n * Helper that takes a query list of lines and sets the correct class on the host.\n * @docs-private\n */\nexport function setLines(lines: QueryList<MatLine>, element: ElementRef<HTMLElement>) {\n // Note: doesn't need to unsubscribe, because `changes`\n // gets completed by Angular when the view is destroyed.\n lines.changes.pipe(startWith(lines)).subscribe(({length}) => {\n setClass(element, 'mat-2-line', false);\n setClass(element, 'mat-3-line', false);\n setClass(element, 'mat-multi-line', false);\n\n if (length === 2 || length === 3) {\n setClass(element, `mat-${length}-line`, true);\n } else if (length > 3) {\n setClass(element, `mat-multi-line`, true);\n }\n });\n}\n\n/** Adds or removes a class from an element. */\nfunction setClass(element: ElementRef<HTMLElement>, className: string, isAdd: boolean): void {\n const classList = element.nativeElement.classList;\n isAdd ? classList.add(className) : classList.remove(className);\n}\n\n/**\n * Helper that takes a query list of lines and sets the correct class on the host.\n * @docs-private\n * @deprecated Use `setLines` instead.\n * @breaking-change 8.0.0\n */\nexport class MatLineSetter {\n constructor(lines: QueryList<MatLine>, element: ElementRef<HTMLElement>) {\n setLines(lines, element);\n }\n}\n\n@NgModule({\n imports: [MatCommonModule],\n exports: [MatLine, MatCommonModule],\n declarations: [MatLine],\n})\nexport class MatLineModule { }\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {ElementRef, NgZone} from '@angular/core';\nimport {Platform, normalizePassiveListenerOptions} from '@angular/cdk/platform';\nimport {isFakeMousedownFromScreenReader} from '@angular/cdk/a11y';\nimport {RippleRef, RippleState} from './ripple-ref';\n\nexport type RippleConfig = {\n color?: string;\n centered?: boolean;\n radius?: number;\n persistent?: boolean;\n animation?: RippleAnimationConfig;\n terminateOnPointerUp?: boolean;\n};\n\n/**\n * Interface that describes the configuration for the animation of a ripple.\n * There are two animation phases with different durations for the ripples.\n */\nexport interface RippleAnimationConfig {\n /** Duration in milliseconds for the enter animation (expansion from point of contact). */\n enterDuration?: number;\n /** Duration in milliseconds for the exit animation (fade-out). */\n exitDuration?: number;\n}\n\n/**\n * Interface that describes the target for launching ripples.\n * It defines the ripple configuration and disabled state for interaction ripples.\n * @docs-private\n */\nexport interface RippleTarget {\n /** Configuration for ripples that are launched on pointer down. */\n rippleConfig: RippleConfig;\n /** Whether ripples on pointer down should be disabled. */\n rippleDisabled: boolean;\n}\n\n/**\n * Default ripple animation configuration for ripples without an explicit\n * animation config specified.\n */\nexport const defaultRippleAnimationConfig = {\n enterDuration: 450,\n exitDuration: 400\n};\n\n/**\n * Timeout for ignoring mouse events. Mouse events will be temporary ignored after touch\n * events to avoid synthetic mouse events.\n */\nconst ignoreMouseEventsTimeout = 800;\n\n/** Options that apply to all the event listeners that are bound by the ripple renderer. */\nconst passiveEventOptions = normalizePassiveListenerOptions({passive: true});\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 */\nexport class RippleRenderer {\n /** Element where the ripples are being added to. */\n private _containerElement: HTMLElement;\n\n /** Element which triggers the ripple elements on mouse events. */\n private _triggerElement: HTMLElement | null;\n\n /** Whether the pointer is currently down or not. */\n private _isPointerDown = false;\n\n /** Events to be registered on the trigger element. */\n private _triggerEvents = new Map<string, any>();\n\n /** Set of currently active ripple references. */\n private _activeRipples = new Set<RippleRef>();\n\n /** Latest non-persistent ripple that was triggered. */\n private _mostRecentTransientRipple: RippleRef | null;\n\n /** Time in milliseconds when the last touchstart event happened. */\n private _lastTouchStartEvent: number;\n\n /**\n * Cached dimensions of the ripple container. Set when the first\n * ripple is shown and cleared once no more ripples are visible.\n */\n private _containerRect: ClientRect | null;\n\n constructor(private _target: RippleTarget,\n private _ngZone: NgZone,\n elementRef: ElementRef<HTMLElement>,\n platform: Platform) {\n\n // Only do anything if we're on the browser.\n if (platform.isBrowser) {\n this._containerElement = elementRef.nativeElement;\n\n // Specify events which need to be registered on the trigger.\n this._triggerEvents\n .set('mousedown', this._onMousedown)\n .set('mouseup', this._onPointerUp)\n .set('mouseleave', this._onPointerUp)\n\n .set('touchstart', this._onTouchStart)\n .set('touchend', this._onPointerUp)\n .set('touchcancel', this._onPointerUp);\n }\n }\n\n /**\n * Fades in a ripple at the given coordinates.\n * @param x Coordinate within the element, along the X axis at which to start the ripple.\n * @param y Coordinate within the element, along the Y axis at which to start the ripple.\n * @param config Extra ripple options.\n */\n fadeInRipple(x: number, y: number, config: RippleConfig = {}): RippleRef {\n const containerRect = this._containerRect =\n this._containerRect || this._containerElement.getBoundingClientRect();\n const animationConfig = {...defaultRippleAnimationConfig, ...config.animation};\n\n if (config.centered) {\n x = containerRect.left + containerRect.width / 2;\n y = containerRect.top + containerRect.height / 2;\n }\n\n const radius = config.radius || distanceToFurthestCorner(x, y, containerRect);\n const offsetX = x - containerRect.left;\n const offsetY = y - containerRect.top;\n const duration = animationConfig.enterDuration;\n\n const ripple = document.createElement('div');\n ripple.classList.add('mat-ripple-element');\n\n ripple.style.left = `${offsetX - radius}px`;\n ripple.style.top = `${offsetY - radius}px`;\n ripple.style.height = `${radius * 2}px`;\n ripple.style.width = `${radius * 2}px`;\n\n // If the color is not set, the default CSS color will be used.\n ripple.style.backgroundColor = config.color || null;\n ripple.style.transitionDuration = `${duration}ms`;\n\n this._containerElement.appendChild(ripple);\n\n // By default the browser does not recalculate the styles of dynamically created\n // ripple elements. This is critical because then the `scale` would not animate properly.\n enforceStyleRecalculation(ripple);\n\n ripple.style.transform = 'scale(1)';\n\n // Exposed reference to the ripple that will be returned.\n const rippleRef = new RippleRef(this, ripple, config);\n\n rippleRef.state = RippleState.FADING_IN;\n\n // Add the ripple reference to the list of all active ripples.\n this._activeRipples.add(rippleRef);\n\n if (!config.persistent) {\n this._mostRecentTransientRipple = rippleRef;\n }\n\n // Wait for the ripple element to be completely faded in.\n // Once it's faded in, the ripple can be hidden immediately if the mouse is released.\n this._runTimeoutOutsideZone(() => {\n const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;\n\n rippleRef.state = RippleState.VISIBLE;\n\n // When the timer runs out while the user has kept their pointer down, we want to\n // keep only the persistent ripples and the latest transient ripple. We do this,\n // because we don't want stacked transient ripples to appear after their enter\n // animation has finished.\n if (!config.persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {\n rippleRef.fadeOut();\n }\n }, duration);\n\n return rippleRef;\n }\n\n /** Fades out a ripple reference. */\n fadeOutRipple(rippleRef: RippleRef) {\n const wasActive = this._activeRipples.delete(rippleRef);\n\n if (rippleRef === this._mostRecentTransientRipple) {\n this._mostRecentTransientRipple = null;\n }\n\n // Clear out the cached bounding rect if we have no more ripples.\n if (!this._activeRipples.size) {\n this._containerRect = null;\n }\n\n // For ripples that are not active anymore, don't re-run the fade-out animation.\n if (!wasActive) {\n return;\n }\n\n const rippleEl = rippleRef.element;\n const animationConfig = {...defaultRippleAnimationConfig, ...rippleRef.config.animation};\n\n rippleEl.style.transitionDuration = `${animationConfig.exitDuration}ms`;\n rippleEl.style.opacity = '0';\n rippleRef.state = RippleState.FADING_OUT;\n\n // Once the ripple faded out, the ripple can be safely removed from the DOM.\n this._runTimeoutOutsideZone(() => {\n rippleRef.state = RippleState.HIDDEN;\n rippleEl.parentNode!.removeChild(rippleEl);\n }, animationConfig.exitDuration);\n }\n\n /** Fades out all currently active ripples. */\n fadeOutAll() {\n this._activeRipples.forEach(ripple => ripple.fadeOut());\n }\n\n /** Sets up the trigger event listeners */\n setupTriggerEvents(element: HTMLElement) {\n if (!element || element === this._triggerElement) {\n return;\n }\n\n // Remove all previously registered event listeners from the trigger element.\n this._removeTriggerEvents();\n\n this._ngZone.runOutsideAngular(() => {\n this._triggerEvents.forEach((fn, type) => {\n element.addEventListener(type, fn, passiveEventOptions);\n });\n });\n\n this._triggerElement = element;\n }\n\n /** Function being called whenever the trigger is being pressed using mouse. */\n private _onMousedown = (event: MouseEvent) => {\n // Screen readers will fire fake mouse events for space/enter. Skip launching a\n // ripple in this case for consistency with the non-screen-reader experience.\n const isFakeMousedown = isFakeMousedownFromScreenReader(event);\n const isSyntheticEvent = this._lastTouchStartEvent &&\n Date.now() < this._lastTouchStartEvent + ignoreMouseEventsTimeout;\n\n if (!this._target.rippleDisabled && !isFakeMousedown && !isSyntheticEvent) {\n this._isPointerDown = true;\n this.fadeInRipple(event.clientX, event.clientY, this._target.rippleConfig);\n }\n }\n\n /** Function being called whenever the trigger is being pressed using touch. */\n private _onTouchStart = (event: TouchEvent) => {\n if (!this._target.rippleDisabled) {\n // Some browsers fire mouse events after a `touchstart` event. Those synthetic mouse\n // events will launch a second ripple if we don't ignore mouse events for a specific\n // time after a touchstart event.\n this._lastTouchStartEvent = Date.now();\n this._isPointerDown = true;\n\n // Use `changedTouches` so we skip any touches where the user put\n // their finger down, but used another finger to tap the element again.\n const touches = event.changedTouches;\n\n for (let i = 0; i < touches.length; i++) {\n this.fadeInRipple(touches[i].clientX, touches[i].clientY, this._target.rippleConfig);\n }\n }\n }\n\n /** Function being called whenever the trigger is being released. */\n private _onPointerUp = () => {\n if (!this._isPointerDown) {\n return;\n }\n\n this._isPointerDown = false;\n\n // Fade-out all ripples that are visible and not persistent.\n this._activeRipples.forEach(ripple => {\n // By default, only ripples that are completely visible will fade out on pointer release.\n // If the `terminateOnPointerUp` option is set, ripples that still fade in will also fade out.\n const isVisible = ripple.state === RippleState.VISIBLE ||\n ripple.config.terminateOnPointerUp && ripple.state === RippleState.FADING_IN;\n\n if (!ripple.config.persistent && isVisible) {\n ripple.fadeOut();\n }\n });\n }\n\n /** Runs a timeout outside of the Angular zone to avoid triggering the change detection. */\n private _runTimeoutOutsideZone(fn: Function, delay = 0) {\n this._ngZone.runOutsideAngular(() => setTimeout(fn, delay));\n }\n\n /** Removes previously registered event listeners from the trigger element. */\n _removeTriggerEvents() {\n if (this._triggerElement) {\n this._triggerEvents.forEach((fn, type) => {\n this._triggerElement!.removeEventListener(type, fn, passiveEventOptions);\n });\n }\n }\n}\n\n/** Enforces a style recalculation of a DOM element by computing its styles. */\nfunction enforceStyleRecalculation(element: HTMLElement) {\n // Enforce a style recalculation by calling `getComputedStyle` and accessing any property.\n // Calling `getPropertyValue` is important to let optimizers know that this is not a noop.\n // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n window.getComputedStyle(element).getPropertyValue('opacity');\n}\n\n/**\n * Returns the distance from the point (x, y) to the furthest corner of a rectangle.\n */\nfunction distanceToFurthestCorner(x: number, y: number, rect: ClientRect) {\n const distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));\n const distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));\n return Math.sqrt(distX * distX + distY * distY);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** @docs-private */\nexport function getMatFormFieldPlaceholderConflictError(): Error {\n return Error('Placeholder attribute and child element were both specified.');\n}\n\n/** @docs-private */\nexport function getMatFormFieldDuplicatedHintError(align: string): Error {\n return Error(`A hint was already declared for 'align=\"${align}\"'.`);\n}\n\n/** @docs-private */\nexport function getMatFormFieldMissingControlError(): Error {\n return Error('mat-form-field must contain a MatFormFieldControl.');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** @docs-private */\nexport function getMatInputUnsupportedTypeError(type: string): Error {\n return Error(`Input type \"${type}\" isn't supported by matInput.`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** @docs-private */\nexport function createMissingDateImplError(provider: string) {\n return Error(\n `MatDatepicker: No provider found for ${provider}. You must import one of the following ` +\n `modules at your application root: MatNativeDateModule, MatMomentDateModule, or provide a ` +\n `custom implementation.`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Throws an exception for the case when menu trigger doesn't have a valid mat-menu instance\n * @docs-private\n */\nexport function throwMatMenuMissingError() {\n throw Error(`matMenuTriggerFor: must pass in an mat-menu instance.\n\n Example:\n <mat-menu #menu=\"matMenu\"></mat-menu>\n <button [matMenuTriggerFor]=\"menu\"></button>`);\n}\n\n/**\n * Throws an exception for the case when menu's x-position value isn't valid.\n * In other words, it doesn't match 'before' or 'after'.\n * @docs-private\n */\nexport function throwMatMenuInvalidPositionX() {\n throw Error(`xPosition value must be either 'before' or after'.\n Example: <mat-menu xPosition=\"before\" #menu=\"matMenu\"></mat-menu>`);\n}\n\n/**\n * Throws an exception for the case when menu's y-position value isn't valid.\n * In other words, it doesn't match 'above' or 'below'.\n * @docs-private\n */\nexport function throwMatMenuInvalidPositionY() {\n throw Error(`yPosition value must be either 'above' or below'.\n Example: <mat-menu yPosition=\"above\" #menu=\"matMenu\"></mat-menu>`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Returns an exception to be thrown when attempting to change a select's `multiple` option\n * after initialization.\n * @docs-private\n */\nexport function getMatSelectDynamicMultipleError(): Error {\n return Error('Cannot change `multiple` mode of select after initialization.');\n}\n\n/**\n * Returns an exception to be thrown when attempting to assign a non-array value to a select\n * in `multiple` mode. Note that `undefined` and `null` are still valid values to allow for\n * resetting the value.\n * @docs-private\n */\nexport function getMatSelectNonArrayValueError(): Error {\n return Error('Value must be an array in multiple-selection mode.');\n}\n\n/**\n * Returns an exception to be thrown when assigning a non-function value to the comparator\n * used to determine if a value corresponds to an option. Note that whether the function\n * actually takes two values and returns a boolean is not checked.\n */\nexport function getMatSelectNonFunctionValueError(): Error {\n return Error('`compareWith` must be a function.');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** @docs-private */\nexport function getSortDuplicateSortableIdError(id: string): Error {\n return Error(`Cannot have two MatSortables with the same id (${id}).`);\n}\n\n/** @docs-private */\nexport function getSortHeaderNotContainedWithinSortError(): Error {\n return Error(`MatSortHeader must be placed within a parent element with the MatSort directive.`);\n}\n\n/** @docs-private */\nexport function getSortHeaderMissingIdError(): Error {\n return Error(`MatSortHeader must be provided with a unique id.`);\n}\n\n/** @docs-private */\nexport function getSortInvalidDirectionError(direction: string): Error {\n return Error(`${direction} is not a valid sort direction ('asc' or 'desc').`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Version} from '@angular/core';\n\n/** Current version of Angular Material. */\nexport const VERSION = new Version('8.1.0');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** @docs-private */\nexport class AnimationCurves {\n static STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n static DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n static ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n static SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n}\n\n\n/** @docs-private */\nexport class AnimationDurations {\n static COMPLEX = '375ms';\n static ENTERING = '225ms';\n static EXITING = '195ms';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n\nexport type MatDateFormats = {\n parse: {\n dateInput: any\n },\n display: {\n dateInput: any,\n monthYearLabel: any,\n dateA11yLabel: any,\n monthYearA11yLabel: any,\n }\n};\n\n\nexport const MAT_DATE_FORMATS = new InjectionToken<MatDateFormats>('mat-date-formats');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {MatDateFormats} from './date-formats';\n\n\nexport const MAT_NATIVE_DATE_FORMATS: MatDateFormats = {\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {year: 'numeric', month: 'numeric', day: 'numeric'},\n monthYearLabel: {year: 'numeric', month: 'short'},\n dateA11yLabel: {year: 'numeric', month: 'long', day: 'numeric'},\n monthYearA11yLabel: {year: 'numeric', month: 'long'},\n }\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {PlatformModule} from '@angular/cdk/platform';\nimport {NgModule} from '@angular/core';\nimport {DateAdapter} from './date-adapter';\nimport {MAT_DATE_FORMATS} from './date-formats';\nimport {NativeDateAdapter} from './native-date-adapter';\nimport {MAT_NATIVE_DATE_FORMATS} from './native-date-formats';\n\nexport * from './date-adapter';\nexport * from './date-formats';\nexport * from './native-date-adapter';\nexport * from './native-date-formats';\n\n\n@NgModule({\n imports: [PlatformModule],\n providers: [\n {provide: DateAdapter, useClass: NativeDateAdapter},\n ],\n})\nexport class NativeDateModule {}\n\n\n@NgModule({\n imports: [NativeDateModule],\n providers: [{provide: MAT_DATE_FORMATS, useValue: MAT_NATIVE_DATE_FORMATS}],\n})\nexport class MatNativeDateModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable} from '@angular/core';\nimport {FormGroupDirective, NgForm, FormControl} from '@angular/forms';\n\n/** Error state matcher that matches when a control is invalid and dirty. */\n@Injectable()\nexport class ShowOnDirtyErrorStateMatcher implements ErrorStateMatcher {\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n return !!(control && control.invalid && (control.dirty || (form && form.submitted)));\n }\n}\n\n/** Provider that defines how form controls behave with regards to displaying error messages. */\n@Injectable({providedIn: 'root'})\nexport class ErrorStateMatcher {\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n return !!(control && control.invalid && (control.touched || (form && form.submitted)));\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, InjectionToken, Inject, Optional} from '@angular/core';\nimport {HammerGestureConfig} from '@angular/platform-browser';\nimport {MatCommonModule} from '../common-behaviors/common-module';\nimport {\n HammerStatic,\n HammerInstance,\n Recognizer,\n RecognizerStatic,\n HammerOptions,\n} from './gesture-annotations';\n\n/**\n * Injection token that can be used to provide options to the Hammerjs instance.\n * More info at http://hammerjs.github.io/api/.\n */\nexport const MAT_HAMMER_OPTIONS = new InjectionToken<HammerOptions>('MAT_HAMMER_OPTIONS');\n\nconst ANGULAR_MATERIAL_SUPPORTED_HAMMER_GESTURES = [\n 'longpress',\n 'slide',\n 'slidestart',\n 'slideend',\n 'slideright',\n 'slideleft'\n];\n\n/**\n * Fake HammerInstance that is used when a Hammer instance is requested when HammerJS has not\n * been loaded on the page.\n */\nconst noopHammerInstance: HammerInstance = {\n on: () => {},\n off: () => {},\n};\n\n/** Adjusts configuration of our gesture library, Hammer. */\n@Injectable()\nexport class GestureConfig extends HammerGestureConfig {\n /** List of new event names to add to the gesture support list */\n events = ANGULAR_MATERIAL_SUPPORTED_HAMMER_GESTURES;\n\n constructor(\n @Optional() @Inject(MAT_HAMMER_OPTIONS) private _hammerOptions?: HammerOptions,\n @Optional() commonModule?: MatCommonModule) {\n super();\n if (commonModule) {\n commonModule._checkHammerIsAvailable();\n }\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://material.io/design/#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 buildHammer(element: HTMLElement): HammerInstance {\n const hammer: HammerStatic = typeof window !== 'undefined' ? (window as any).Hammer : null;\n\n if (!hammer) {\n // If HammerJS is not loaded here, return the noop HammerInstance. This is necessary to\n // ensure that omitting HammerJS completely will not cause any errors while *also* supporting\n // the lazy-loading of HammerJS via the HAMMER_LOADER token introduced in Angular 6.1.\n // Because we can't depend on HAMMER_LOADER's existance until 7.0, we have to always set\n // `this.events` to the set we support, instead of conditionally setting it to `[]` if\n // `HAMMER_LOADER` is present (and then throwing an Error here if `window.Hammer` is\n // undefined).\n // @breaking-change 8.0.0\n return noopHammerInstance;\n }\n\n const mc = new hammer(element, this._hammerOptions || undefined);\n\n // Default Hammer Recognizers.\n const pan = new hammer.Pan();\n const swipe = new hammer.Swipe();\n const press = new hammer.Press();\n\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 const slide = this._createRecognizer(pan, {event: 'slide', threshold: 0}, swipe);\n const longpress = this._createRecognizer(press, {event: 'longpress', time: 500});\n\n // Overwrite the default `pan` event to use the swipe event.\n pan.recognizeWith(swipe);\n\n // Since the slide event threshold is set to zero, the slide recognizer can fire and\n // accidentally reset the longpress recognizer. In order to make sure that the two\n // recognizers can run simultaneously but don't affect each other, we allow the slide\n // recognizer to recognize while a longpress is being processed.\n // See: https://github.com/hammerjs/hammer.js/blob/master/src/manager.js#L123-L124\n longpress.recognizeWith(slide);\n\n // Add customized gestures to Hammer manager\n mc.add([swipe, press, pan, slide, longpress]);\n\n return mc as HammerInstance;\n }\n\n /** Creates a new recognizer, without affecting the default recognizers of HammerJS */\n private _createRecognizer(base: Recognizer, options: any, ...inheritances: Recognizer[]) {\n let recognizer = new (base.constructor as RecognizerStatic)(options);\n\n inheritances.push(base);\n inheritances.forEach(item => recognizer.recognizeWith(item));\n\n return recognizer;\n }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {RippleConfig, RippleRenderer} from './ripple-renderer';\n\n/** Possible states for a ripple element. */\nexport enum RippleState {\n FADING_IN, VISIBLE, FADING_OUT, HIDDEN\n}\n\n/**\n * Reference to a previously launched ripple element.\n */\nexport class RippleRef {\n\n /** Current state of the ripple. */\n state: RippleState = RippleState.HIDDEN;\n\n constructor(\n private _renderer: RippleRenderer,\n /** Reference to the ripple HTML element. */\n public element: HTMLElement,\n /** Ripple configuration used for the ripple. */\n public config: RippleConfig) {\n }\n\n /** Fades out the ripple element. */\n fadeOut() {\n this._renderer.fadeOutRipple(this);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Optional,\n} from '@angular/core';\nimport {RippleRef} from './ripple-ref';\nimport {RippleAnimationConfig, RippleConfig, RippleRenderer, RippleTarget} from './ripple-renderer';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n/** Configurable options for `matRipple`. */\nexport interface RippleGlobalOptions {\n /**\n * Whether ripples should be disabled. Ripples can be still launched manually by using\n * the `launch()` method. Therefore focus indicators will still show up.\n */\n disabled?: boolean;\n\n /**\n * Configuration for the animation duration of the ripples. There are two phases with different\n * durations for the ripples. The animation durations will be overwritten if the\n * `NoopAnimationsModule` is being used.\n */\n animation?: RippleAnimationConfig;\n\n /**\n * Whether ripples should start fading out immediately after the mouse our touch is released. By\n * default, ripples will wait for the enter animation to complete and for mouse or touch release.\n */\n terminateOnPointerUp?: boolean;\n}\n\n/** Injection token that can be used to specify the global ripple options. */\nexport const MAT_RIPPLE_GLOBAL_OPTIONS =\n new InjectionToken<RippleGlobalOptions>('mat-ripple-global-options');\n\n@Directive({\n selector: '[mat-ripple], [matRipple]',\n exportAs: 'matRipple',\n host: {\n 'class': 'mat-ripple',\n '[class.mat-ripple-unbounded]': 'unbounded'\n }\n})\nexport class MatRipple implements OnInit, OnDestroy, RippleTarget {\n\n /** Custom color for all ripples. */\n @Input('matRippleColor') color: string;\n\n /** Whether the ripples should be visible outside the component's bounds. */\n @Input('matRippleUnbounded') unbounded: boolean;\n\n /**\n * Whether the ripple always originates from the center of the host element's bounds, rather\n * than originating from the location of the click event.\n */\n @Input('matRippleCentered') centered: boolean;\n\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 @Input('matRippleRadius') radius: number = 0;\n\n /**\n * Configuration for the ripple animation. Allows modifying the enter and exit animation\n * duration of the ripples. The animation durations will be overwritten if the\n * `NoopAnimationsModule` is being used.\n */\n @Input('matRippleAnimation') animation: RippleAnimationConfig;\n\n /**\n * Whether click events will not trigger the ripple. Ripples can be still launched manually\n * by using the `launch()` method.\n */\n @Input('matRippleDisabled')\n get disabled() { return this._disabled; }\n set disabled(value: boolean) {\n this._disabled = value;\n this._setupTriggerEventsIfEnabled();\n }\n private _disabled: boolean = false;\n\n /**\n * The element that triggers the ripple when click events are received.\n * Defaults to the directive's host element.\n */\n @Input('matRippleTrigger')\n get trigger() { return this._trigger || this._elementRef.nativeElement; }\n set trigger(trigger: HTMLElement) {\n this._trigger = trigger;\n this._setupTriggerEventsIfEnabled();\n }\n private _trigger: HTMLElement;\n\n /** Renderer for the ripple DOM manipulations. */\n private _rippleRenderer: RippleRenderer;\n\n /** Options that are set globally for all ripples. */\n private _globalOptions: RippleGlobalOptions;\n\n /** Whether ripple directive is initialized and the input bindings are set. */\n private _isInitialized: boolean = false;\n\n constructor(private _elementRef: ElementRef<HTMLElement>,\n ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS) globalOptions?: RippleGlobalOptions,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n\n this._globalOptions = globalOptions || {};\n this._rippleRenderer = new RippleRenderer(this, ngZone, _elementRef, platform);\n\n if (animationMode === 'NoopAnimations') {\n this._globalOptions.animation = {enterDuration: 0, exitDuration: 0};\n }\n }\n\n ngOnInit() {\n this._isInitialized = true;\n this._setupTriggerEventsIfEnabled();\n }\n\n ngOnDestroy() {\n this._rippleRenderer._removeTriggerEvents();\n }\n\n /** Fades out all currently showing ripple elements. */\n fadeOutAll() {\n this._rippleRenderer.fadeOutAll();\n }\n\n /**\n * Ripple configuration from the directive's input values.\n * @docs-private Implemented as part of RippleTarget\n */\n get rippleConfig(): RippleConfig {\n return {\n centered: this.centered,\n radius: this.radius,\n color: this.color,\n animation: {...this._globalOptions.animation, ...this.animation},\n terminateOnPointerUp: this._globalOptions.terminateOnPointerUp,\n };\n }\n\n /**\n * Whether ripples on pointer-down are disabled or not.\n * @docs-private Implemented as part of RippleTarget\n */\n get rippleDisabled(): boolean {\n return this.disabled || !!this._globalOptions.disabled;\n }\n\n /** Sets up the trigger event listeners if ripples are enabled. */\n private _setupTriggerEventsIfEnabled() {\n if (!this.disabled && this._isInitialized) {\n this._rippleRenderer.setupTriggerEvents(this.trigger);\n }\n }\n\n /**\n * Launches a manual ripple using the specified ripple configuration.\n * @param config Configuration for the manual ripple.\n */\n launch(config: RippleConfig): RippleRef;\n\n /**\n * Launches a manual ripple at the specified coordinates within the element.\n * @param x Coordinate within the element, along the X axis at which to fade-in the ripple.\n * @param y Coordinate within the element, along the Y axis at which to fade-in the ripple.\n * @param config Optional ripple configuration for the manual ripple.\n */\n launch(x: number, y: number, config?: RippleConfig): RippleRef;\n\n /** Launches a manual ripple at the specified coordinated or just by the ripple config. */\n launch(configOrX: number | RippleConfig, y: number = 0, config?: RippleConfig): RippleRef {\n if (typeof configOrX === 'number') {\n return this._rippleRenderer.fadeInRipple(configOrX, y, {...this.rippleConfig, ...config});\n } else {\n return this._rippleRenderer.fadeInRipple(0, 0, {...this.rippleConfig, ...configOrX});\n }\n }\n}\n\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {PlatformModule} from '@angular/cdk/platform';\nimport {MatCommonModule} from '../common-behaviors/common-module';\nimport {MatRipple} from './ripple';\n\nexport * from './ripple';\nexport * from './ripple-ref';\nexport * from './ripple-renderer';\n\n@NgModule({\n imports: [MatCommonModule, PlatformModule],\n exports: [MatRipple, MatCommonModule],\n declarations: [MatRipple],\n})\nexport class MatRippleModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ViewEncapsulation,\n Input,\n ChangeDetectionStrategy,\n Inject,\n Optional,\n} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n/**\n * Possible states for a pseudo checkbox.\n * @docs-private\n */\nexport type MatPseudoCheckboxState = 'unchecked' | 'checked' | 'indeterminate';\n\n/**\n * Component that shows a simplified checkbox without including any kind of \"real\" checkbox.\n * Meant to be used when the checkbox is purely decorative and a large number of them will be\n * included, such as for the options in a multi-select. Uses no SVGs or complex animations.\n * Note that theming is meant to be handled by the parent element, e.g.\n * `mat-primary .mat-pseudo-checkbox`.\n *\n * Note that this component will be completely invisible to screen-reader users. This is *not*\n * interchangeable with `<mat-checkbox>` and should *not* be used if the user would directly\n * interact with the checkbox. The pseudo-checkbox should only be used as an implementation detail\n * of more complex components that appropriately handle selected / checked state.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'mat-pseudo-checkbox',\n styleUrls: ['pseudo-checkbox.css'],\n template: '',\n host: {\n 'class': 'mat-pseudo-checkbox',\n '[class.mat-pseudo-checkbox-indeterminate]': 'state === \"indeterminate\"',\n '[class.mat-pseudo-checkbox-checked]': 'state === \"checked\"',\n '[class.mat-pseudo-checkbox-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n },\n})\nexport class MatPseudoCheckbox {\n /** Display state of the checkbox. */\n @Input() state: MatPseudoCheckboxState = 'unchecked';\n\n /** Whether the checkbox is disabled. */\n @Input() disabled: boolean = false;\n\n constructor(@Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {MatPseudoCheckbox} from './pseudo-checkbox/pseudo-checkbox';\n\n\n@NgModule({\n exports: [MatPseudoCheckbox],\n declarations: [MatPseudoCheckbox]\n})\nexport class MatPseudoCheckboxModule { }\n\n\nexport * from './pseudo-checkbox/pseudo-checkbox';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '../common-behaviors/disabled';\n\n\n// Boilerplate for applying mixins to MatOptgroup.\n/** @docs-private */\nclass MatOptgroupBase { }\nconst _MatOptgroupMixinBase: CanDisableCtor & typeof MatOptgroupBase =\n mixinDisabled(MatOptgroupBase);\n\n// Counter for unique group ids.\nlet _uniqueOptgroupIdCounter = 0;\n\n/**\n * Component that is used to group instances of `mat-option`.\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-optgroup',\n exportAs: 'matOptgroup',\n templateUrl: 'optgroup.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['disabled'],\n styleUrls: ['optgroup.css'],\n host: {\n 'class': 'mat-optgroup',\n 'role': 'group',\n '[class.mat-optgroup-disabled]': 'disabled',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-labelledby]': '_labelId',\n }\n})\nexport class MatOptgroup extends _MatOptgroupMixinBase implements CanDisable {\n /** Label for the option group. */\n @Input() label: string;\n\n /** Unique id for the underlying label. */\n _labelId: string = `mat-optgroup-label-${_uniqueOptgroupIdCounter++}`;\n}\n"],"names":["styles","host","class","[class.mat-tab-header-pagination-controls-enabled]","[class.mat-tab-header-rtl]","[class.mat-primary]","[class.mat-accent]","[class.mat-warn]","encapsulation","ViewEncapsulation","None","changeDetection","ChangeDetectionStrategy","OnPush","type","NgZone","ChangeDetectorRef","ViewportRuler","Platform","decorators","Optional","String","Inject","args","ANIMATION_MODULE_TYPE","MatTabNav","propDecorators","_tabListContainer","ViewChild","static","_tabList","_nextPaginator","_previousPaginator","backgroundColor","Input","disableRipple","color","MatTabLinkBase","_MatTabLinkMixinBase","mixinTabIndex","mixinDisableRipple","mixinDisabled","MatTabLink","_tabNavBar","elementRef","ngZone","platform","globalRippleOptions","tabIndex","_focusMonitor","animationMode","_this","_super","call","this","_tabLinkRipple","setupTriggerEvents","nativeElement","rippleConfig","parseInt","animation","enterDuration","exitDuration","monitor","get","_isActive","value","updateActiveLink","enumerable","configurable","disabled","stopMonitoring","Directive","exportAs","inputs","[attr.aria-current]","[attr.aria-disabled]","[attr.tabIndex]","[class.mat-tab-disabled]","[class.mat-tab-label-active]","undefined","MAT_RIPPLE_GLOBAL_OPTIONS","Attribute","FocusMonitor","MatTabsModule","NgModule","imports","CommonModule","MatCommonModule","PortalModule","MatRippleModule","ObserversModule","A11yModule","exports","MatTabGroup","MatTabLabel","MatTab","MatTabContent","declarations","MatInkBar","MatTabLabelWrapper","MatTabBody","MatTabBodyPortal","MatTabHeader","MatToolbarBase","_elementRef","_MatToolbarMixinBase","mixinColor","MatToolbarRow","selector","MatToolbar","_platform","document","_document","tslib_1.__extends","prototype","ngAfterViewInit","isDevMode","isBrowser","_checkToolbarMixedModes","_toolbarRows","changes","subscribe","length","Array","from","childNodes","filter","node","classList","contains","nodeType","COMMENT_NODE","some","textContent","trim","throwToolbarMixedModesError","Component","template","[class.mat-toolbar-multiple-rows]","[class.mat-toolbar-single-row]","DOCUMENT","MatToolbarModule","MatTreeNodeOutlet","viewContainer","_node","ViewContainerRef","CDK_TREE_NODE_OUTLET_NODE","_MatTreeNodeMixinBase","CdkTreeNode","_MatNestedTreeNodeMixinBase","CdkNestedTreeNode","MatTreeNode","_tree","role","Number","[attr.aria-expanded]","[attr.aria-level]","[attr.role]","providers","provide","useExisting","ElementRef","CdkTree","MatTreeNodeDef","CdkTreeNodeDef","data","MatNestedTreeNode","_differs","ngAfterContentInit","ngOnDestroy","IterableDiffers","nodeOutlet","ContentChildren","descendants","MatTreeNodePadding","CdkTreeNodePadding","level","indent","MatTree","MatTreeNodeToggle","apply","arguments","recursive","CdkTreeNodeToggle","MAT_TREE_DIRECTIVES","MatTreeModule","CdkTreeModule","MatTreeFlattener","transformFunction","getLevel","isExpandable","getChildren","_flattenNode","resultNodes","parentMap","flatNode","push","childrenNodes","isArray","_flattenChildren","pipe","take","children","forEach","child","index","childParentMap","slice","flattenNodes","structuredData","expandFlattenedNodes","nodes","treeControl","results","currentExpand","expand","i","isExpanded","MatTreeFlatDataSource","_treeControl","_treeFlattener","initialData","_flattenedData","BehaviorSubject","_expandedData","_data","Object","defineProperty","next","dataNodes","connect","collectionViewer","viewChange","expansionModel","onChange","merge","map","disconnect","DataSource","MatTreeNestedDataSource","SELECT_PANEL_PADDING_X","_filterData","orderedData","combineLatest","filteredData","sortChange","_a","_orderData","paginatedData","pageChange","_pageData","_renderChangesSubscription","unsubscribe","_renderData","MatTableDataSource","obj","filterPredicate","paginator","_updatePaginator","sort","sortData","startIndex","pageIndex","pageSize","splice","filteredDataLength","Promise","resolve","then","lastPageIndex","Math","ceil","newPageIndex","min","_internalPageChanges","_MAT_INK_BAR_POSITIONER","InjectionToken","providedIn","factory","_MAT_INK_BAR_POSITIONER_FACTORY","_ngZone","_inkBarPositioner","_animationMode","alignToElement","element","show","requestAnimationFrame","runOutsideAngular","_setStyles","style","visibility","hide","positions","inkBar","left","width","[class._mat-animation-noopable]","TemplateRef","CdkPortal","MatTabBase","_MatTabMixinBase","_viewContainerRef","textLabel","_contentPortal","_stateChanges","Subject","position","origin","isActive","ngOnChanges","hasOwnProperty","complete","ngOnInit","TemplatePortal","_explicitContent","_implicitContent","ariaLabel","ariaLabelledby","matTabsAnimations","translateTab","trigger","state","transform","minHeight","transition","animate","componentFactoryResolver","viewContainerRef","_host","_centeringSub","Subscription","EMPTY","_leavingSub","_beforeCentering","startWith","_isCenterPosition","_position","isCentering","hasAttached","attach","_content","_afterLeavingCenter","detach","ComponentFactoryResolver","forwardRef","CdkPortalOutlet","_dir","changeDetectorRef","_dirChangeSubscription","_translateTabComplete","_onCentering","EventEmitter","_onCentered","animationDuration","change","dir","_computePositionAnimationState","markForCheck","distinctUntilChanged","x","y","fromState","toState","event","emit","_positionIndex","_computePositionFromOrigin","_onTranslateTabStarted","clientHeight","_getLayoutDirection","animations","Output","_portalHost","PortalHostDirective","MatTabLabelWrapperBase","_MatTabLabelWrapperMixinBase","focus","getOffsetLeft","offsetLeft","getOffsetWidth","offsetWidth","passiveEventListenerOptions","normalizePassiveListenerOptions","passive","MatPaginatedTabHeader","_changeDetectorRef","_viewportRuler","_scrollDistance","_selectedIndexChanged","_destroyed","_showPaginationControls","_disableScrollAfter","_disableScrollBefore","_stopScrolling","_selectedIndex","selectFocusedIndex","indexFocused","fromEvent","takeUntil","_stopInterval","coerceNumberProperty","_keyManager","updateActiveItemIndex","_handlePaginatorPress","dirChange","observableOf","resize","realign","updatePagination","_alignInkBarToSelectedTab","FocusKeyManager","_items","withHorizontalOrientation","withWrap","updateActiveItem","newFocusIndex","_setTabFocus","ngAfterContentChecked","_tabLabelCount","_scrollToLabel","_checkScrollingControls","_scrollDistanceChanged","_updateTabScrollPosition","_handleKeydown","hasModifierKey","keyCode","HOME","setFirstItemActive","preventDefault","END","setLastItemActive","ENTER","SPACE","focusIndex","_itemSelected","onKeydown","_onContentChanges","_currentTextContent","run","_checkPaginationEnabled","_isValidIndex","setActiveItem","tab","toArray","containerEl","scrollLeft","scrollWidth","scrollDistance","translateX","round","TRIDENT","EDGE","_scrollTo","_scrollHeader","direction","viewLength","scrollAmount","_handlePaginatorClick","labelIndex","selectedLabel","labelBeforePos","labelAfterPos","beforeVisiblePos","afterVisiblePos","isEnabled","_getMaxScrollDistance","selectedItem","selectedIndex","selectedLabelWrapper","_inkBar","timer","maxScrollDistance","distance","max","Directionality","viewportRuler","_disableRipple","coerceBooleanProperty","outputs","nextId","MatTabChangeEvent","MAT_TABS_CONFIG","MatTabGroupBase","_MatTabGroupMixinBase","defaultConfig","_indexToSelect","_tabBodyWrapperHeight","_tabsSubscription","_tabLabelSubscription","_dynamicHeight","headerPosition","selectedIndexChange","focusChange","animationDone","selectedTabChange","_groupId","_animationDuration","test","_backgroundColor","remove","add","indexToSelect","_clampTabIndex","isFirstRun_1","_createChangeEvent","_tabs","_subscribeToTabLabels","tabs","realignInkBar","_tabHeader","_focusChanged","_getTabLabelId","_getTabContentId","_setTabBodyWrapperHeight","tabHeight","wrapper","_tabBodyWrapper","height","offsetHeight","_removeTabBodyWrapperHeight","_handleClick","tabHeader","_getTabIndex","idx","[class.mat-tab-group-dynamic-height]","[class.mat-tab-group-inverted-header]","dynamicHeight","_element","items","active","_arrowDirection","_isSorted","_sort","start","MatSortHeader","_isDisabled","_getAriaSortAttribute","_renderArrow","(click)","(mouseenter)","(longpress)","(mouseleave)","[attr.aria-sort]","[class.mat-sort-header-disabled]","matSortAnimations","indicator","leftPointer","rightPointer","arrowOpacity","arrowPosition","allowChildren","MatSort","disableClear","MatSortModule","MAT_SORT_HEADER_INTL_PROVIDER","MatStepLabel","CdkStepLabel","MatStepperIntl","optionalLabel","Injectable","MAT_STEPPER_INTL_PROVIDER","deps","SkipSelf","useFactory","MAT_STEPPER_INTL_PROVIDER_FACTORY","MatStepHeader","_intl","_intlSubscription","focusVia","_stringLabel","label","_templateLabel","_getHostElement","_getIconContext","optional","_getDefaultTextForState","errorMessage","iconOverrides","selected","matStepperAnimations","horizontalStepTransition","verticalStepTransition","MatStepperIcon","templateRef","name","MatStep","stepper","_errorStateMatcher","stepperOptions","isErrorState","control","form","originalErrorState","customErrorState","invalid","interacted","ErrorStateMatcher","STEPPER_GLOBAL_OPTIONS","MatStepper","_icons","_iconOverrides","_steps","CdkStepper","MatHorizontalStepper","[class.mat-stepper-label-position-end]","[class.mat-stepper-label-position-bottom]","aria-orientation","labelPosition","MatVerticalStepper","_orientation","ctorParameters","MatStepperNext","[type]","CdkStepperNext","MatStepperPrevious","CdkStepperPrevious","MatStepperModule","MatButtonModule","CdkStepperModule","MatIconModule","MatTable","stickyCssClass","CDK_TABLE_TEMPLATE","CdkTable","MatCellDef","CdkCellDef","MatHeaderCellDef","CdkHeaderCellDef","MatFooterCellDef","CdkFooterCellDef","MatColumnDef","CdkColumnDef","sticky","stickyEnd","MatHeaderCell","columnDef","cssClassFriendlyName","CdkHeaderCell","MatFooterCell","CdkFooterCell","MatCell","CdkCell","MatHeaderRowDef","CdkHeaderRowDef","MatFooterRowDef","CdkFooterRowDef","MatRowDef","CdkRowDef","MatHeaderRow","CDK_ROW_TEMPLATE","CdkHeaderRow","MatFooterRow","Default","CdkFooterRow","MatRow","CdkRow","MatTextColumn","EXPORTED_DECLARATIONS","MatTableModule","CdkTableModule","MAX_SAFE_INTEGER","_filter","sortingDataAccessor","sortHeaderId","_isNumberValue","numberValue","a","b","valueA","valueB","comparatorResult","dataStr","keys","reduce","currentTerm","key","toLowerCase","transformedFilter","indexOf","_updateChangeSubscription","_paginator","initialized","page","dataStream","detectChanges","MatSlider","_onMouseenter","_sliderDimensions","_getSliderDimensions","_updateTickIntervalPercent","_onMousedown","button","oldValue","_isSliding","_focusHostElement","_updateValueFromPosition","clientX","clientY","_emitInputEvent","_emitChangeEvent","_onSlide","_onSlideStart","center","_valueOnSlideStart","_onSlideEnd","_onFocus","_onBlur","onTouched","_onKeydown","PAGE_UP","_increment","PAGE_DOWN","LEFT_ARROW","_getDirection","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","_onKeyup","numSteps","_clamp","step","pos","offset","vertical","top","size","posComponent","percent","_shouldInvertMouseCoords","exactValue","_calculateValue","closestValue","_controlValueAccessorChangeFn","valueChange","input","tickInterval","trackSize","pixelsPerStep","stepsPerTick","pixelsPerTick","_tickIntervalPercent","MatSliderChange","source","_calculatePercentage","percentage","_sliderWrapper","getBoundingClientRect","_blurHostElement","blur","writeValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","MAT_SLIDER_VALUE_ACCESSOR","(focus)","(blur)","(mousedown)","(keydown)","(keyup)","(slide)","(slideend)","(slidestart)","[tabIndex]","[attr.aria-valuemax]","[attr.aria-valuemin]","[attr.aria-valuenow]","[attr.aria-orientation]","[class.mat-slider-disabled]","[class.mat-slider-has-ticks]","[class.mat-slider-horizontal]","[class.mat-slider-axis-inverted]","[class.mat-slider-sliding]","[class.mat-slider-thumb-label-showing]","[class.mat-slider-vertical]","[class.mat-slider-min-value]","[class.mat-slider-hide-last-tick]","thumbLabel","displayWith","MatSliderModule","HAMMER_GESTURE_CONFIG","useClass","GestureConfig","MatSnackBarRef","containerInstance","_overlayRef","_afterDismissed","_afterOpened","_onAction","_dismissedByAction","onAction","dismiss","_onExit","_finishDismiss","closed","exit","clearTimeout","_durationTimeoutId","dismissWithAction","closeWithAction","_dismissAfter","duration","setTimeout","_open","dispose","dismissedByAction","afterDismissed","asObservable","afterOpened","_onEnter","MAT_SNACK_BAR_DATA","MatSnackBarConfig","politeness","announcementMessage","horizontalPosition","verticalPosition","SimpleSnackBar","snackBarRef","action","matSnackBarAnimations","snackBarState","opacity","MatSnackBarContainer","snackBarConfig","_animationState","_role","attachComponentPortal","portal","_assertNotAttached","_applySnackBarClasses","_portalOutlet","attachTemplatePortal","onAnimationEnd","_completeExit","onEnter_1","enter","onMicrotaskEmpty","panelClasses","panelClass","cssClass","Error","[@state]","(@state.done)","MatSnackBarModule","OverlayModule","entryComponents","MAT_SNACK_BAR_DEFAULT_OPTIONS","MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY","MatSnackBar","_overlay","_live","_injector","_breakpointObserver","_parentSnackBar","_defaultConfig","_snackBarRefAtThisLevel","parent","_openedSnackBarRef","openFromComponent","component","config","_attach","openFromTemplate","open","message","_config","tslib_1.__assign","_attachSnackBarContainer","overlayRef","userInjector","injector","PortalInjector","WeakMap","containerPortal","ComponentPortal","containerRef","instance","content","userConfig","_createOverlay","container","$implicit","_createInjector","contentRef","observe","Breakpoints","Handset","detachments","matches","overlayElement","_animateSnackBar","clear","announce","overlayConfig","OverlayConfig","positionStrategy","global","isRtl","isLeft","isRight","right","centerHorizontally","bottom","create","Overlay","LiveAnnouncer","Injector","BreakpointObserver","MatSortBase","_MatSortMixinBase","mixinInitialized","sortables","Map","_direction","getSortInvalidDirectionError","_disableClear","v","register","sortable","id","getSortHeaderMissingIdError","has","getSortDuplicateSortableIdError","set","deregister","delete","getNextSortDirection","sortDirectionCycle","getSortDirectionCycle","nextDirectionIndex","_markInitialized","SORT_ANIMATION_TRANSITION","AnimationDurations","ENTERING","AnimationCurves","STANDARD_CURVE","keyframes","query","animateChild","MatSortHeaderIntl","sortButtonLabel","MAT_SORT_HEADER_INTL_PROVIDER_FACTORY","MatSortHeaderBase","_MatSortHeaderMixinBase","_columnDef","_showIndicatorHint","_disableViewStateAnimation","getSortHeaderNotContainedWithinSortError","_rerenderSubscription","_updateArrowDirection","_viewState","_setAnimationTransitionState","_setIndicatorHintVisible","visible","viewState","_getArrowDirectionState","_getArrowViewState","MatDrawer","matDrawerAnimations","transformDrawer","[attr.align]","[class.mat-drawer-end]","[class.mat-drawer-over]","[class.mat-drawer-side]","mode","HostBinding","openedChange","_openedStream","openedStart","_closedStream","closedStart","onPositionChanged","opened","_animationStartListener","HostListener","_animationDoneListener","backdropClick","_doCheckSubject","_validateDrawers","updateContentMargins","_autosize","defaultAutosize","MatDrawerContainer","_backdropOverride","drawer","_drawers","_isDrawerOpen","_start","_end","debounceTime","_contentMarginChanges","close","_left","_width","_right","_contentMargins","ngDoCheck","_setContainerClass","throwMatDuplicatedDrawerError","_onBackdropClicked","_closeModalDrawer","disableClose","_canHaveBackdrop","_isShowingBackdrop","[class.mat-drawer-container-explicit-backdrop]","ContentChild","MatDrawerContent","_userContent","autosize","MatSidenavContent","scrollDispatcher","[style.margin-left.px]","[style.margin-right.px]","ScrollDispatcher","MatSidenav","_fixedInViewport","_fixedTopGap","_fixedBottomGap","[class.mat-sidenav-fixed]","[style.top.px]","[style.bottom.px]","fixedInViewport","fixedTopGap","MatSidenavContainer","MatSidenavModule","ScrollingModule","PlatformModule","MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS","disableToggleValue","disableDragValue","nextUniqueId","MAT_SLIDE_TOGGLE_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","MatSlideToggle","multi","MatSlideToggleChange","checked","MatSlideToggleBase","_MatSlideToggleMixinBase","defaults","_onChange","_","_onTouched","_uniqueId","_required","_checked","_dragging","toggleChange","dragChange","focusOrigin","_onChangeEvent","stopPropagation","_inputElement","_onInputClick","toggle","_getDragPercentage","_thumbBarWidth","_previousChecked","_onDragStart","thumbEl","_thumbEl","_thumbBarEl","clientWidth","_onDrag","_dragPercentage","deltaX","dragX","_onDragEnd","newCheckedValue","_onLabelTextChange","[id]","[attr.tabindex]","[class.mat-disabled]","[class.mat-slide-toggle-label-before]","required","MatSlideToggleModule","MatSliderBase","_MatSliderMixinBase","_invert","_max","_min","_step","_thumbLabel","_tickInterval","_value","_vertical","_percent","_roundToDecimal","toString","split","pop","parseFloat","toFixed","invert","_isMinValue","axis","scale","_thumbGap","tickSize","backgroundSize","sign","rotate","_invertAxis","MatProgressSpinner","_diameter","BASE_SIZE","_fallbackAnimation","trackedDiameters","_diameters","head","Set","_styleRoot","_getShadowRoot","_noopAnimations","_forceAnimations","diameter","strokeWidth","animationClass","diametersForElement","_attachStyleNode","_strokeWidth","newValue","viewBox","_circleRadius","PI","_strokeCircumference","styleTag","createElement","styleRoot","currentDiameter","diameters","setAttribute","_getAnimationText","appendChild","INDETERMINATE_ANIMATION_TEMPLATE","replace","[style.width.px]","[style.height.px]","[attr.mode]","MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS","MatSpinner","MatProgressSpinnerModule","MAT_RADIO_DEFAULT_OPTIONS","MAT_RADIO_DEFAULT_OPTIONS_FACTORY","MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR","MatRadioGroup","MatRadioChange","_changeDetector","_name","_selected","_isInitialized","_labelPosition","_disabled","_updateRadioButtonNames","_markRadiosForCheck","_updateSelectedRadioFromValue","_checkSelectedRadioButton","_touch","_radios","radio","_markForCheck","isAlreadySelected","MatRadioButton","MatRadioButtonBase","_MatRadioButtonMixinBase","radioGroup","_radioDispatcher","_providerOverride","_removeUniqueSelectionListener","listen","newCheckedState","notify","newDisabledState","_color","_isRippleDisabled","_onInputChange","groupValueChanged","[class.mat-radio-checked]","[class.mat-radio-disabled]","UniqueSelectionDispatcher","ariaDescribedby","MatRadioModule","box-shadow","MAT_DRAWER_DEFAULT_AUTOSIZE","MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY","_container","_focusTrapFactory","_doc","_elementFocusedBeforeDrawerWasOpened","_mode","_disableClose","_autoFocus","_isFocusTrapEnabled","_focusTrap","_trapFocus","_restoreFocus","_animationEnd","_opened","_modeChanged","autoFocus","focusInitialElementWhenReady","hasMovedFocus","activeEl","activeElement","HTMLElement","_openedVia","enabled","_enableAnimations","destroy","_animationStarted","isOpen","openedVia","[attr.aria-invalid]","[attr.aria-owns]","[attr.aria-multiselectable]","[attr.aria-describedby]","[attr.aria-activedescendant]","[class.mat-select-disabled]","[class.mat-select-invalid]","[class.mat-select-required]","[class.mat-select-empty]","matSelectAnimations","transformPanelWrap","transformPanel","MatFormFieldControl","MatSelect","MAT_OPTION_PARENT_COMPONENT","NgForm","FormGroupDirective","MatFormField","NgControl","Self","MAT_SELECT_SCROLL_STRATEGY","overlayDir","CdkConnectedOverlay","options","MatOption","optionGroups","MatOptgroup","customTrigger","MatSelectTrigger","placeholder","multiple","disableOptionCentering","compareWith","errorStateMatcher","sortComparator","selectionChange","MatSelectModule","MatOptionModule","MatFormFieldModule","MAT_SELECT_SCROLL_STRATEGY_PROVIDER","matTooltipAnimations","tooltipState","SCROLL_THROTTLE_MS","MAT_TOOLTIP_SCROLL_STRATEGY","MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER","MAT_TOOLTIP_SCROLL_STRATEGY_FACTORY","MAT_TOOLTIP_DEFAULT_OPTIONS","MAT_TOOLTIP_DEFAULT_OPTIONS_FACTORY","MatTooltip","_scrollDispatcher","_ariaDescriber","scrollStrategy","_defaultOptions","hammerLoader","showDelay","hideDelay","_message","_manualListeners","_scrollStrategy","hasGestures","window","Hammer","IOS","ANDROID","listener","addEventListener","_updatePosition","_tooltipInstance","updatePosition","removeDescription","_isTooltipVisible","_updateTooltipMessage","describe","_tooltipClass","_setTooltipClass","elementStyle","nodeName","webkitUserSelect","userSelect","msUserSelect","draggable","webkitUserDrag","removeEventListener","delay","_showTimeoutId","_hideTimeoutId","_detach","_portal","TooltipComponent","afterHidden","isVisible","e","ESCAPE","_handleTouchend","touchendHideDelay","scrollableAncestors","getAncestorScrollContainers","strategy","flexibleConnectedTo","withTransformOriginOn","withFlexibleDimensions","withViewportMargin","withScrollableContainers","positionChanges","scrollableViewProperties","isOverlayClipped","getConfig","_getOrigin","overlay","_getOverlayPosition","withPositions","main","fallback","originPosition","isLtr","originX","originY","getMatTooltipInvalidPositionError","_invertPosition","overlayPosition","overlayX","overlayY","tooltipClass","(touchend)","AriaDescriber","HAMMER_LOADER","_visibility","_closeOnInteraction","_onHide","_isHandset","_animationStart","_animationDone","_handleBodyInteraction","aria-hidden","MatTooltipModule","MatPaginatorIntl","itemsPerPageLabel","nextPageLabel","previousPageLabel","firstPageLabel","lastPageLabel","getRangeLabel","MAT_PAGINATOR_INTL_PROVIDER","MAT_PAGINATOR_INTL_PROVIDER_FACTORY","PageEvent","MatPaginatorBase","_MatPaginatorBase","MatPaginator","_pageIndex","_length","_pageSizeOptions","_hidePageSize","_showFirstLastButtons","_intlChanges","_pageSize","_updateDisplayedPageSizeOptions","p","_initialized","nextPage","hasNextPage","previousPageIndex","_emitPageEvent","previousPage","hasPreviousPage","firstPage","lastPage","getNumberOfPages","maxPageIndex","_changePageSize","floor","_nextButtonsDisabled","_previousButtonsDisabled","pageSizeOptions","_displayedPageSizeOptions","hidePageSize","showFirstLastButtons","MatPaginatorModule","MatProgressBarBase","_MatProgressBarMixinBase","MAT_PROGRESS_BAR_LOCATION","MAT_PROGRESS_BAR_LOCATION_FACTORY","progressbarId","MatProgressBar","location","_isNoopAnimation","_bufferValue","animationEnd","_animationEndSubscription","path","getPathname","_rectangleFillValue","clamp","_emitAnimationEnd","_primaryTransform","_bufferTransform","bufferValue","_primaryValueBar","target","aria-valuemin","aria-valuemax","MatProgressBarModule","MatProgressSpinnerBase","_MatProgressSpinnerMixinBase","MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY","matMenuAnimations","transformMenu","fadeInItems","MAT_MENU_PANEL","MatMenu","_MatMenu","MAT_MENU_DEFAULT_OPTIONS","MAT_MENU_SCROLL_STRATEGY","MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER","MAT_MENU_SCROLL_STRATEGY_FACTORY","MatMenuTrigger","_parentMenu","_menuItemInstance","_menuOpen","_closingActionsSubscription","_hoverSubscription","_menuCloseSubscription","_handleTouchStart","_openedBy","restoreFocus","menuOpened","onMenuOpen","menuClosed","onMenuClose","_triggersSubmenu","triggersSubmenu","menu","_menu","reason","_destroyMenu","_checkMenu","_handleHover","toggleMenu","closeMenu","openMenu","_setPosition","hasBackdrop","_getPortal","lazyContent","menuData","_menuClosingActions","_initMenu","_startAnimation","menuOpen","_resetAnimation","_attached","_resetMenu","parentMenu","_setMenuElevation","_setIsMenuOpen","focusFirstItem","setElevation","depth","_highlighted","throwMatMenuMissingError","_getOverlayConfig","_subscribeToPositions","keydownEvents","withLockedPosition","backdropClass","setPositionClasses","posX","connectionPair","posY","xPosition","originFallbackX","_b","yPosition","overlayFallbackY","_c","originFallbackY","_d","overlayFallbackX","offsetY","overlapTrigger","backdrop","parentClose","hover","_hovered","_handleMousedown","isFakeMousedownFromScreenReader","asapScheduler","_isAnimating","aria-haspopup","MatMenuItem","_deprecatedMatMenuTriggerFor","_MatMenuDirectivesModule","MatMenuContent","MatMenuModule","minWidth","fadeInContent","SELECT_MULTIPLE_PANEL_PADDING_X","MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY","MatSelectChange","MatSelectBase","_defaultErrorStateMatcher","_parentForm","_parentFormGroup","ngControl","_MatSelectMixinBase","mixinErrorState","_parentFormField","scrollStrategyFactory","_liveAnnouncer","_panelOpen","_scrollTop","_multiple","_compareWith","o1","o2","_uid","_destroy","_triggerFontSize","_optionIds","_transformOrigin","_panelDoneAnimatingStream","_offsetY","_positions","_disableOptionCentering","_focused","controlType","optionSelectionChanges","defer","switchMap","option","onSelectionChange","onStable","o","valueAccessor","_scrollStrategyFactory","_placeholder","stateChanges","_selectionModel","getMatSelectDynamicMultipleError","getMatSelectNonFunctionValueError","_initializeSelection","_id","SelectionModel","panelOpen","offsetX","_triggerRect","_initKeyManager","added","select","removed","deselect","_resetOptions","updateErrorState","getComputedStyle","fontSize","_calculateOverlayPosition","_highlightCorrectOption","_isRtl","_setSelectionByValue","empty","selectedOptions","viewValue","reverse","join","_handleOpenKeydown","_handleClosedKeydown","isArrowKey","isOpenKey","manager","altKey","previouslySelectedOption","selectedOption","activeItem","A","ctrlKey","hasDeselectedOptions_1","opt","previouslyFocusedIndex","activeItemIndex","shiftKey","_selectViaInteraction","_onAttached","positionChange","_setPseudoCheckboxPaddingSize","_calculateOverlayOffsetX","panel","scrollTop","_getPanelTheme","pseudoCheckbox","querySelector","isEmpty","getMatSelectNonArrayValueError","currentValue","_selectValue","_sortValues","correspondingOption","find","error","console","warn","ActiveDescendantKeyManager","withTypeAhead","withVerticalOrientation","withAllowedModifierKeys","tabOut","_scrollActiveOptionIntoView","changedOrDestroyed","_onSelect","isUserInput","_setOptionIds","wasSelected","isSelected","_propagateChanges","options_1","fallbackValue","valueToEmit","activeOptionIndex","labelCount","_countGroupLabelsBeforeOption","_getOptionScrollPosition","_getItemHeight","_getOptionIndex","result","current","itemHeight","_getItemCount","panelHeight","scrollContainerHeight","maxScroll","selectedOptionOffset","scrollBuffer","_calculateOverlayScroll","_calculateOverlayOffsetY","_checkOverlayWithinViewport","optionOffsetFromScrollTop","halfOptionHeight","optimalScrollPosition","_getAriaLabel","_getAriaLabelledby","_hasFloatingLabel","_labelId","_getAriaActiveDescendant","overlayRect","viewportSize","getViewportSize","paddingWidth","first","group","leftOverflow","rightOverflow","optionOffsetFromPanelTop","optionHeightAdjustment","maxOptionsDisplayed","firstDisplayedIndex","selectedDisplayIndex","partialItemHeight","topSpaceAvailable","bottomSpaceAvailable","panelHeightTop","abs","totalPanelHeight","panelHeightBottom","_adjustPanelUp","_adjustPanelDown","_getOriginBasedOnOption","distanceBelowViewport","distanceAboveViewport","setDescribedByIds","ids","_ariaDescribedby","onContainerClick","[attr.id]","[attr.aria-label]","[attr.aria-labelledby]","[attr.aria-required]","MatListOption","_handleBlur","selectionList","_hasFocus","_setSelected","tabindex","[class.mat-list-item-disabled]","[class.mat-list-item-with-avatar]","[attr.aria-selected]","MatSelectionList","_lines","MatLine","_text","checkboxPosition","_markOptionsForCheck","skipPredicate","_setOptionsFromValues","_i","item","disableRippleChanges","colorChanges","firstChange","_isDestroyed","optionIndex","previousFocusIndex","hasModifier","_toggleFocusedOption","_getSelectedOptionValues","values","focusedIndex","focusedOption","hasChanged","_reportValueChange","aria-multiselectable","MAT_SELECTION_LIST_VALUE_ACCESSOR","_MatSelectionListMixinBase","MatListModule","MatLineModule","MatPseudoCheckboxModule","MatList","MatNavList","MatListItem","MatListAvatarCssMatStyler","MatListIconCssMatStyler","MatListSubheaderCssMatStyler","MatDividerModule","_template","_componentFactoryResolver","_appRef","context","_outlet","DomPortalOutlet","insertBefore","outletElement","isAttached","ApplicationRef","MatMenuItemBase","_MatMenuItemMixinBase","addItem","removeItem","_checkDisabled","_handleMouseEnter","getLabel","textNodeType","TEXT_NODE","output","length_1","[class.mat-menu-item-highlighted]","[class.mat-menu-item-submenu-trigger]","[attr.disabled]","MAT_MENU_DEFAULT_OPTIONS_FACTORY","_MatMenuBase","_xPosition","_yPosition","_directDescendantItems","QueryList","_tabSubscription","_classList","_panelAnimationState","_overlapTrigger","_hasBackdrop","throwMatMenuInvalidPositionX","throwMatMenuInvalidPositionY","classes","previousPanelClass","_previousPanelClass","className","_updateDirectDescendants","_item","setFocusOrigin","resetActiveItem","newElevation","customElevation","c","startsWith","_previousElevation","_onAnimationDone","_onAnimationStart","_allItems","reset","notifyOnChanges","defaultOptions","_isInteractiveList","navList","list","_getListType","_list","setLines","[class.mat-list-item-avatar]","_avatar","_icon","MatSelectionListBase","MatListOptionBase","_MatListOptionMixinBase","MatSelectionListChange","hadFocus","newActiveItem","_removeOptionFromList","_handleFocus","_setFocusedOption","expandedHeight","collapsedHeight","MatExpansionPanelHeader","_animationsDisabled","_toggle","_isExpanded","expanded","_getExpandedState","_getPanelId","_getTogglePosition","togglePosition","_showToggle","hideToggle","_keydown","accordion","_handleHeaderKeydown","_parentChangeSubscription","matExpansionAnimations","indicatorRotate","expansionHeaderHeight","[attr.aria-controls]","[class.mat-expanded]","[class.mat-expansion-toggle-indicator-after]","[class.mat-expansion-toggle-indicator-before]","[@.disabled]","(@expansionHeight.start)","[@expansionHeight]","MAT_EXPANSION_PANEL_DEFAULT_OPTIONS","MatExpansionPanelDescription","MatExpansionPanelTitle","MatAccordion","_hideToggle","displayMode","_headers","_handleHeaderFocus","header","MAT_ACCORDION","CdkAccordion","MatExpansionModule","CdkAccordionModule","MatExpansionPanel","MatExpansionPanelActionRow","MatExpansionPanelContent","MAT_GRID_LIST","MatGridTile","_gridList","_rowspan","_colspan","_setStyle","property","MatGridTileText","MatGridAvatarCssMatStyler","MatGridTileHeaderCssMatStyler","MatGridTileFooterCssMatStyler","TileCoordinator","columnIndex","rowIndex","lastRowMax","tracker","rowCount","update","numColumns","tiles","fill","tile","_trackTile","gapStartIndex","_findMatchingGap","colspan","_markTilePosition","TilePosition","tileCols","gapEndIndex","_nextRow","_findGapEndIndex","rowspan","row","col","cssCalcAllowedValue","TileStyler","_rows","init","gutterSize","cols","_gutterSize","normalizeUnits","_cols","getBaseTileSize","sizePercent","gutterFraction","getTilePosition","baseSize","calc","getTileSize","span","setStyle","colIndex","percentWidthPerTile","gutterWidthFractionPerTile","setColStyles","setRowStyles","percentWidth","gutterWidth","baseTileWidth","side","getGutterSpan","getTileSpan","tileHeight","getComputedHeight","FixedTileStyler","fixedRowHeight","_setListStyle","_tiles","RatioTileStyler","_parseRatio","percentHeightPerTile","rowHeightRatio","baseTileHeight","ratioParts","FitTileStyler","gutterHeightPerTile","MatGridList","_gutter","_rowHeight","_setTileStyler","_checkCols","_checkRowHeight","_layoutTiles","rowHeight","_tileStyler","_tileCoordinator","MatGridListModule","SvgIconConfig","svgElement","url","MatIconRegistry","_httpClient","_sanitizer","_svgIconConfigs","_iconSetConfigs","_cachedIconsByUrl","_inProgressUrlFetches","_fontCssClassesByAlias","_defaultFontSetClass","addSvgIcon","iconName","addSvgIconInNamespace","addSvgIconLiteral","literal","addSvgIconLiteralInNamespace","namespace","_addSvgIconConfig","sanitizedLiteral","sanitize","SecurityContext","HTML","getMatIconFailedToSanitizeLiteralError","_createSvgElementForSingleIcon","addSvgIconSet","addSvgIconSetInNamespace","addSvgIconSetLiteral","addSvgIconSetLiteralInNamespace","_addSvgIconSetConfig","_svgElementFromString","registerFontClassAlias","alias","classNameForFontAlias","setDefaultFontSetClass","getDefaultFontSetClass","getSvgIconFromUrl","safeUrl","RESOURCE_URL","getMatIconFailedToSanitizeUrlError","cachedIcon","cloneSvg","_loadSvgIconFromConfig","tap","svg","getNamedSvgIcon","iconKey","_getSvgFromConfig","iconSetConfigs","_getSvgFromIconSetConfigs","observableThrow","getMatIconNameNotFoundError","namedIcon","_extractIconWithNameFromAnySet","iconSetFetchRequests","iconSetConfig","_loadSvgIconSetFromConfig","catchError","err","forkJoin","foundIcon","_extractSvgIconFromSet","_fetchUrl","svgText","responseText","_setSvgAttributes","iconSet","iconSource","iconElement","cloneNode","removeAttribute","_toSvgElement","str","div","innerHTML","ELEMENT_NODE","getMatIconNoHttpProviderError","inProgressFetch","req","responseType","finalize","share","configNamespace","HttpClient","DomSanitizer","ICON_REGISTRY_PROVIDER","ICON_REGISTRY_PROVIDER_FACTORY","MatIconBase","_MatIconMixinBase","MAT_ICON_LOCATION","MAT_ICON_LOCATION_FACTORY","funcIriAttributes","attr","funcIriAttributeSelector","funcIriPattern","MatIcon","_iconRegistry","ariaHidden","_location","_inline","inline","_fontSet","_cleanupFontValue","_fontIcon","_splitIconName","parts","svgIconChanges","svgIcon","_setSvgElement","log","previousValue","_clearSvgElement","_usingFontIcon","_updateFontIconClasses","ngAfterViewChecked","cachedElements","_elementsWithExternalReferences","newPath","_previousPath","_prependPathToReferences","styleTags","querySelectorAll","_cacheChildrenWithExternalReferences","layoutElement","childCount","removeChild","elem","fontSetClass","fontSet","_previousFontSetClass","fontIcon","_previousFontIconClass","elements","attrs","elementsWithFuncIri","elementWithReference","getAttribute","match","attributes","[class.mat-icon-inline]","[class.mat-icon-no-color]","MatListBase","_MatListMixinBase","MatListItemBase","_MatListItemMixinBase","MatCalendar","MatDatepickerIntl","headerComponent","startAt","minDate","maxDate","dateFilter","dateClass","selectedChange","yearSelected","monthSelected","_userSelection","monthView","MatMonthView","yearView","MatYearView","multiYearView","MatMultiYearView","matDatepickerAnimations","fadeInCalendar","datepickerUid","MAT_DATEPICKER_SCROLL_STRATEGY","MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER","MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY","MatDatepickerContentBase","_MatDatepickerContentMixinBase","MatDatepickerContent","_calendar","focusActiveCell","[@transformPanel]","[class.mat-datepicker-content-touch]","_dialog","_dateAdapter","createMissingDateImplError","MatDatepicker","_startAt","_datepickerInput","_getThemePalette","_disabledChange","_inputSubscription","_popupRef","_popupComponentRef","sameDate","_selectedChanged","date","_valueChange","_focusedElementBeforeOpen","touchUi","_openAsDialog","_openAsPopup","openedStream","_dialogRef","_calendarPortal","completeClose","closedStream","afterClosed","_setColor","_createPopup","datepicker","getConnectedOverlayOrigin","componentInstance","MatDialog","DateAdapter","calendarHeaderComponent","MAT_DATEPICKER_VALUE_ACCESSOR","MatDatepickerInput","MAT_DATEPICKER_VALIDATORS","NG_VALIDATORS","MatDatepickerInputEvent","targetElement","_dateFormats","_formField","dateChange","dateInput","_cvaOnChange","_validatorOnChange","_datepickerSubscription","_localeSubscription","_parseValidator","_lastValueValid","matDatepickerParse","text","_minValidator","controlValue","_getValidDateOrNull","deserialize","compareDate","matDatepickerMin","actual","_maxValidator","matDatepickerMax","_filterValidator","_dateFilter","matDatepickerFilter","_validator","Validators","compose","localeChanges","_datepicker","_registerInput","isValid","oldDate","_formatValue","registerOnValidatorChange","validate","getPopupConnectionElementRef","isAltDownArrow","readOnly","_onInput","parse","format","display","isDateInstance","MAT_INPUT_VALUE_ACCESSOR","[attr.min]","[attr.max]","[disabled]","(input)","(change)","MAT_DATE_FORMATS","matDatepicker","MatDatepickerToggleIcon","MatDatepickerToggle","defaultTabIndex","parsedTabIndex","_watchStateChanges","datepickerDisabled","inputDisabled","datepickerToggled","_customIcon","_button","MatDatepickerModule","MatDialogModule","MatCalendarBody","MatCalendarHeader","MatDivider","_inset","[class.mat-divider-vertical]","[class.mat-divider-horizontal]","[class.mat-divider-inset]","params","bodyExpansion","uniqueId","_uniqueSelectionDispatcher","afterExpand","afterCollapse","_inputChanges","_headerId","_bodyAnimationDone","_togglePosition","_hasSpacing","_lazyContent","_containsFocus","_body","focusedElement","bodyElement","useValue","[class.mat-expansion-panel-spacing]","accordionHideToggleChange","MatInput","AutofillMonitor","readonly","_MatInputMixinBase","MatInputModule","MatTextareaAutosize","TextFieldModule","calendarLabel","openCalendarLabel","prevMonthLabel","nextMonthLabel","prevYearLabel","nextYearLabel","prevMultiYearLabel","nextMultiYearLabel","switchToMonthViewLabel","switchToMultiYearViewLabel","MatCalendarCell","displayValue","cssClasses","numCols","activeCell","cellAspectRatio","selectedValueChange","_cellClicked","cell","columnChanges","rows","_firstRowOffset","_cellPadding","_cellWidth","_isActiveCell","cellNumber","_focusActiveCell","aria-readonly","todayValue","selectedValue","labelMinRequiredCells","activeDateChange","firstDayOfWeek","getFirstDayOfWeek","narrowWeekdays","getDayOfWeekNames","longWeekdays","weekdays","long","narrow","_weekdays","concat","_activeDate","today","oldActiveDate","validDate","clampDate","_hasSameMonthAndYear","_init","_selectedDate","_getDateInCurrentMonth","_minDate","_maxDate","_dateSelected","selectedYear","getYear","activeDate","selectedMonth","getMonth","selectedDate","createDate","_handleCalendarBodyKeydown","addCalendarDays","getDate","getNumDaysInMonth","addCalendarYears","addCalendarMonths","_todayDate","_monthLabel","getMonthNames","toLocaleUpperCase","firstOfMonth","_firstWeekOffset","getDayOfWeek","_createWeekCells","_matCalendarBody","daysInMonth","dateNames","getDateNames","_weeks","_shouldEnableDate","dateA11yLabel","cellClasses","d1","d2","yearsPerPage","isSameMultiYearView","_selectedYear","_todayYear","activeYear","minYearOfPage","getActiveOffset","_years","year","_createCellForYear","_yearSelected","month","_getActiveCell","yearName","getYearName","_shouldEnableYear","firstOfYear","_selectedMonth","_getMonthInCurrentYear","_monthSelected","normalizedDate","_todayMonth","_yearLabel","monthNames","_months","_createCellForMonth","monthName","monthYearA11yLabel","_shouldEnableMonth","_isYearAndMonthAfterMaxDate","_isYearAndMonthBeforeMinDate","maxYear","maxMonth","minYear","minMonth","calendar","currentView","monthYearLabel","multi-year","currentPeriodClicked","previousClicked","nextClicked","previousEnabled","_isSameView","nextEnabled","date1","date2","_moveFocusOnNextTick","_currentView","startView","view","_getCurrentViewComponent","correspondingChip","MatChipList","chips","chip","selectViaInteraction","_clearSelection","skip","MatChipListChange","_blur","_hasFocusedChip","_chipInput","focused","_markAsTouched","_allowFocusEscape","_tabIndex","_userTabIndex","_resetChips","_dropSubscriptions","_listenToChipsFocus","_listenToChipsSelection","_listenToChipsRemoved","_chipFocusSubscription","_chipBlurSubscription","_chipSelectionSubscription","_chipRemoveSubscription","chipSelectionChanges","chipFocusChanges","chipIndex","chipBlurChanges","chipRemoveChanges","_lastDestroyedChipIndex","_originatesFromChip","currentElement","parentElement","_syncChipsState","_chipListMultiple","[class.mat-chip-list-disabled]","[class.mat-chip-list-invalid]","[class.mat-chip-list-required]","ariaOrientation","selectable","MatChip","MatChipInput","_addOnBlur","separatorKeyCodes","chipEnd","_chipList","registerInput","TAB","_emitChipEnd","addOnBlur","_focus","_isSeparatorKey","separators","[attr.placeholder]","MAT_CHIPS_DEFAULT_OPTIONS","chipList","CHIP_DECLARATIONS","MatChipRemove","MatChipAvatar","MatChipTrailingIcon","ɵ0","MatChipsModule","MatDialogConfig","maxWidth","ariaDescribedBy","ariaLabelledBy","closeOnNavigation","animationBody","matDialogAnimations","dialogContainer","slideDialog","MatDialogContainer","_elementFocusedBeforeDialogWasOpened","_state","_animationStateChanged","_ariaLabelledBy","throwMatDialogContentAlreadyAttachedError","_savePreviouslyFocusedElement","toFocus","_startExitAnimation","aria-modal","[@dialogContainer]","(@dialogContainer.start)","(@dialogContainer.done)","MatDialogRef","_containerInstance","_afterClosed","_beforeClosed","phaseName","_closeFallbackTimeout","_result","dialogResult","detachBackdrop","totalTime","beforeClosed","_getPositionStrategy","centerVertically","updateSize","addPanelClass","removePanelClass","afterOpen","beforeClose","MAT_DIALOG_DATA","MAT_DIALOG_DEFAULT_OPTIONS","MAT_DIALOG_SCROLL_STRATEGY","MAT_DIALOG_SCROLL_STRATEGY_PROVIDER","MAT_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY","_parentDialog","_overlayContainer","_openDialogsAtThisLevel","_afterAllClosedAtThisLevel","_afterOpenedAtThisLevel","_ariaHiddenElements","afterAllClosed","openDialogs","_afterAllClosed","componentOrTemplateRef","_applyConfigDefaults","getDialogById","_attachDialogContainer","dialogRef","_attachDialogContent","_hideNonDialogContentFromAssistiveTechnology","_removeOpenDialog","closeAll","_closeDialogs","dialog","dialogConfig","maxHeight","disposeOnNavigation","injectionTokens","overlayContainer","getContainerElement","siblings","sibling","hasAttribute","dialogs","Location","OverlayContainer","dialogElementUid","MatDialogClose","getClosestDialog","proxiedChange","_matDialogClose","MatDialogTitle","MatDialogContent","MatDialogActions","minRows","maxRows","matAutosizeMinRows","matAutosizeMaxRows","matAutosize","matTextareaAutosize","CdkTextareaAutosize","MAT_INPUT_INVALID_TYPES","MatInputBase","inputValueAccessor","_autofillMonitor","_isServer","_isNativeSelect","autofilled","_type","_readonly","_neverEmptyInputTypes","t","getSupportedInputTypes","_inputValueAccessor","_previousNativeValue","el","selectionStart","selectionEnd","setSelectionRange","_validateType","_isTextarea","isAutofilled","_dirtyCheckNativeValue","isFocused","getMatInputUnsupportedTypeError","_isNeverEmpty","_isBadInput","validity","badInput","selectElement","firstOption","[class.mat-input-server]","[required]","[attr.readonly]","MatCard","MatCardHeader","MatCardTitleGroup","MatCardModule","MatCardContent","MatCardTitle","MatCardSubtitle","MatCardActions","MatCardFooter","MatCardSmImage","MatCardMdImage","MatCardLgImage","MatCardImage","MatCardXlImage","MatCardAvatar","MAT_CHECKBOX_CLICK_ACTION","MAT_CHECKBOX_CONTROL_VALUE_ACCESSOR","MatCheckbox","Init","Checked","Unchecked","Indeterminate","MatCheckboxChange","MatCheckboxBase","_MatCheckboxMixinBase","_clickAction","indeterminateChange","_currentAnimationClass","_currentCheckState","TransitionCheckState","_indeterminate","changed","_transitionCheckState","_getAriaChecked","indeterminate","newState","oldState","_getAnimationClassForCheckStateTransition","animationClass_1","_onInteractionEvent","animSuffix","[class.mat-checkbox-indeterminate]","[class.mat-checkbox-checked]","[class.mat-checkbox-disabled]","[class.mat-checkbox-label-before]","ripple","MatRipple","MAT_CHECKBOX_REQUIRED_VALIDATOR","MatCheckboxRequiredValidator","[attr.required]","CheckboxRequiredValidator","_MatCheckboxRequiredValidatorModule","MatCheckboxModule","MatChipSelectionChange","MatChipBase","_MatChipMixinBase","chipListSelectable","_selectable","_removable","destroyed","_addHostClassName","_chipRipple","RippleRenderer","coercedValue","_dispatchSelectionChange","tagName","_removeTriggerEvents","toggleSelected","removable","DELETE","BACKSPACE","[class.mat-chip-selected]","[class.mat-chip-with-avatar]","[class.mat-chip-with-trailing-icon]","[class.mat-chip-disabled]","avatar","trailingIcon","removeIcon","_parentChip","parentChip","MatChipListBase","_MatChipListMixinBase","_updateTabIndex","_updateFocusForDestroyedChips","inputElement","_focusInput","_isInputEmpty","newChipIndex","MatButton","_hasHostAttributes","attribute","MatAnchor","focusMonitor","stopImmediatePropagation","MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS","MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR","MatButtonToggleGroup","MatButtonToggleGroupMultiple","_uniqueIdCounter","MatButtonToggleChange","appearance","_buttonToggles","_syncButtonToggle","deferEvents","_updateModelValue","_isSelected","_isPrechecked","_rawValue","[class.mat-button-toggle-vertical]","[class.mat-button-toggle-group-appearance-standard]","MatButtonToggle","MatButtonToggleBase","_MatButtonToggleMixinBase","toggleGroup","_isSingleSelector","buttonToggleGroup","_appearance","_buttonElement","_onButtonClick","newChecked","[class.mat-button-toggle-standalone]","[class.mat-button-toggle-checked]","[class.mat-button-toggle-disabled]","[class.mat-button-toggle-appearance-standard]","[attr.name]","MatButtonToggleModule","align","[class.mat-card-actions-align-end]","[class.mat-form-field-hide-placeholder]","[class.mat-form-field-disabled]","[class.mat-form-field-autofilled]","[class.mat-focused]","[class.ng-untouched]","[class.ng-touched]","[class.ng-pristine]","[class.ng-dirty]","[class.ng-valid]","[class.ng-invalid]","[class.ng-pending]","MAT_LABEL_GLOBAL_OPTIONS","MAT_FORM_FIELD_DEFAULT_OPTIONS","hideRequiredMarker","hintLabel","floatLabel","underlineRef","_connectionContainerRef","_inputContainerRef","_controlStatic","_labelChildNonStatic","MatLabel","_labelChildStatic","_placeholderChild","MatPlaceholder","_errorChildren","MatError","_hintChildren","MatHint","_prefixChildren","MatPrefix","_suffixChildren","MatSuffix","_MatFormFieldMixinBase","_uniqueAutocompleteIdCounter","MatAutocompleteSelectedEvent","MatAutocompleteBase","_MatAutocompleteMixinBase","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY","MatAutocomplete","showPanel","_isOpen","optionSelected","_autoActiveFirstOption","autoActiveFirstOption","_setVisibilityClasses","_setVisibility","_setScrollTop","_getScrollTop","_emitSelectEvent","panelWidth","MatAutocompleteOrigin","MAT_AUTOCOMPLETE_SCROLL_STRATEGY","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","MatAutocompleteTrigger","_zone","_componentDestroyed","_autocompleteDisabled","_manuallyFloatingLabel","_viewportSubscription","_canOpenOnNextFocus","_closeKeyEventStream","_windowBlurHandler","autocompleteAttribute","_overlayAttached","optionSelections","autocomplete","_positionStrategy","_setStrategyPositions","_destroyPanel","openPanel","_attachOverlay","_floatLabel","closePanel","_resetLabel","_getOutsideClickStream","MatOptionSelectionChange","clickTarget","formField","_setTriggerValue","activeOption","_resetActiveItem","prevActiveItem","_canOpen","_scrollToOption","_handleInput","_previousValue","shouldAnimate","_animateAndLockLabel","newScrollPosition","_subscribeToClosingActions","firstStable","optionChanges","reapplyLastPosition","wasOpen","panelClosingActions","_setValueAndClose","toDisplay","inputValue","_control","_clearPreviousSelectedOption","getMatAutocompleteMissingPanelError","setOrigin","_getConnectedElement","_getPanelWidth","withPush","belowPosition","abovePosition","connectedTo","_getHostWidth","[attr.autocomplete]","[attr.aria-autocomplete]","[attr.aria-haspopup]","(focusin)","Host","autocompleteDisabled","MatAutocompleteModule","MatBadgeBase","_MatBadgeMixinBase","MatBadge","_renderer","_hasContent","_overlap","val","_description","newDescription","badgeElement","_badgeElement","_updateHostAriaDescription","_hidden","isAbove","isAfter","contentChange","_updateTextContent","description","destroyNode","getBadgeElement","_createBadgeElement","_clearExistingBadges","oldDescription","colorPalette","currentChild","[class.mat-badge-overlap]","[class.mat-badge-above]","[class.mat-badge-below]","[class.mat-badge-before]","[class.mat-badge-after]","[class.mat-badge-small]","[class.mat-badge-medium]","[class.mat-badge-large]","[class.mat-badge-hidden]","[class.mat-badge-disabled]","Renderer2","overlap","hidden","MatBadgeModule","MAT_BOTTOM_SHEET_DATA","MatBottomSheetConfig","matBottomSheetAnimations","bottomSheetState","COMPLEX","ACCELERATION_CURVE","EXITING","DECELERATION_CURVE","MatBottomSheetContainer","breakpointObserver","bottomSheetConfig","_elementFocusedBeforeOpened","_breakpointSubscription","Medium","Large","XLarge","_toggleClass","isMatched","_validatePortalAttached","_setPanelClass","(@state.start)","FocusTrapFactory","MatBottomSheetModule","MatBottomSheetRef","MAT_BOTTOM_SHEET_DEFAULT_OPTIONS","MatBottomSheet","_parentBottomSheet","_bottomSheetRefAtThisLevel","_openedBottomSheetRef","_attachContainer","ref","bottomSheetRef","scrollStrategies","block","DEFAULT_ROUND_BUTTON_COLOR","BUTTON_HOST_ATTRIBUTES","MatButtonBase","_MatButtonMixinBase","isRoundButton","isIconButton","BUTTON_HOST_ATTRIBUTES_1","_parent","_active","_mostRecentViewValue","_emitSelectionChangeEvent","setActiveStyles","setInactiveStyles","_getAriaSelected","[class.mat-selected]","[class.mat-option-multiple]","[class.mat-active]","[class.mat-option-disabled]","matFormFieldAnimations","transitionMessages","[class.mat-right]","MatFormFieldBase","labelOptions","_defaults","_outlineGapCalculationNeededImmediately","_outlineGapCalculationNeededOnStable","_showAlwaysAnimate","_subscriptAnimationState","_hintLabel","_hintLabelId","_labelOptions","float","_animationsEnabled","_hideRequiredMarker","_processHints","_explicitFormFieldControl","_controlNonStatic","_validateControlChild","_validatePlaceholders","_syncDescribedByIds","valueChanges","updateOutlineGap","_shouldForward","prop","_hasPlaceholder","_hasLabel","_labelChild","_shouldLabelFloat","_canLabelFloat","shouldLabelFloat","_shouldAlwaysFloat","_hideControlPlaceholder","_getDisplayedMessages","errorState","_label","getMatFormFieldPlaceholderConflictError","_validateHints","startHint_1","endHint_1","hint","getMatFormFieldDuplicatedHintError","startHint","endHint","getMatFormFieldMissingControlError","labelEl","startWidth","gapWidth","startEls","gapEls","containerRect","containerStart","_getStartEnd","labelStart","labelWidth","outlineGapPadding","rect","[class.mat-form-field-appearance-standard]","[class.mat-form-field-appearance-fill]","[class.mat-form-field-appearance-outline]","[class.mat-form-field-appearance-legacy]","[class.mat-form-field-invalid]","[class.mat-form-field-can-float]","[class.mat-form-field-should-float]","[class.mat-form-field-has-label]","__extends","d","__","constructor","extendStatics","MATERIAL_SANITY_CHECKS_FACTORY","base","class_1","defaultColor","matcher","_pendingSubscribers","Observable","subscriber","_notifySubscriber","MAT_DATE_LOCALE_FACTORY","inject","LOCALE_ID","range","valueFunction","valuesArray","lines","setClass","isAdd","enforceStyleRecalculation","getPropertyValue","distanceToFurthestCorner","distX","distY","sqrt","optionsArray","groups","groupCounter","optionOffset","optionHeight","currentScrollPosition","reposition","MAT_DIALOG_SCROLL_STRATEGY_FACTORY","provider","year1","dateAdapter","year2","startingYear","getStartingYear","exp","parentRegistry","httpClient","sanitizer","pathname","search","scrollThrottle","parentIntl","createShadowRoot","attachShadow","rootNode","getRootNode","sortOrder","SUPPORTS_INTL_API","setPrototypeOf","__proto__","__assign","assign","s","n","VERSION","Version","SHARP_CURVE","MATERIAL_SANITY_CHECKS","_sanityChecksEnabled","_hammerLoader","_hasDoneGlobalChecks","_hasCheckedHammer","_window","_areChecksEnabled","_checkDoctypeIsDefined","_checkThemeIsPresent","_checkCdkVersionMatch","_isTestEnv","__karma__","jasmine","doctype","body","testElement","computedStyle","full","CDK_VERSION","_checkHammerIsAvailable","BidiModule","Boolean","MAT_DATE_LOCALE","MAT_DATE_LOCALE_PROVIDER","_localeChanges","setLocale","locale","second","firstValid","secondValid","Intl","DEFAULT_MONTH_NAMES","short","DEFAULT_DATE_NAMES","DEFAULT_DAY_OF_WEEK_NAMES","ISO_8601_REGEX","NativeDateAdapter","matDateLocale","useUtcForDisplay","_clampDate","getFullYear","getDay","dtf_1","DateTimeFormat","timeZone","_stripDirectionalityCharacters","_format","Date","dtf_2","day","dtf_3","weekday","dtf","_createDateWithOverflow","clone","getTime","displayFormat","setFullYear","toDateString","years","months","newDate","days","toIso8601","getUTCFullYear","_2digit","getUTCMonth","getUTCDate","isNaN","NaN","UTC","getHours","getMinutes","getSeconds","getMilliseconds","MAT_NATIVE_DATE_FORMATS","NativeDateModule","MatNativeDateModule","ShowOnDirtyErrorStateMatcher","dirty","submitted","touched","MAT_HAMMER_OPTIONS","ANGULAR_MATERIAL_SUPPORTED_HAMMER_GESTURES","ɵ1","noopHammerInstance","on","off","_hammerOptions","commonModule","events","buildHammer","hammer","mc","pan","Pan","swipe","Swipe","press","Press","slide","_createRecognizer","threshold","longpress","time","recognizeWith","inheritances","recognizer","HammerGestureConfig","MatLineSetter","FADING_IN","VISIBLE","FADING_OUT","HIDDEN","RippleRef","RippleState","fadeOut","fadeOutRipple","defaultRippleAnimationConfig","ignoreMouseEventsTimeout","passiveEventOptions","_target","_isPointerDown","_triggerEvents","_activeRipples","isFakeMousedown","isSyntheticEvent","_lastTouchStartEvent","now","rippleDisabled","fadeInRipple","_onTouchStart","touches","changedTouches","_onPointerUp","terminateOnPointerUp","persistent","_containerElement","_containerRect","animationConfig","centered","radius","transitionDuration","rippleRef","_mostRecentTransientRipple","_runTimeoutOutsideZone","isMostRecentTransientRipple","wasActive","rippleEl","fadeOutAll","_triggerElement","globalOptions","_globalOptions","_rippleRenderer","_setupTriggerEventsIfEnabled","_trigger","launch","configOrX","[class.mat-ripple-unbounded]","unbounded","MatPseudoCheckbox","[class.mat-pseudo-checkbox-indeterminate]","[class.mat-pseudo-checkbox-checked]","[class.mat-pseudo-checkbox-disabled]","MatOptgroupBase","_MatOptgroupMixinBase","_uniqueOptgroupIdCounter","[class.mat-optgroup-disabled]"],"mappings":"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"}