{"version":3,"sources":["src/cdk/cdk-a11y.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","cdk","a11y","common","core","rxjs","keycodes","operators","coercion","platform","observers","this","i2","i0","i1","getAriaReferenceIds","el","attr","getAttribute","match","nextId","messageRegistry","Map","messagesContainer","AriaDescriber","_document","prototype","describe","hostElement","message","role","_canBeDescribed","key","getKey","setMessageId","set","messageElement","referenceCount","has","_createMessageElement","_isElementDescribedByMessage","_addMessageReference","removeDescription","_isElementNode","_removeMessageReference","registeredMessage","get","_deleteMessageElement","childNodes","length","_deleteMessagesContainer","ngOnDestroy","describedElements","querySelectorAll","i","_removeCdkDescribedByReferenceIds","removeAttribute","clear","createElement","textContent","setAttribute","_createMessagesContainer","appendChild","removeChild","delete","preExistingContainer","getElementById","parentNode","id","style","visibility","classList","add","body","element","originalReferenceIds","filter","indexOf","join","addAriaReferencedId","ids","some","existingId","trim","push","removeAriaReferencedId","filteredIds","val","referenceIds","messageId","trimmedMessage","ariaLabel","nodeType","ELEMENT_NODE","CDK_DESCRIBEDBY_ID_PREFIX","ɵprov","ɵɵdefineInjectable","AriaDescriber_Factory","ɵɵinject","DOCUMENT","token","providedIn","decorators","type","Injectable","args","ctorParameters","undefined","Inject","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__read","o","n","m","Symbol","iterator","r","e","ar","next","done","value","error","__spread","arguments","concat","ListKeyManager","_items","_this","_activeItemIndex","_activeItem","_wrap","_letterKeyStream","Subject","_typeaheadSubscription","Subscription","EMPTY","_vertical","_allowedModifierKeys","_homeAndEnd","_skipPredicateFn","item","disabled","_pressedLetters","tabOut","change","QueryList","changes","subscribe","newItems","newIndex","toArray","skipPredicate","predicate","withWrap","shouldWrap","withVerticalOrientation","enabled","withHorizontalOrientation","direction","_horizontal","withAllowedModifierKeys","keys","withTypeAhead","debounceInterval","unsubscribe","pipe","tap","letter","debounceTime","map","inputString","items","_getItemsArray","index","getLabel","toUpperCase","setActiveItem","withHomeAndEnd","previousActiveItem","updateActiveItem","onKeydown","event","keyCode","isModifierAllowed","every","modifier","TAB","DOWN_ARROW","setNextItemActive","UP_ARROW","setPreviousItemActive","RIGHT_ARROW","LEFT_ARROW","HOME","setFirstItemActive","END","setLastItemActive","hasModifierKey","toLocaleUpperCase","A","Z","ZERO","NINE","fromCharCode","preventDefault","defineProperty","enumerable","configurable","isTyping","_setActiveItemByIndex","_setActiveItemByDelta","itemArray","activeItem","delta","_setActiveInWrapMode","_setActiveInDefaultMode","fallbackDelta","ActiveDescendantKeyManager","_super","apply","setInactiveStyles","setActiveStyles","FocusKeyManager","_origin","setFocusOrigin","origin","focus","IsFocusableConfig","ignoreVisibility","InteractivityChecker","_platform","isDisabled","hasAttribute","isVisible","hasGeometry","offsetWidth","offsetHeight","getClientRects","getComputedStyle","isTabbable","isBrowser","frameElement","getFrameElement","window","_a","getWindow","node","ownerDocument","defaultView","getTabIndexValue","nodeName","toLowerCase","tabIndexValue","WEBKIT","IOS","isPotentiallyTabbableIOS","inputType","FIREFOX","tabIndex","isFocusable","config","isPotentiallyFocusable","isHiddenInput","isInputElement","isNativeFormElement","isAnchorWithHref","isAnchorElement","hasValidTabIndex","isNaN","parseInt","InteractivityChecker_Factory","Platform","FocusTrap","_element","_checker","_ngZone","deferAnchors","_hasAttached","startAnchorListener","focusLastTabbableElement","endAnchorListener","focusFirstTabbableElement","_enabled","attachAnchors","_startAnchor","_endAnchor","_toggleAnchorTabIndex","destroy","startAnchor","endAnchor","removeEventListener","runOutsideAngular","_createAnchor","addEventListener","insertBefore","nextSibling","focusInitialElementWhenReady","Promise","resolve","_executeOnStable","focusInitialElement","focusFirstTabbableElementWhenReady","focusLastTabbableElementWhenReady","_getRegionBoundary","bound","markers","console","warn","_getFirstTabbableElement","_getLastTabbableElement","redirectToElement","querySelector","focusableChild","hasAttached","root","children","tabbableChild","anchor","isEnabled","toggleAnchors","fn","isStable","onStable","take","FocusTrapFactory","deferCaptureElements","FocusTrapFactory_Factory","NgZone","CdkTrapFocus","_elementRef","_focusTrapFactory","_previouslyFocusedElement","focusTrap","nativeElement","coerceBooleanProperty","_autoCapture","ngAfterContentInit","autoCapture","_captureFocus","ngDoCheck","ngOnChanges","autoCaptureChange","firstChange","_b","activeElement","shadowRoot","Directive","selector","exportAs","ElementRef","propDecorators","Input","ConfigurableFocusTrap","_focusTrapManager","_inertStrategy","defer","register","deregister","_enable","preventFocus","_disable","allowFocus","hasNativeClosest","Element","closest","matches","EventListenerFocusTrapInertStrategy","_listener","_trapFocus","target","focusTrapRoot","contains","Node","curr","polyfillClosest","setTimeout","ConfigurableFocusTrapConfig","FOCUS_TRAP_INERT_STRATEGY","InjectionToken","FocusTrapManager","_focusTrapStack","ft","stack","splice","FocusTrapManager_Factory","ConfigurableFocusTrapFactory","configObject","ConfigurableFocusTrapFactory_Factory","Optional","LIVE_ANNOUNCER_ELEMENT_TOKEN","LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY","LIVE_ANNOUNCER_DEFAULT_OPTIONS","LiveAnnouncer","elementToken","_defaultOptions","_liveElement","_createLiveElement","announce","_i","politeness","duration","defaultOptions","clearTimeout","_previousTimeout","previousElements","getElementsByClassName","liveEl","LiveAnnouncer_Factory","CdkAriaLive","_liveAnnouncer","_contentObserver","_politeness","_subscription","observe","elementText","_previousAnnouncedText","isFakeMousedownFromScreenReader","buttons","isFakeTouchstartFromScreenReader","touch","touches","changedTouches","identifier","radiusX","radiusY","ContentObserver","FOCUS_MONITOR_DEFAULT_OPTIONS","captureEventListenerOptions","normalizePassiveListenerOptions","passive","capture","FocusMonitor","document","options","_windowFocused","_elementInfo","_monitoredElementCount","_rootNodeFocusListenerCount","_documentKeydownListener","_lastTouchTarget","_setOriginForCurrentEventQueue","_documentMousedownListener","source","_documentTouchstartListener","_touchTimeoutId","getTarget","_windowFocusListener","_windowFocusTimeoutId","_rootNodeFocusAndBlurListener","handler","_onFocus","_onBlur","parentElement","_detectionMode","detectionMode","monitor","checkChildren","coerceElement","of","rootNode","_getShadowRoot","_getDocument","cachedInfo","subject","info","_registerGlobalListeners","stopMonitoring","elementInfo","complete","_setClasses","_removeGlobalListeners","focusVia","_getClosestElementsInfo","forEach","_originChanged","_info","_getWindow","_toggleClass","className","shouldSet","remove","_getFocusOrigin","_lastFocusOrigin","_wasCausedByTouch","_originTimeoutId","focusTarget","relatedTarget","_emitOrigin","run","rootNodeFocusListeners","results","currentElement","composedPath","FocusMonitor_Factory","CdkMonitorFocus","_focusMonitor","cdkFocusChange","EventEmitter","ngAfterViewInit","_monitorSubscription","emit","Output","A11yModule","HighContrastModeDetector","getHighContrastMode","testElement","backgroundColor","position","documentWindow","computedStyle","computedColor","replace","_applyBodyHighContrastModeCssClasses","bodyClasses","mode","HighContrastModeDetector_Factory","highContrastModeDetector","NgModule","imports","PlatformModule","ObserversModule","declarations","CDK_DESCRIBEDBY_HOST_ATTRIBUTE","MESSAGES_CONTAINER_ID","TOUCH_BUFFER_MS","ɵangular_material_src_cdk_a11y_a11y_a","ɵangular_material_src_cdk_a11y_a11y_b"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('rxjs'), require('@angular/cdk/keycodes'), require('rxjs/operators'), require('@angular/cdk/coercion'), require('@angular/cdk/platform'), require('@angular/cdk/observers')) :\n    typeof define === 'function' && define.amd ? define('@angular/cdk/a11y', ['exports', '@angular/common', '@angular/core', 'rxjs', '@angular/cdk/keycodes', 'rxjs/operators', '@angular/cdk/coercion', '@angular/cdk/platform', '@angular/cdk/observers'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.a11y = {}), global.ng.common, global.ng.core, global.rxjs, global.ng.cdk.keycodes, global.rxjs.operators, global.ng.cdk.coercion, global.ng.cdk.platform, global.ng.cdk.observers));\n}(this, (function (exports, i2, i0, rxjs, keycodes, operators, coercion, i1, observers) { 'use strict';\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    /** IDs are delimited by an empty space, as per the spec. */\n    var ID_DELIMITER = ' ';\n    /**\n     * Adds the given ID to the specified ARIA attribute on an element.\n     * Used for attributes such as aria-labelledby, aria-owns, etc.\n     */\n    function addAriaReferencedId(el, attr, id) {\n        var ids = getAriaReferenceIds(el, attr);\n        if (ids.some(function (existingId) { return existingId.trim() == id.trim(); })) {\n            return;\n        }\n        ids.push(id.trim());\n        el.setAttribute(attr, ids.join(ID_DELIMITER));\n    }\n    /**\n     * Removes the given ID from the specified ARIA attribute on an element.\n     * Used for attributes such as aria-labelledby, aria-owns, etc.\n     */\n    function removeAriaReferencedId(el, attr, id) {\n        var ids = getAriaReferenceIds(el, attr);\n        var filteredIds = ids.filter(function (val) { return val != id.trim(); });\n        if (filteredIds.length) {\n            el.setAttribute(attr, filteredIds.join(ID_DELIMITER));\n        }\n        else {\n            el.removeAttribute(attr);\n        }\n    }\n    /**\n     * Gets the list of IDs referenced by the given ARIA attribute on an element.\n     * Used for attributes such as aria-labelledby, aria-owns, etc.\n     */\n    function getAriaReferenceIds(el, attr) {\n        // Get string array of all individual ids (whitespace delimited) in the attribute value\n        return (el.getAttribute(attr) || '').match(/\\S+/g) || [];\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    /** ID used for the body container where all messages are appended. */\n    var MESSAGES_CONTAINER_ID = 'cdk-describedby-message-container';\n    /** ID prefix used for each created message element. */\n    var CDK_DESCRIBEDBY_ID_PREFIX = 'cdk-describedby-message';\n    /** Attribute given to each host element that is described by a message element. */\n    var CDK_DESCRIBEDBY_HOST_ATTRIBUTE = 'cdk-describedby-host';\n    /** Global incremental identifier for each registered message element. */\n    var nextId = 0;\n    /** Global map of all registered message elements that have been placed into the document. */\n    var messageRegistry = new Map();\n    /** Container for all registered messages. */\n    var messagesContainer = null;\n    /**\n     * Utility that creates visually hidden elements with a message content. Useful for elements that\n     * want to use aria-describedby to further describe themselves without adding additional visual\n     * content.\n     */\n    var AriaDescriber = /** @class */ (function () {\n        function AriaDescriber(_document) {\n            this._document = _document;\n        }\n        AriaDescriber.prototype.describe = function (hostElement, message, role) {\n            if (!this._canBeDescribed(hostElement, message)) {\n                return;\n            }\n            var key = getKey(message, role);\n            if (typeof message !== 'string') {\n                // We need to ensure that the element has an ID.\n                setMessageId(message);\n                messageRegistry.set(key, { messageElement: message, referenceCount: 0 });\n            }\n            else if (!messageRegistry.has(key)) {\n                this._createMessageElement(message, role);\n            }\n            if (!this._isElementDescribedByMessage(hostElement, key)) {\n                this._addMessageReference(hostElement, key);\n            }\n        };\n        AriaDescriber.prototype.removeDescription = function (hostElement, message, role) {\n            if (!message || !this._isElementNode(hostElement)) {\n                return;\n            }\n            var key = getKey(message, role);\n            if (this._isElementDescribedByMessage(hostElement, key)) {\n                this._removeMessageReference(hostElement, key);\n            }\n            // If the message is a string, it means that it's one that we created for the\n            // consumer so we can remove it safely, otherwise we should leave it in place.\n            if (typeof message === 'string') {\n                var registeredMessage = messageRegistry.get(key);\n                if (registeredMessage && registeredMessage.referenceCount === 0) {\n                    this._deleteMessageElement(key);\n                }\n            }\n            if (messagesContainer && messagesContainer.childNodes.length === 0) {\n                this._deleteMessagesContainer();\n            }\n        };\n        /** Unregisters all created message elements and removes the message container. */\n        AriaDescriber.prototype.ngOnDestroy = function () {\n            var describedElements = this._document.querySelectorAll(\"[\" + CDK_DESCRIBEDBY_HOST_ATTRIBUTE + \"]\");\n            for (var i = 0; i < describedElements.length; i++) {\n                this._removeCdkDescribedByReferenceIds(describedElements[i]);\n                describedElements[i].removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n            }\n            if (messagesContainer) {\n                this._deleteMessagesContainer();\n            }\n            messageRegistry.clear();\n        };\n        /**\n         * Creates a new element in the visually hidden message container element with the message\n         * as its content and adds it to the message registry.\n         */\n        AriaDescriber.prototype._createMessageElement = function (message, role) {\n            var messageElement = this._document.createElement('div');\n            setMessageId(messageElement);\n            messageElement.textContent = message;\n            if (role) {\n                messageElement.setAttribute('role', role);\n            }\n            this._createMessagesContainer();\n            messagesContainer.appendChild(messageElement);\n            messageRegistry.set(getKey(message, role), { messageElement: messageElement, referenceCount: 0 });\n        };\n        /** Deletes the message element from the global messages container. */\n        AriaDescriber.prototype._deleteMessageElement = function (key) {\n            var registeredMessage = messageRegistry.get(key);\n            var messageElement = registeredMessage && registeredMessage.messageElement;\n            if (messagesContainer && messageElement) {\n                messagesContainer.removeChild(messageElement);\n            }\n            messageRegistry.delete(key);\n        };\n        /** Creates the global container for all aria-describedby messages. */\n        AriaDescriber.prototype._createMessagesContainer = function () {\n            if (!messagesContainer) {\n                var preExistingContainer = this._document.getElementById(MESSAGES_CONTAINER_ID);\n                // When going from the server to the client, we may end up in a situation where there's\n                // already a container on the page, but we don't have a reference to it. Clear the\n                // old container so we don't get duplicates. Doing this, instead of emptying the previous\n                // container, should be slightly faster.\n                if (preExistingContainer && preExistingContainer.parentNode) {\n                    preExistingContainer.parentNode.removeChild(preExistingContainer);\n                }\n                messagesContainer = this._document.createElement('div');\n                messagesContainer.id = MESSAGES_CONTAINER_ID;\n                // We add `visibility: hidden` in order to prevent text in this container from\n                // being searchable by the browser's Ctrl + F functionality.\n                // Screen-readers will still read the description for elements with aria-describedby even\n                // when the description element is not visible.\n                messagesContainer.style.visibility = 'hidden';\n                // Even though we use `visibility: hidden`, we still apply `cdk-visually-hidden` so that\n                // the description element doesn't impact page layout.\n                messagesContainer.classList.add('cdk-visually-hidden');\n                this._document.body.appendChild(messagesContainer);\n            }\n        };\n        /** Deletes the global messages container. */\n        AriaDescriber.prototype._deleteMessagesContainer = function () {\n            if (messagesContainer && messagesContainer.parentNode) {\n                messagesContainer.parentNode.removeChild(messagesContainer);\n                messagesContainer = null;\n            }\n        };\n        /** Removes all cdk-describedby messages that are hosted through the element. */\n        AriaDescriber.prototype._removeCdkDescribedByReferenceIds = function (element) {\n            // Remove all aria-describedby reference IDs that are prefixed by CDK_DESCRIBEDBY_ID_PREFIX\n            var originalReferenceIds = getAriaReferenceIds(element, 'aria-describedby')\n                .filter(function (id) { return id.indexOf(CDK_DESCRIBEDBY_ID_PREFIX) != 0; });\n            element.setAttribute('aria-describedby', originalReferenceIds.join(' '));\n        };\n        /**\n         * Adds a message reference to the element using aria-describedby and increments the registered\n         * message's reference count.\n         */\n        AriaDescriber.prototype._addMessageReference = function (element, key) {\n            var registeredMessage = messageRegistry.get(key);\n            // Add the aria-describedby reference and set the\n            // describedby_host attribute to mark the element.\n            addAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n            element.setAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE, '');\n            registeredMessage.referenceCount++;\n        };\n        /**\n         * Removes a message reference from the element using aria-describedby\n         * and decrements the registered message's reference count.\n         */\n        AriaDescriber.prototype._removeMessageReference = function (element, key) {\n            var registeredMessage = messageRegistry.get(key);\n            registeredMessage.referenceCount--;\n            removeAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n            element.removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n        };\n        /** Returns true if the element has been described by the provided message ID. */\n        AriaDescriber.prototype._isElementDescribedByMessage = function (element, key) {\n            var referenceIds = getAriaReferenceIds(element, 'aria-describedby');\n            var registeredMessage = messageRegistry.get(key);\n            var messageId = registeredMessage && registeredMessage.messageElement.id;\n            return !!messageId && referenceIds.indexOf(messageId) != -1;\n        };\n        /** Determines whether a message can be described on a particular element. */\n        AriaDescriber.prototype._canBeDescribed = function (element, message) {\n            if (!this._isElementNode(element)) {\n                return false;\n            }\n            if (message && typeof message === 'object') {\n                // We'd have to make some assumptions about the description element's text, if the consumer\n                // passed in an element. Assume that if an element is passed in, the consumer has verified\n                // that it can be used as a description.\n                return true;\n            }\n            var trimmedMessage = message == null ? '' : (\"\" + message).trim();\n            var ariaLabel = element.getAttribute('aria-label');\n            // We shouldn't set descriptions if they're exactly the same as the `aria-label` of the\n            // element, because screen readers will end up reading out the same text twice in a row.\n            return trimmedMessage ? (!ariaLabel || ariaLabel.trim() !== trimmedMessage) : false;\n        };\n        /** Checks whether a node is an Element node. */\n        AriaDescriber.prototype._isElementNode = function (element) {\n            return element.nodeType === this._document.ELEMENT_NODE;\n        };\n        return AriaDescriber;\n    }());\n    AriaDescriber.ɵprov = i0.ɵɵdefineInjectable({ factory: function AriaDescriber_Factory() { return new AriaDescriber(i0.ɵɵinject(i2.DOCUMENT)); }, token: AriaDescriber, providedIn: \"root\" });\n    AriaDescriber.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    AriaDescriber.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] }\n    ]; };\n    /** Gets a key that can be used to look messages up in the registry. */\n    function getKey(message, role) {\n        return typeof message === 'string' ? (role || '') + \"/\" + message : message;\n    }\n    /** Assigns a unique ID to an element, if it doesn't have one already. */\n    function setMessageId(element) {\n        if (!element.id) {\n            element.id = CDK_DESCRIBEDBY_ID_PREFIX + \"-\" + nextId++;\n        }\n    }\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\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)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\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; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\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);\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); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\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     * This class manages keyboard events for selectable lists. If you pass it a query list\n     * of items, it will set the active item correctly when arrow events occur.\n     */\n    var ListKeyManager = /** @class */ (function () {\n        function ListKeyManager(_items) {\n            var _this = this;\n            this._items = _items;\n            this._activeItemIndex = -1;\n            this._activeItem = null;\n            this._wrap = false;\n            this._letterKeyStream = new rxjs.Subject();\n            this._typeaheadSubscription = rxjs.Subscription.EMPTY;\n            this._vertical = true;\n            this._allowedModifierKeys = [];\n            this._homeAndEnd = false;\n            /**\n             * Predicate function that can be used to check whether an item should be skipped\n             * by the key manager. By default, disabled items are skipped.\n             */\n            this._skipPredicateFn = function (item) { return item.disabled; };\n            // Buffer for the letters that the user has pressed when the typeahead option is turned on.\n            this._pressedLetters = [];\n            /**\n             * Stream that emits any time the TAB key is pressed, so components can react\n             * when focus is shifted off of the list.\n             */\n            this.tabOut = new rxjs.Subject();\n            /** Stream that emits whenever the active item of the list manager changes. */\n            this.change = new rxjs.Subject();\n            // We allow for the items to be an array because, in some cases, the consumer may\n            // not have access to a QueryList of the items they want to manage (e.g. when the\n            // items aren't being collected via `ViewChildren` or `ContentChildren`).\n            if (_items instanceof i0.QueryList) {\n                _items.changes.subscribe(function (newItems) {\n                    if (_this._activeItem) {\n                        var itemArray = newItems.toArray();\n                        var newIndex = itemArray.indexOf(_this._activeItem);\n                        if (newIndex > -1 && newIndex !== _this._activeItemIndex) {\n                            _this._activeItemIndex = newIndex;\n                        }\n                    }\n                });\n            }\n        }\n        /**\n         * Sets the predicate function that determines which items should be skipped by the\n         * list key manager.\n         * @param predicate Function that determines whether the given item should be skipped.\n         */\n        ListKeyManager.prototype.skipPredicate = function (predicate) {\n            this._skipPredicateFn = predicate;\n            return this;\n        };\n        /**\n         * Configures wrapping mode, which determines whether the active item will wrap to\n         * the other end of list when there are no more items in the given direction.\n         * @param shouldWrap Whether the list should wrap when reaching the end.\n         */\n        ListKeyManager.prototype.withWrap = function (shouldWrap) {\n            if (shouldWrap === void 0) { shouldWrap = true; }\n            this._wrap = shouldWrap;\n            return this;\n        };\n        /**\n         * Configures whether the key manager should be able to move the selection vertically.\n         * @param enabled Whether vertical selection should be enabled.\n         */\n        ListKeyManager.prototype.withVerticalOrientation = function (enabled) {\n            if (enabled === void 0) { enabled = true; }\n            this._vertical = enabled;\n            return this;\n        };\n        /**\n         * Configures the key manager to move the selection horizontally.\n         * Passing in `null` will disable horizontal movement.\n         * @param direction Direction in which the selection can be moved.\n         */\n        ListKeyManager.prototype.withHorizontalOrientation = function (direction) {\n            this._horizontal = direction;\n            return this;\n        };\n        /**\n         * Modifier keys which are allowed to be held down and whose default actions will be prevented\n         * as the user is pressing the arrow keys. Defaults to not allowing any modifier keys.\n         */\n        ListKeyManager.prototype.withAllowedModifierKeys = function (keys) {\n            this._allowedModifierKeys = keys;\n            return this;\n        };\n        /**\n         * Turns on typeahead mode which allows users to set the active item by typing.\n         * @param debounceInterval Time to wait after the last keystroke before setting the active item.\n         */\n        ListKeyManager.prototype.withTypeAhead = function (debounceInterval) {\n            var _this = this;\n            if (debounceInterval === void 0) { debounceInterval = 200; }\n            if ((typeof ngDevMode === 'undefined' || ngDevMode) && (this._items.length &&\n                this._items.some(function (item) { return typeof item.getLabel !== 'function'; }))) {\n                throw Error('ListKeyManager items in typeahead mode must implement the `getLabel` method.');\n            }\n            this._typeaheadSubscription.unsubscribe();\n            // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n            // and convert those letters back into a string. Afterwards find the first item that starts\n            // with that string and select it.\n            this._typeaheadSubscription = this._letterKeyStream.pipe(operators.tap(function (letter) { return _this._pressedLetters.push(letter); }), operators.debounceTime(debounceInterval), operators.filter(function () { return _this._pressedLetters.length > 0; }), operators.map(function () { return _this._pressedLetters.join(''); })).subscribe(function (inputString) {\n                var items = _this._getItemsArray();\n                // Start at 1 because we want to start searching at the item immediately\n                // following the current active item.\n                for (var i = 1; i < items.length + 1; i++) {\n                    var index = (_this._activeItemIndex + i) % items.length;\n                    var item = items[index];\n                    if (!_this._skipPredicateFn(item) &&\n                        item.getLabel().toUpperCase().trim().indexOf(inputString) === 0) {\n                        _this.setActiveItem(index);\n                        break;\n                    }\n                }\n                _this._pressedLetters = [];\n            });\n            return this;\n        };\n        /**\n         * Configures the key manager to activate the first and last items\n         * respectively when the Home or End key is pressed.\n         * @param enabled Whether pressing the Home or End key activates the first/last item.\n         */\n        ListKeyManager.prototype.withHomeAndEnd = function (enabled) {\n            if (enabled === void 0) { enabled = true; }\n            this._homeAndEnd = enabled;\n            return this;\n        };\n        ListKeyManager.prototype.setActiveItem = function (item) {\n            var previousActiveItem = this._activeItem;\n            this.updateActiveItem(item);\n            if (this._activeItem !== previousActiveItem) {\n                this.change.next(this._activeItemIndex);\n            }\n        };\n        /**\n         * Sets the active item depending on the key event passed in.\n         * @param event Keyboard event to be used for determining which element should be active.\n         */\n        ListKeyManager.prototype.onKeydown = function (event) {\n            var _this = this;\n            var keyCode = event.keyCode;\n            var modifiers = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];\n            var isModifierAllowed = modifiers.every(function (modifier) {\n                return !event[modifier] || _this._allowedModifierKeys.indexOf(modifier) > -1;\n            });\n            switch (keyCode) {\n                case keycodes.TAB:\n                    this.tabOut.next();\n                    return;\n                case keycodes.DOWN_ARROW:\n                    if (this._vertical && isModifierAllowed) {\n                        this.setNextItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                case keycodes.UP_ARROW:\n                    if (this._vertical && isModifierAllowed) {\n                        this.setPreviousItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                case keycodes.RIGHT_ARROW:\n                    if (this._horizontal && isModifierAllowed) {\n                        this._horizontal === 'rtl' ? this.setPreviousItemActive() : this.setNextItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                case keycodes.LEFT_ARROW:\n                    if (this._horizontal && isModifierAllowed) {\n                        this._horizontal === 'rtl' ? this.setNextItemActive() : this.setPreviousItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                case keycodes.HOME:\n                    if (this._homeAndEnd && isModifierAllowed) {\n                        this.setFirstItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                case keycodes.END:\n                    if (this._homeAndEnd && isModifierAllowed) {\n                        this.setLastItemActive();\n                        break;\n                    }\n                    else {\n                        return;\n                    }\n                default:\n                    if (isModifierAllowed || keycodes.hasModifierKey(event, 'shiftKey')) {\n                        // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n                        // otherwise fall back to resolving alphanumeric characters via the keyCode.\n                        if (event.key && event.key.length === 1) {\n                            this._letterKeyStream.next(event.key.toLocaleUpperCase());\n                        }\n                        else if ((keyCode >= keycodes.A && keyCode <= keycodes.Z) || (keyCode >= keycodes.ZERO && keyCode <= keycodes.NINE)) {\n                            this._letterKeyStream.next(String.fromCharCode(keyCode));\n                        }\n                    }\n                    // Note that we return here, in order to avoid preventing\n                    // the default action of non-navigational keys.\n                    return;\n            }\n            this._pressedLetters = [];\n            event.preventDefault();\n        };\n        Object.defineProperty(ListKeyManager.prototype, \"activeItemIndex\", {\n            /** Index of the currently active item. */\n            get: function () {\n                return this._activeItemIndex;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(ListKeyManager.prototype, \"activeItem\", {\n            /** The active item. */\n            get: function () {\n                return this._activeItem;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n        ListKeyManager.prototype.isTyping = function () {\n            return this._pressedLetters.length > 0;\n        };\n        /** Sets the active item to the first enabled item in the list. */\n        ListKeyManager.prototype.setFirstItemActive = function () {\n            this._setActiveItemByIndex(0, 1);\n        };\n        /** Sets the active item to the last enabled item in the list. */\n        ListKeyManager.prototype.setLastItemActive = function () {\n            this._setActiveItemByIndex(this._items.length - 1, -1);\n        };\n        /** Sets the active item to the next enabled item in the list. */\n        ListKeyManager.prototype.setNextItemActive = function () {\n            this._activeItemIndex < 0 ? this.setFirstItemActive() : this._setActiveItemByDelta(1);\n        };\n        /** Sets the active item to a previous enabled item in the list. */\n        ListKeyManager.prototype.setPreviousItemActive = function () {\n            this._activeItemIndex < 0 && this._wrap ? this.setLastItemActive()\n                : this._setActiveItemByDelta(-1);\n        };\n        ListKeyManager.prototype.updateActiveItem = function (item) {\n            var itemArray = this._getItemsArray();\n            var index = typeof item === 'number' ? item : itemArray.indexOf(item);\n            var activeItem = itemArray[index];\n            // Explicitly check for `null` and `undefined` because other falsy values are valid.\n            this._activeItem = activeItem == null ? null : activeItem;\n            this._activeItemIndex = index;\n        };\n        /**\n         * This method sets the active item, given a list of items and the delta between the\n         * currently active item and the new active item. It will calculate differently\n         * depending on whether wrap mode is turned on.\n         */\n        ListKeyManager.prototype._setActiveItemByDelta = function (delta) {\n            this._wrap ? this._setActiveInWrapMode(delta) : this._setActiveInDefaultMode(delta);\n        };\n        /**\n         * Sets the active item properly given \"wrap\" mode. In other words, it will continue to move\n         * down the list until it finds an item that is not disabled, and it will wrap if it\n         * encounters either end of the list.\n         */\n        ListKeyManager.prototype._setActiveInWrapMode = function (delta) {\n            var items = this._getItemsArray();\n            for (var i = 1; i <= items.length; i++) {\n                var index = (this._activeItemIndex + (delta * i) + items.length) % items.length;\n                var item = items[index];\n                if (!this._skipPredicateFn(item)) {\n                    this.setActiveItem(index);\n                    return;\n                }\n            }\n        };\n        /**\n         * Sets the active item properly given the default mode. In other words, it will\n         * continue to move down the list until it finds an item that is not disabled. If\n         * it encounters either end of the list, it will stop and not wrap.\n         */\n        ListKeyManager.prototype._setActiveInDefaultMode = function (delta) {\n            this._setActiveItemByIndex(this._activeItemIndex + delta, delta);\n        };\n        /**\n         * Sets the active item to the first enabled item starting at the index specified. If the\n         * item is disabled, it will move in the fallbackDelta direction until it either\n         * finds an enabled item or encounters the end of the list.\n         */\n        ListKeyManager.prototype._setActiveItemByIndex = function (index, fallbackDelta) {\n            var items = this._getItemsArray();\n            if (!items[index]) {\n                return;\n            }\n            while (this._skipPredicateFn(items[index])) {\n                index += fallbackDelta;\n                if (!items[index]) {\n                    return;\n                }\n            }\n            this.setActiveItem(index);\n        };\n        /** Returns the items as an array. */\n        ListKeyManager.prototype._getItemsArray = function () {\n            return this._items instanceof i0.QueryList ? this._items.toArray() : this._items;\n        };\n        return ListKeyManager;\n    }());\n\n    var ActiveDescendantKeyManager = /** @class */ (function (_super) {\n        __extends(ActiveDescendantKeyManager, _super);\n        function ActiveDescendantKeyManager() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ActiveDescendantKeyManager.prototype.setActiveItem = function (index) {\n            if (this.activeItem) {\n                this.activeItem.setInactiveStyles();\n            }\n            _super.prototype.setActiveItem.call(this, index);\n            if (this.activeItem) {\n                this.activeItem.setActiveStyles();\n            }\n        };\n        return ActiveDescendantKeyManager;\n    }(ListKeyManager));\n\n    var FocusKeyManager = /** @class */ (function (_super) {\n        __extends(FocusKeyManager, _super);\n        function FocusKeyManager() {\n            var _this = _super.apply(this, __spread(arguments)) || this;\n            _this._origin = 'program';\n            return _this;\n        }\n        /**\n         * Sets the focus origin that will be passed in to the items for any subsequent `focus` calls.\n         * @param origin Focus origin to be used when focusing items.\n         */\n        FocusKeyManager.prototype.setFocusOrigin = function (origin) {\n            this._origin = origin;\n            return this;\n        };\n        FocusKeyManager.prototype.setActiveItem = function (item) {\n            _super.prototype.setActiveItem.call(this, item);\n            if (this.activeItem) {\n                this.activeItem.focus(this._origin);\n            }\n        };\n        return FocusKeyManager;\n    }(ListKeyManager));\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     * Configuration for the isFocusable method.\n     */\n    var IsFocusableConfig = /** @class */ (function () {\n        function IsFocusableConfig() {\n            /**\n             * Whether to count an element as focusable even if it is not currently visible.\n             */\n            this.ignoreVisibility = false;\n        }\n        return IsFocusableConfig;\n    }());\n    // The InteractivityChecker leans heavily on the ally.js accessibility utilities.\n    // Methods like `isTabbable` are only covering specific edge-cases for the browsers which are\n    // supported.\n    /**\n     * Utility for checking the interactivity of an element, such as whether is is focusable or\n     * tabbable.\n     */\n    var InteractivityChecker = /** @class */ (function () {\n        function InteractivityChecker(_platform) {\n            this._platform = _platform;\n        }\n        /**\n         * Gets whether an element is disabled.\n         *\n         * @param element Element to be checked.\n         * @returns Whether the element is disabled.\n         */\n        InteractivityChecker.prototype.isDisabled = function (element) {\n            // This does not capture some cases, such as a non-form control with a disabled attribute or\n            // a form control inside of a disabled form, but should capture the most common cases.\n            return element.hasAttribute('disabled');\n        };\n        /**\n         * Gets whether an element is visible for the purposes of interactivity.\n         *\n         * This will capture states like `display: none` and `visibility: hidden`, but not things like\n         * being clipped by an `overflow: hidden` parent or being outside the viewport.\n         *\n         * @returns Whether the element is visible.\n         */\n        InteractivityChecker.prototype.isVisible = function (element) {\n            return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';\n        };\n        /**\n         * Gets whether an element can be reached via Tab key.\n         * Assumes that the element has already been checked with isFocusable.\n         *\n         * @param element Element to be checked.\n         * @returns Whether the element is tabbable.\n         */\n        InteractivityChecker.prototype.isTabbable = function (element) {\n            // Nothing is tabbable on the server 😎\n            if (!this._platform.isBrowser) {\n                return false;\n            }\n            var frameElement = getFrameElement(getWindow(element));\n            if (frameElement) {\n                // Frame elements inherit their tabindex onto all child elements.\n                if (getTabIndexValue(frameElement) === -1) {\n                    return false;\n                }\n                // Browsers disable tabbing to an element inside of an invisible frame.\n                if (!this.isVisible(frameElement)) {\n                    return false;\n                }\n            }\n            var nodeName = element.nodeName.toLowerCase();\n            var tabIndexValue = getTabIndexValue(element);\n            if (element.hasAttribute('contenteditable')) {\n                return tabIndexValue !== -1;\n            }\n            if (nodeName === 'iframe' || nodeName === 'object') {\n                // The frame or object's content may be tabbable depending on the content, but it's\n                // not possibly to reliably detect the content of the frames. We always consider such\n                // elements as non-tabbable.\n                return false;\n            }\n            // In iOS, the browser only considers some specific elements as tabbable.\n            if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {\n                return false;\n            }\n            if (nodeName === 'audio') {\n                // Audio elements without controls enabled are never tabbable, regardless\n                // of the tabindex attribute explicitly being set.\n                if (!element.hasAttribute('controls')) {\n                    return false;\n                }\n                // Audio elements with controls are by default tabbable unless the\n                // tabindex attribute is set to `-1` explicitly.\n                return tabIndexValue !== -1;\n            }\n            if (nodeName === 'video') {\n                // For all video elements, if the tabindex attribute is set to `-1`, the video\n                // is not tabbable. Note: We cannot rely on the default `HTMLElement.tabIndex`\n                // property as that one is set to `-1` in Chrome, Edge and Safari v13.1. The\n                // tabindex attribute is the source of truth here.\n                if (tabIndexValue === -1) {\n                    return false;\n                }\n                // If the tabindex is explicitly set, and not `-1` (as per check before), the\n                // video element is always tabbable (regardless of whether it has controls or not).\n                if (tabIndexValue !== null) {\n                    return true;\n                }\n                // Otherwise (when no explicit tabindex is set), a video is only tabbable if it\n                // has controls enabled. Firefox is special as videos are always tabbable regardless\n                // of whether there are controls or not.\n                return this._platform.FIREFOX || element.hasAttribute('controls');\n            }\n            return element.tabIndex >= 0;\n        };\n        /**\n         * Gets whether an element can be focused by the user.\n         *\n         * @param element Element to be checked.\n         * @param config The config object with options to customize this method's behavior\n         * @returns Whether the element is focusable.\n         */\n        InteractivityChecker.prototype.isFocusable = function (element, config) {\n            // Perform checks in order of left to most expensive.\n            // Again, naive approach that does not capture many edge cases and browser quirks.\n            return isPotentiallyFocusable(element) && !this.isDisabled(element) &&\n                ((config === null || config === void 0 ? void 0 : config.ignoreVisibility) || this.isVisible(element));\n        };\n        return InteractivityChecker;\n    }());\n    InteractivityChecker.ɵprov = i0.ɵɵdefineInjectable({ factory: function InteractivityChecker_Factory() { return new InteractivityChecker(i0.ɵɵinject(i1.Platform)); }, token: InteractivityChecker, providedIn: \"root\" });\n    InteractivityChecker.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    InteractivityChecker.ctorParameters = function () { return [\n        { type: i1.Platform }\n    ]; };\n    /**\n     * Returns the frame element from a window object. Since browsers like MS Edge throw errors if\n     * the frameElement property is being accessed from a different host address, this property\n     * should be accessed carefully.\n     */\n    function getFrameElement(window) {\n        try {\n            return window.frameElement;\n        }\n        catch (_a) {\n            return null;\n        }\n    }\n    /** Checks whether the specified element has any geometry / rectangles. */\n    function hasGeometry(element) {\n        // Use logic from jQuery to check for an invisible element.\n        // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n        return !!(element.offsetWidth || element.offsetHeight ||\n            (typeof element.getClientRects === 'function' && element.getClientRects().length));\n    }\n    /** Gets whether an element's  */\n    function isNativeFormElement(element) {\n        var nodeName = element.nodeName.toLowerCase();\n        return nodeName === 'input' ||\n            nodeName === 'select' ||\n            nodeName === 'button' ||\n            nodeName === 'textarea';\n    }\n    /** Gets whether an element is an `<input type=\"hidden\">`. */\n    function isHiddenInput(element) {\n        return isInputElement(element) && element.type == 'hidden';\n    }\n    /** Gets whether an element is an anchor that has an href attribute. */\n    function isAnchorWithHref(element) {\n        return isAnchorElement(element) && element.hasAttribute('href');\n    }\n    /** Gets whether an element is an input element. */\n    function isInputElement(element) {\n        return element.nodeName.toLowerCase() == 'input';\n    }\n    /** Gets whether an element is an anchor element. */\n    function isAnchorElement(element) {\n        return element.nodeName.toLowerCase() == 'a';\n    }\n    /** Gets whether an element has a valid tabindex. */\n    function hasValidTabIndex(element) {\n        if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n            return false;\n        }\n        var tabIndex = element.getAttribute('tabindex');\n        // IE11 parses tabindex=\"\" as the value \"-32768\"\n        if (tabIndex == '-32768') {\n            return false;\n        }\n        return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n    }\n    /**\n     * Returns the parsed tabindex from the element attributes instead of returning the\n     * evaluated tabindex from the browsers defaults.\n     */\n    function getTabIndexValue(element) {\n        if (!hasValidTabIndex(element)) {\n            return null;\n        }\n        // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054\n        var tabIndex = parseInt(element.getAttribute('tabindex') || '', 10);\n        return isNaN(tabIndex) ? -1 : tabIndex;\n    }\n    /** Checks whether the specified element is potentially tabbable on iOS */\n    function isPotentiallyTabbableIOS(element) {\n        var nodeName = element.nodeName.toLowerCase();\n        var inputType = nodeName === 'input' && element.type;\n        return inputType === 'text'\n            || inputType === 'password'\n            || nodeName === 'select'\n            || nodeName === 'textarea';\n    }\n    /**\n     * Gets whether an element is potentially focusable without taking current visible/disabled state\n     * into account.\n     */\n    function isPotentiallyFocusable(element) {\n        // Inputs are potentially focusable *unless* they're type=\"hidden\".\n        if (isHiddenInput(element)) {\n            return false;\n        }\n        return isNativeFormElement(element) ||\n            isAnchorWithHref(element) ||\n            element.hasAttribute('contenteditable') ||\n            hasValidTabIndex(element);\n    }\n    /** Gets the parent window of a DOM node with regards of being inside of an iframe. */\n    function getWindow(node) {\n        // ownerDocument is null if `node` itself *is* a document.\n        return node.ownerDocument && node.ownerDocument.defaultView || window;\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     * Class that allows for trapping focus within a DOM element.\n     *\n     * This class currently uses a relatively simple approach to focus trapping.\n     * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n     * Things like `tabIndex > 0`, flex `order`, and shadow roots can cause the two to be misaligned.\n     *\n     * @deprecated Use `ConfigurableFocusTrap` instead.\n     * @breaking-change 11.0.0\n     */\n    var FocusTrap = /** @class */ (function () {\n        function FocusTrap(_element, _checker, _ngZone, _document, deferAnchors) {\n            var _this = this;\n            if (deferAnchors === void 0) { deferAnchors = false; }\n            this._element = _element;\n            this._checker = _checker;\n            this._ngZone = _ngZone;\n            this._document = _document;\n            this._hasAttached = false;\n            // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.\n            this.startAnchorListener = function () { return _this.focusLastTabbableElement(); };\n            this.endAnchorListener = function () { return _this.focusFirstTabbableElement(); };\n            this._enabled = true;\n            if (!deferAnchors) {\n                this.attachAnchors();\n            }\n        }\n        Object.defineProperty(FocusTrap.prototype, \"enabled\", {\n            /** Whether the focus trap is active. */\n            get: function () { return this._enabled; },\n            set: function (value) {\n                this._enabled = value;\n                if (this._startAnchor && this._endAnchor) {\n                    this._toggleAnchorTabIndex(value, this._startAnchor);\n                    this._toggleAnchorTabIndex(value, this._endAnchor);\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        /** Destroys the focus trap by cleaning up the anchors. */\n        FocusTrap.prototype.destroy = function () {\n            var startAnchor = this._startAnchor;\n            var endAnchor = this._endAnchor;\n            if (startAnchor) {\n                startAnchor.removeEventListener('focus', this.startAnchorListener);\n                if (startAnchor.parentNode) {\n                    startAnchor.parentNode.removeChild(startAnchor);\n                }\n            }\n            if (endAnchor) {\n                endAnchor.removeEventListener('focus', this.endAnchorListener);\n                if (endAnchor.parentNode) {\n                    endAnchor.parentNode.removeChild(endAnchor);\n                }\n            }\n            this._startAnchor = this._endAnchor = null;\n            this._hasAttached = false;\n        };\n        /**\n         * Inserts the anchors into the DOM. This is usually done automatically\n         * in the constructor, but can be deferred for cases like directives with `*ngIf`.\n         * @returns Whether the focus trap managed to attach successfully. This may not be the case\n         * if the target element isn't currently in the DOM.\n         */\n        FocusTrap.prototype.attachAnchors = function () {\n            var _this = this;\n            // If we're not on the browser, there can be no focus to trap.\n            if (this._hasAttached) {\n                return true;\n            }\n            this._ngZone.runOutsideAngular(function () {\n                if (!_this._startAnchor) {\n                    _this._startAnchor = _this._createAnchor();\n                    _this._startAnchor.addEventListener('focus', _this.startAnchorListener);\n                }\n                if (!_this._endAnchor) {\n                    _this._endAnchor = _this._createAnchor();\n                    _this._endAnchor.addEventListener('focus', _this.endAnchorListener);\n                }\n            });\n            if (this._element.parentNode) {\n                this._element.parentNode.insertBefore(this._startAnchor, this._element);\n                this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling);\n                this._hasAttached = true;\n            }\n            return this._hasAttached;\n        };\n        /**\n         * Waits for the zone to stabilize, then either focuses the first element that the\n         * user specified, or the first tabbable element.\n         * @returns Returns a promise that resolves with a boolean, depending\n         * on whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusInitialElementWhenReady = function () {\n            var _this = this;\n            return new Promise(function (resolve) {\n                _this._executeOnStable(function () { return resolve(_this.focusInitialElement()); });\n            });\n        };\n        /**\n         * Waits for the zone to stabilize, then focuses\n         * the first tabbable element within the focus trap region.\n         * @returns Returns a promise that resolves with a boolean, depending\n         * on whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusFirstTabbableElementWhenReady = function () {\n            var _this = this;\n            return new Promise(function (resolve) {\n                _this._executeOnStable(function () { return resolve(_this.focusFirstTabbableElement()); });\n            });\n        };\n        /**\n         * Waits for the zone to stabilize, then focuses\n         * the last tabbable element within the focus trap region.\n         * @returns Returns a promise that resolves with a boolean, depending\n         * on whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusLastTabbableElementWhenReady = function () {\n            var _this = this;\n            return new Promise(function (resolve) {\n                _this._executeOnStable(function () { return resolve(_this.focusLastTabbableElement()); });\n            });\n        };\n        /**\n         * Get the specified boundary element of the trapped region.\n         * @param bound The boundary to get (start or end of trapped region).\n         * @returns The boundary element.\n         */\n        FocusTrap.prototype._getRegionBoundary = function (bound) {\n            // Contains the deprecated version of selector, for temporary backwards comparability.\n            var markers = this._element.querySelectorAll(\"[cdk-focus-region-\" + bound + \"], \" +\n                (\"[cdkFocusRegion\" + bound + \"], \") +\n                (\"[cdk-focus-\" + bound + \"]\"));\n            for (var i = 0; i < markers.length; i++) {\n                // @breaking-change 8.0.0\n                if (markers[i].hasAttribute(\"cdk-focus-\" + bound)) {\n                    console.warn(\"Found use of deprecated attribute 'cdk-focus-\" + bound + \"', \" +\n                        (\"use 'cdkFocusRegion\" + bound + \"' instead. The deprecated \") +\n                        \"attribute will be removed in 8.0.0.\", markers[i]);\n                }\n                else if (markers[i].hasAttribute(\"cdk-focus-region-\" + bound)) {\n                    console.warn(\"Found use of deprecated attribute 'cdk-focus-region-\" + bound + \"', \" +\n                        (\"use 'cdkFocusRegion\" + bound + \"' instead. The deprecated attribute \") +\n                        \"will be removed in 8.0.0.\", markers[i]);\n                }\n            }\n            if (bound == 'start') {\n                return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);\n            }\n            return markers.length ?\n                markers[markers.length - 1] : this._getLastTabbableElement(this._element);\n        };\n        /**\n         * Focuses the element that should be focused when the focus trap is initialized.\n         * @returns Whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusInitialElement = function () {\n            // Contains the deprecated version of selector, for temporary backwards comparability.\n            var redirectToElement = this._element.querySelector(\"[cdk-focus-initial], \" +\n                \"[cdkFocusInitial]\");\n            if (redirectToElement) {\n                // @breaking-change 8.0.0\n                if (redirectToElement.hasAttribute(\"cdk-focus-initial\")) {\n                    console.warn(\"Found use of deprecated attribute 'cdk-focus-initial', \" +\n                        \"use 'cdkFocusInitial' instead. The deprecated attribute \" +\n                        \"will be removed in 8.0.0\", redirectToElement);\n                }\n                // Warn the consumer if the element they've pointed to\n                // isn't focusable, when not in production mode.\n                if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n                    !this._checker.isFocusable(redirectToElement)) {\n                    console.warn(\"Element matching '[cdkFocusInitial]' is not focusable.\", redirectToElement);\n                }\n                if (!this._checker.isFocusable(redirectToElement)) {\n                    var focusableChild = this._getFirstTabbableElement(redirectToElement);\n                    focusableChild === null || focusableChild === void 0 ? void 0 : focusableChild.focus();\n                    return !!focusableChild;\n                }\n                redirectToElement.focus();\n                return true;\n            }\n            return this.focusFirstTabbableElement();\n        };\n        /**\n         * Focuses the first tabbable element within the focus trap region.\n         * @returns Whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusFirstTabbableElement = function () {\n            var redirectToElement = this._getRegionBoundary('start');\n            if (redirectToElement) {\n                redirectToElement.focus();\n            }\n            return !!redirectToElement;\n        };\n        /**\n         * Focuses the last tabbable element within the focus trap region.\n         * @returns Whether focus was moved successfully.\n         */\n        FocusTrap.prototype.focusLastTabbableElement = function () {\n            var redirectToElement = this._getRegionBoundary('end');\n            if (redirectToElement) {\n                redirectToElement.focus();\n            }\n            return !!redirectToElement;\n        };\n        /**\n         * Checks whether the focus trap has successfully been attached.\n         */\n        FocusTrap.prototype.hasAttached = function () {\n            return this._hasAttached;\n        };\n        /** Get the first tabbable element from a DOM subtree (inclusive). */\n        FocusTrap.prototype._getFirstTabbableElement = function (root) {\n            if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n                return root;\n            }\n            // Iterate in DOM order. Note that IE doesn't have `children` for SVG so we fall\n            // back to `childNodes` which includes text nodes, comments etc.\n            var children = root.children || root.childNodes;\n            for (var i = 0; i < children.length; i++) {\n                var tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?\n                    this._getFirstTabbableElement(children[i]) :\n                    null;\n                if (tabbableChild) {\n                    return tabbableChild;\n                }\n            }\n            return null;\n        };\n        /** Get the last tabbable element from a DOM subtree (inclusive). */\n        FocusTrap.prototype._getLastTabbableElement = function (root) {\n            if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n                return root;\n            }\n            // Iterate in reverse DOM order.\n            var children = root.children || root.childNodes;\n            for (var i = children.length - 1; i >= 0; i--) {\n                var tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?\n                    this._getLastTabbableElement(children[i]) :\n                    null;\n                if (tabbableChild) {\n                    return tabbableChild;\n                }\n            }\n            return null;\n        };\n        /** Creates an anchor element. */\n        FocusTrap.prototype._createAnchor = function () {\n            var anchor = this._document.createElement('div');\n            this._toggleAnchorTabIndex(this._enabled, anchor);\n            anchor.classList.add('cdk-visually-hidden');\n            anchor.classList.add('cdk-focus-trap-anchor');\n            anchor.setAttribute('aria-hidden', 'true');\n            return anchor;\n        };\n        /**\n         * Toggles the `tabindex` of an anchor, based on the enabled state of the focus trap.\n         * @param isEnabled Whether the focus trap is enabled.\n         * @param anchor Anchor on which to toggle the tabindex.\n         */\n        FocusTrap.prototype._toggleAnchorTabIndex = function (isEnabled, anchor) {\n            // Remove the tabindex completely, rather than setting it to -1, because if the\n            // element has a tabindex, the user might still hit it when navigating with the arrow keys.\n            isEnabled ? anchor.setAttribute('tabindex', '0') : anchor.removeAttribute('tabindex');\n        };\n        /**\n         * Toggles the`tabindex` of both anchors to either trap Tab focus or allow it to escape.\n         * @param enabled: Whether the anchors should trap Tab.\n         */\n        FocusTrap.prototype.toggleAnchors = function (enabled) {\n            if (this._startAnchor && this._endAnchor) {\n                this._toggleAnchorTabIndex(enabled, this._startAnchor);\n                this._toggleAnchorTabIndex(enabled, this._endAnchor);\n            }\n        };\n        /** Executes a function when the zone is stable. */\n        FocusTrap.prototype._executeOnStable = function (fn) {\n            if (this._ngZone.isStable) {\n                fn();\n            }\n            else {\n                this._ngZone.onStable.pipe(operators.take(1)).subscribe(fn);\n            }\n        };\n        return FocusTrap;\n    }());\n    /**\n     * Factory that allows easy instantiation of focus traps.\n     * @deprecated Use `ConfigurableFocusTrapFactory` instead.\n     * @breaking-change 11.0.0\n     */\n    var FocusTrapFactory = /** @class */ (function () {\n        function FocusTrapFactory(_checker, _ngZone, _document) {\n            this._checker = _checker;\n            this._ngZone = _ngZone;\n            this._document = _document;\n        }\n        /**\n         * Creates a focus-trapped region around the given element.\n         * @param element The element around which focus will be trapped.\n         * @param deferCaptureElements Defers the creation of focus-capturing elements to be done\n         *     manually by the user.\n         * @returns The created focus trap instance.\n         */\n        FocusTrapFactory.prototype.create = function (element, deferCaptureElements) {\n            if (deferCaptureElements === void 0) { deferCaptureElements = false; }\n            return new FocusTrap(element, this._checker, this._ngZone, this._document, deferCaptureElements);\n        };\n        return FocusTrapFactory;\n    }());\n    FocusTrapFactory.ɵprov = i0.ɵɵdefineInjectable({ factory: function FocusTrapFactory_Factory() { return new FocusTrapFactory(i0.ɵɵinject(InteractivityChecker), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i2.DOCUMENT)); }, token: FocusTrapFactory, providedIn: \"root\" });\n    FocusTrapFactory.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    FocusTrapFactory.ctorParameters = function () { return [\n        { type: InteractivityChecker },\n        { type: i0.NgZone },\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] }\n    ]; };\n    /** Directive for trapping focus within a region. */\n    var CdkTrapFocus = /** @class */ (function () {\n        function CdkTrapFocus(_elementRef, _focusTrapFactory, _document) {\n            this._elementRef = _elementRef;\n            this._focusTrapFactory = _focusTrapFactory;\n            /** Previously focused element to restore focus to upon destroy when using autoCapture. */\n            this._previouslyFocusedElement = null;\n            this._document = _document;\n            this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);\n        }\n        Object.defineProperty(CdkTrapFocus.prototype, \"enabled\", {\n            /** Whether the focus trap is active. */\n            get: function () { return this.focusTrap.enabled; },\n            set: function (value) { this.focusTrap.enabled = coercion.coerceBooleanProperty(value); },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(CdkTrapFocus.prototype, \"autoCapture\", {\n            /**\n             * Whether the directive should automatically move focus into the trapped region upon\n             * initialization and return focus to the previous activeElement upon destruction.\n             */\n            get: function () { return this._autoCapture; },\n            set: function (value) { this._autoCapture = coercion.coerceBooleanProperty(value); },\n            enumerable: false,\n            configurable: true\n        });\n        CdkTrapFocus.prototype.ngOnDestroy = function () {\n            this.focusTrap.destroy();\n            // If we stored a previously focused element when using autoCapture, return focus to that\n            // element now that the trapped region is being destroyed.\n            if (this._previouslyFocusedElement) {\n                this._previouslyFocusedElement.focus();\n                this._previouslyFocusedElement = null;\n            }\n        };\n        CdkTrapFocus.prototype.ngAfterContentInit = function () {\n            this.focusTrap.attachAnchors();\n            if (this.autoCapture) {\n                this._captureFocus();\n            }\n        };\n        CdkTrapFocus.prototype.ngDoCheck = function () {\n            if (!this.focusTrap.hasAttached()) {\n                this.focusTrap.attachAnchors();\n            }\n        };\n        CdkTrapFocus.prototype.ngOnChanges = function (changes) {\n            var autoCaptureChange = changes['autoCapture'];\n            if (autoCaptureChange && !autoCaptureChange.firstChange && this.autoCapture &&\n                this.focusTrap.hasAttached()) {\n                this._captureFocus();\n            }\n        };\n        CdkTrapFocus.prototype._captureFocus = function () {\n            var _a, _b;\n            // If the `activeElement` is inside a shadow root, `document.activeElement` will\n            // point to the shadow root so we have to descend into it ourselves.\n            var activeElement = (_a = this._document) === null || _a === void 0 ? void 0 : _a.activeElement;\n            this._previouslyFocusedElement =\n                ((_b = activeElement === null || activeElement === void 0 ? void 0 : activeElement.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement) || activeElement;\n            this.focusTrap.focusInitialElementWhenReady();\n        };\n        return CdkTrapFocus;\n    }());\n    CdkTrapFocus.decorators = [\n        { type: i0.Directive, args: [{\n                    selector: '[cdkTrapFocus]',\n                    exportAs: 'cdkTrapFocus',\n                },] }\n    ];\n    CdkTrapFocus.ctorParameters = function () { return [\n        { type: i0.ElementRef },\n        { type: FocusTrapFactory },\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] }\n    ]; };\n    CdkTrapFocus.propDecorators = {\n        enabled: [{ type: i0.Input, args: ['cdkTrapFocus',] }],\n        autoCapture: [{ type: i0.Input, args: ['cdkTrapFocusAutoCapture',] }]\n    };\n\n    /**\n     * Class that allows for trapping focus within a DOM element.\n     *\n     * This class uses a strategy pattern that determines how it traps focus.\n     * See FocusTrapInertStrategy.\n     */\n    var ConfigurableFocusTrap = /** @class */ (function (_super) {\n        __extends(ConfigurableFocusTrap, _super);\n        function ConfigurableFocusTrap(_element, _checker, _ngZone, _document, _focusTrapManager, _inertStrategy, config) {\n            var _this = _super.call(this, _element, _checker, _ngZone, _document, config.defer) || this;\n            _this._focusTrapManager = _focusTrapManager;\n            _this._inertStrategy = _inertStrategy;\n            _this._focusTrapManager.register(_this);\n            return _this;\n        }\n        Object.defineProperty(ConfigurableFocusTrap.prototype, \"enabled\", {\n            /** Whether the FocusTrap is enabled. */\n            get: function () { return this._enabled; },\n            set: function (value) {\n                this._enabled = value;\n                if (this._enabled) {\n                    this._focusTrapManager.register(this);\n                }\n                else {\n                    this._focusTrapManager.deregister(this);\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        /** Notifies the FocusTrapManager that this FocusTrap will be destroyed. */\n        ConfigurableFocusTrap.prototype.destroy = function () {\n            this._focusTrapManager.deregister(this);\n            _super.prototype.destroy.call(this);\n        };\n        /** @docs-private Implemented as part of ManagedFocusTrap. */\n        ConfigurableFocusTrap.prototype._enable = function () {\n            this._inertStrategy.preventFocus(this);\n            this.toggleAnchors(true);\n        };\n        /** @docs-private Implemented as part of ManagedFocusTrap. */\n        ConfigurableFocusTrap.prototype._disable = function () {\n            this._inertStrategy.allowFocus(this);\n            this.toggleAnchors(false);\n        };\n        return ConfigurableFocusTrap;\n    }(FocusTrap));\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    /** IE 11 compatible closest implementation that is able to start from non-Element Nodes. */\n    function closest(element, selector) {\n        if (!(element instanceof Node)) {\n            return null;\n        }\n        var curr = element;\n        while (curr != null && !(curr instanceof Element)) {\n            curr = curr.parentNode;\n        }\n        return curr && (hasNativeClosest ?\n            curr.closest(selector) : polyfillClosest(curr, selector));\n    }\n    /** Polyfill for browsers without Element.closest. */\n    function polyfillClosest(element, selector) {\n        var curr = element;\n        while (curr != null && !(curr instanceof Element && matches(curr, selector))) {\n            curr = curr.parentNode;\n        }\n        return (curr || null);\n    }\n    var hasNativeClosest = typeof Element != 'undefined' && !!Element.prototype.closest;\n    /** IE 11 compatible matches implementation. */\n    function matches(element, selector) {\n        return element.matches ?\n            element.matches(selector) :\n            element['msMatchesSelector'](selector);\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     * Lightweight FocusTrapInertStrategy that adds a document focus event\n     * listener to redirect focus back inside the FocusTrap.\n     */\n    var EventListenerFocusTrapInertStrategy = /** @class */ (function () {\n        function EventListenerFocusTrapInertStrategy() {\n            /** Focus event handler. */\n            this._listener = null;\n        }\n        /** Adds a document event listener that keeps focus inside the FocusTrap. */\n        EventListenerFocusTrapInertStrategy.prototype.preventFocus = function (focusTrap) {\n            var _this = this;\n            // Ensure there's only one listener per document\n            if (this._listener) {\n                focusTrap._document.removeEventListener('focus', this._listener, true);\n            }\n            this._listener = function (e) { return _this._trapFocus(focusTrap, e); };\n            focusTrap._ngZone.runOutsideAngular(function () {\n                focusTrap._document.addEventListener('focus', _this._listener, true);\n            });\n        };\n        /** Removes the event listener added in preventFocus. */\n        EventListenerFocusTrapInertStrategy.prototype.allowFocus = function (focusTrap) {\n            if (!this._listener) {\n                return;\n            }\n            focusTrap._document.removeEventListener('focus', this._listener, true);\n            this._listener = null;\n        };\n        /**\n         * Refocuses the first element in the FocusTrap if the focus event target was outside\n         * the FocusTrap.\n         *\n         * This is an event listener callback. The event listener is added in runOutsideAngular,\n         * so all this code runs outside Angular as well.\n         */\n        EventListenerFocusTrapInertStrategy.prototype._trapFocus = function (focusTrap, event) {\n            var target = event.target;\n            var focusTrapRoot = focusTrap._element;\n            // Don't refocus if target was in an overlay, because the overlay might be associated\n            // with an element inside the FocusTrap, ex. mat-select.\n            if (!focusTrapRoot.contains(target) && closest(target, 'div.cdk-overlay-pane') === null) {\n                // Some legacy FocusTrap usages have logic that focuses some element on the page\n                // just before FocusTrap is destroyed. For backwards compatibility, wait\n                // to be sure FocusTrap is still enabled before refocusing.\n                setTimeout(function () {\n                    // Check whether focus wasn't put back into the focus trap while the timeout was pending.\n                    if (focusTrap.enabled && !focusTrapRoot.contains(focusTrap._document.activeElement)) {\n                        focusTrap.focusFirstTabbableElement();\n                    }\n                });\n            }\n        };\n        return EventListenerFocusTrapInertStrategy;\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     * Configuration for creating a ConfigurableFocusTrap.\n     */\n    var ConfigurableFocusTrapConfig = /** @class */ (function () {\n        function ConfigurableFocusTrapConfig() {\n            /**\n             * Whether to defer the creation of FocusTrap elements to be\n             * done manually by the user. Default is to create them\n             * automatically.\n             */\n            this.defer = false;\n        }\n        return ConfigurableFocusTrapConfig;\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    /** The injection token used to specify the inert strategy. */\n    var FOCUS_TRAP_INERT_STRATEGY = new i0.InjectionToken('FOCUS_TRAP_INERT_STRATEGY');\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    /** Injectable that ensures only the most recently enabled FocusTrap is active. */\n    var FocusTrapManager = /** @class */ (function () {\n        function FocusTrapManager() {\n            // A stack of the FocusTraps on the page. Only the FocusTrap at the\n            // top of the stack is active.\n            this._focusTrapStack = [];\n        }\n        /**\n         * Disables the FocusTrap at the top of the stack, and then pushes\n         * the new FocusTrap onto the stack.\n         */\n        FocusTrapManager.prototype.register = function (focusTrap) {\n            // Dedupe focusTraps that register multiple times.\n            this._focusTrapStack = this._focusTrapStack.filter(function (ft) { return ft !== focusTrap; });\n            var stack = this._focusTrapStack;\n            if (stack.length) {\n                stack[stack.length - 1]._disable();\n            }\n            stack.push(focusTrap);\n            focusTrap._enable();\n        };\n        /**\n         * Removes the FocusTrap from the stack, and activates the\n         * FocusTrap that is the new top of the stack.\n         */\n        FocusTrapManager.prototype.deregister = function (focusTrap) {\n            focusTrap._disable();\n            var stack = this._focusTrapStack;\n            var i = stack.indexOf(focusTrap);\n            if (i !== -1) {\n                stack.splice(i, 1);\n                if (stack.length) {\n                    stack[stack.length - 1]._enable();\n                }\n            }\n        };\n        return FocusTrapManager;\n    }());\n    FocusTrapManager.ɵprov = i0.ɵɵdefineInjectable({ factory: function FocusTrapManager_Factory() { return new FocusTrapManager(); }, token: FocusTrapManager, providedIn: \"root\" });\n    FocusTrapManager.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\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    /** Factory that allows easy instantiation of configurable focus traps. */\n    var ConfigurableFocusTrapFactory = /** @class */ (function () {\n        function ConfigurableFocusTrapFactory(_checker, _ngZone, _focusTrapManager, _document, _inertStrategy) {\n            this._checker = _checker;\n            this._ngZone = _ngZone;\n            this._focusTrapManager = _focusTrapManager;\n            this._document = _document;\n            // TODO split up the strategies into different modules, similar to DateAdapter.\n            this._inertStrategy = _inertStrategy || new EventListenerFocusTrapInertStrategy();\n        }\n        ConfigurableFocusTrapFactory.prototype.create = function (element, config) {\n            if (config === void 0) { config = new ConfigurableFocusTrapConfig(); }\n            var configObject;\n            if (typeof config === 'boolean') {\n                configObject = new ConfigurableFocusTrapConfig();\n                configObject.defer = config;\n            }\n            else {\n                configObject = config;\n            }\n            return new ConfigurableFocusTrap(element, this._checker, this._ngZone, this._document, this._focusTrapManager, this._inertStrategy, configObject);\n        };\n        return ConfigurableFocusTrapFactory;\n    }());\n    ConfigurableFocusTrapFactory.ɵprov = i0.ɵɵdefineInjectable({ factory: function ConfigurableFocusTrapFactory_Factory() { return new ConfigurableFocusTrapFactory(i0.ɵɵinject(InteractivityChecker), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(FocusTrapManager), i0.ɵɵinject(i2.DOCUMENT), i0.ɵɵinject(FOCUS_TRAP_INERT_STRATEGY, 8)); }, token: ConfigurableFocusTrapFactory, providedIn: \"root\" });\n    ConfigurableFocusTrapFactory.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    ConfigurableFocusTrapFactory.ctorParameters = function () { return [\n        { type: InteractivityChecker },\n        { type: i0.NgZone },\n        { type: FocusTrapManager },\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] },\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [FOCUS_TRAP_INERT_STRATEGY,] }] }\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    var LIVE_ANNOUNCER_ELEMENT_TOKEN = new i0.InjectionToken('liveAnnouncerElement', {\n        providedIn: 'root',\n        factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY,\n    });\n    /** @docs-private */\n    function LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY() {\n        return null;\n    }\n    /** Injection token that can be used to configure the default options for the LiveAnnouncer. */\n    var LIVE_ANNOUNCER_DEFAULT_OPTIONS = new i0.InjectionToken('LIVE_ANNOUNCER_DEFAULT_OPTIONS');\n\n    var LiveAnnouncer = /** @class */ (function () {\n        function LiveAnnouncer(elementToken, _ngZone, _document, _defaultOptions) {\n            this._ngZone = _ngZone;\n            this._defaultOptions = _defaultOptions;\n            // We inject the live element and document as `any` because the constructor signature cannot\n            // reference browser globals (HTMLElement, Document) on non-browser environments, since having\n            // a class decorator causes TypeScript to preserve the constructor signature types.\n            this._document = _document;\n            this._liveElement = elementToken || this._createLiveElement();\n        }\n        LiveAnnouncer.prototype.announce = function (message) {\n            var _a;\n            var _this = this;\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            var defaultOptions = this._defaultOptions;\n            var politeness;\n            var duration;\n            if (args.length === 1 && typeof args[0] === 'number') {\n                duration = args[0];\n            }\n            else {\n                _a = __read(args, 2), politeness = _a[0], duration = _a[1];\n            }\n            this.clear();\n            clearTimeout(this._previousTimeout);\n            if (!politeness) {\n                politeness =\n                    (defaultOptions && defaultOptions.politeness) ? defaultOptions.politeness : 'polite';\n            }\n            if (duration == null && defaultOptions) {\n                duration = defaultOptions.duration;\n            }\n            // TODO: ensure changing the politeness works on all environments we support.\n            this._liveElement.setAttribute('aria-live', politeness);\n            // This 100ms timeout is necessary for some browser + screen-reader combinations:\n            // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n            // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n            //   second time without clearing and then using a non-zero delay.\n            // (using JAWS 17 at time of this writing).\n            return this._ngZone.runOutsideAngular(function () {\n                return new Promise(function (resolve) {\n                    clearTimeout(_this._previousTimeout);\n                    _this._previousTimeout = setTimeout(function () {\n                        _this._liveElement.textContent = message;\n                        resolve();\n                        if (typeof duration === 'number') {\n                            _this._previousTimeout = setTimeout(function () { return _this.clear(); }, duration);\n                        }\n                    }, 100);\n                });\n            });\n        };\n        /**\n         * Clears the current text from the announcer element. Can be used to prevent\n         * screen readers from reading the text out again while the user is going\n         * through the page landmarks.\n         */\n        LiveAnnouncer.prototype.clear = function () {\n            if (this._liveElement) {\n                this._liveElement.textContent = '';\n            }\n        };\n        LiveAnnouncer.prototype.ngOnDestroy = function () {\n            clearTimeout(this._previousTimeout);\n            if (this._liveElement && this._liveElement.parentNode) {\n                this._liveElement.parentNode.removeChild(this._liveElement);\n                this._liveElement = null;\n            }\n        };\n        LiveAnnouncer.prototype._createLiveElement = function () {\n            var elementClass = 'cdk-live-announcer-element';\n            var previousElements = this._document.getElementsByClassName(elementClass);\n            var liveEl = this._document.createElement('div');\n            // Remove any old containers. This can happen when coming in from a server-side-rendered page.\n            for (var i = 0; i < previousElements.length; i++) {\n                previousElements[i].parentNode.removeChild(previousElements[i]);\n            }\n            liveEl.classList.add(elementClass);\n            liveEl.classList.add('cdk-visually-hidden');\n            liveEl.setAttribute('aria-atomic', 'true');\n            liveEl.setAttribute('aria-live', 'polite');\n            this._document.body.appendChild(liveEl);\n            return liveEl;\n        };\n        return LiveAnnouncer;\n    }());\n    LiveAnnouncer.ɵprov = i0.ɵɵdefineInjectable({ factory: function LiveAnnouncer_Factory() { return new LiveAnnouncer(i0.ɵɵinject(LIVE_ANNOUNCER_ELEMENT_TOKEN, 8), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i2.DOCUMENT), i0.ɵɵinject(LIVE_ANNOUNCER_DEFAULT_OPTIONS, 8)); }, token: LiveAnnouncer, providedIn: \"root\" });\n    LiveAnnouncer.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    LiveAnnouncer.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [LIVE_ANNOUNCER_ELEMENT_TOKEN,] }] },\n        { type: i0.NgZone },\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] },\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [LIVE_ANNOUNCER_DEFAULT_OPTIONS,] }] }\n    ]; };\n    /**\n     * A directive that works similarly to aria-live, but uses the LiveAnnouncer to ensure compatibility\n     * with a wider range of browsers and screen readers.\n     */\n    var CdkAriaLive = /** @class */ (function () {\n        function CdkAriaLive(_elementRef, _liveAnnouncer, _contentObserver, _ngZone) {\n            this._elementRef = _elementRef;\n            this._liveAnnouncer = _liveAnnouncer;\n            this._contentObserver = _contentObserver;\n            this._ngZone = _ngZone;\n            this._politeness = 'polite';\n        }\n        Object.defineProperty(CdkAriaLive.prototype, \"politeness\", {\n            /** The aria-live politeness level to use when announcing messages. */\n            get: function () { return this._politeness; },\n            set: function (value) {\n                var _this = this;\n                this._politeness = value === 'off' || value === 'assertive' ? value : 'polite';\n                if (this._politeness === 'off') {\n                    if (this._subscription) {\n                        this._subscription.unsubscribe();\n                        this._subscription = null;\n                    }\n                }\n                else if (!this._subscription) {\n                    this._subscription = this._ngZone.runOutsideAngular(function () {\n                        return _this._contentObserver\n                            .observe(_this._elementRef)\n                            .subscribe(function () {\n                            // Note that we use textContent here, rather than innerText, in order to avoid a reflow.\n                            var elementText = _this._elementRef.nativeElement.textContent;\n                            // The `MutationObserver` fires also for attribute\n                            // changes which we don't want to announce.\n                            if (elementText !== _this._previousAnnouncedText) {\n                                _this._liveAnnouncer.announce(elementText, _this._politeness);\n                                _this._previousAnnouncedText = elementText;\n                            }\n                        });\n                    });\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        CdkAriaLive.prototype.ngOnDestroy = function () {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n            }\n        };\n        return CdkAriaLive;\n    }());\n    CdkAriaLive.decorators = [\n        { type: i0.Directive, args: [{\n                    selector: '[cdkAriaLive]',\n                    exportAs: 'cdkAriaLive',\n                },] }\n    ];\n    CdkAriaLive.ctorParameters = function () { return [\n        { type: i0.ElementRef },\n        { type: LiveAnnouncer },\n        { type: observers.ContentObserver },\n        { type: i0.NgZone }\n    ]; };\n    CdkAriaLive.propDecorators = {\n        politeness: [{ type: i0.Input, args: ['cdkAriaLive',] }]\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    /** Gets whether an event could be a faked `mousedown` event dispatched by a screen reader. */\n    function isFakeMousedownFromScreenReader(event) {\n        // We can typically distinguish between these faked mousedown events and real mousedown events\n        // using the \"buttons\" property. While real mousedowns will indicate the mouse button that was\n        // pressed (e.g. \"1\" for the left mouse button), faked mousedowns will usually set the property\n        // value to 0.\n        return event.buttons === 0;\n    }\n    /** Gets whether an event could be a faked `touchstart` event dispatched by a screen reader. */\n    function isFakeTouchstartFromScreenReader(event) {\n        var touch = (event.touches && event.touches[0]) ||\n            (event.changedTouches && event.changedTouches[0]);\n        // A fake `touchstart` can be distinguished from a real one by looking at the `identifier`\n        // which is typically >= 0 on a real device versus -1 from a screen reader. Just to be safe,\n        // we can also look at `radiusX` and `radiusY`. This behavior was observed against a Windows 10\n        // device with a touch screen running NVDA v2020.4 and Firefox 85 or Chrome 88.\n        return !!touch && touch.identifier === -1 && (touch.radiusX == null || touch.radiusX === 1) &&\n            (touch.radiusY == null || touch.radiusY === 1);\n    }\n\n    // This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found\n    // that a value of around 650ms seems appropriate.\n    var TOUCH_BUFFER_MS = 650;\n    /** InjectionToken for FocusMonitorOptions. */\n    var FOCUS_MONITOR_DEFAULT_OPTIONS = new i0.InjectionToken('cdk-focus-monitor-default-options');\n    /**\n     * Event listener options that enable capturing and also\n     * mark the listener as passive if the browser supports it.\n     */\n    var captureEventListenerOptions = i1.normalizePassiveListenerOptions({\n        passive: true,\n        capture: true\n    });\n    /** Monitors mouse and keyboard events to determine the cause of focus events. */\n    var FocusMonitor = /** @class */ (function () {\n        function FocusMonitor(_ngZone, _platform, \n        /** @breaking-change 11.0.0 make document required */\n        document, options) {\n            var _this = this;\n            this._ngZone = _ngZone;\n            this._platform = _platform;\n            /** The focus origin that the next focus event is a result of. */\n            this._origin = null;\n            /** Whether the window has just been focused. */\n            this._windowFocused = false;\n            /** Map of elements being monitored to their info. */\n            this._elementInfo = new Map();\n            /** The number of elements currently being monitored. */\n            this._monitoredElementCount = 0;\n            /**\n             * Keeps track of the root nodes to which we've currently bound a focus/blur handler,\n             * as well as the number of monitored elements that they contain. We have to treat focus/blur\n             * handlers differently from the rest of the events, because the browser won't emit events\n             * to the document when focus moves inside of a shadow root.\n             */\n            this._rootNodeFocusListenerCount = new Map();\n            /**\n             * Event listener for `keydown` events on the document.\n             * Needs to be an arrow function in order to preserve the context when it gets bound.\n             */\n            this._documentKeydownListener = function () {\n                // On keydown record the origin and clear any touch event that may be in progress.\n                _this._lastTouchTarget = null;\n                _this._setOriginForCurrentEventQueue('keyboard');\n            };\n            /**\n             * Event listener for `mousedown` events on the document.\n             * Needs to be an arrow function in order to preserve the context when it gets bound.\n             */\n            this._documentMousedownListener = function (event) {\n                // On mousedown record the origin only if there is not touch\n                // target, since a mousedown can happen as a result of a touch event.\n                if (!_this._lastTouchTarget) {\n                    // In some cases screen readers fire fake `mousedown` events instead of `keydown`.\n                    // Resolve the focus source to `keyboard` if we detect one of them.\n                    var source = isFakeMousedownFromScreenReader(event) ? 'keyboard' : 'mouse';\n                    _this._setOriginForCurrentEventQueue(source);\n                }\n            };\n            /**\n             * Event listener for `touchstart` events on the document.\n             * Needs to be an arrow function in order to preserve the context when it gets bound.\n             */\n            this._documentTouchstartListener = function (event) {\n                // Some screen readers will fire a fake `touchstart` event if an element is activated using\n                // the keyboard while on a device with a touchsreen. Consider such events as keyboard focus.\n                if (!isFakeTouchstartFromScreenReader(event)) {\n                    // When the touchstart event fires the focus event is not yet in the event queue. This means\n                    // we can't rely on the trick used above (setting timeout of 1ms). Instead we wait 650ms to\n                    // see if a focus happens.\n                    if (_this._touchTimeoutId != null) {\n                        clearTimeout(_this._touchTimeoutId);\n                    }\n                    _this._lastTouchTarget = getTarget(event);\n                    _this._touchTimeoutId = setTimeout(function () { return _this._lastTouchTarget = null; }, TOUCH_BUFFER_MS);\n                }\n                else if (!_this._lastTouchTarget) {\n                    _this._setOriginForCurrentEventQueue('keyboard');\n                }\n            };\n            /**\n             * Event listener for `focus` events on the window.\n             * Needs to be an arrow function in order to preserve the context when it gets bound.\n             */\n            this._windowFocusListener = function () {\n                // Make a note of when the window regains focus, so we can\n                // restore the origin info for the focused element.\n                _this._windowFocused = true;\n                _this._windowFocusTimeoutId = setTimeout(function () { return _this._windowFocused = false; });\n            };\n            /**\n             * Event listener for `focus` and 'blur' events on the document.\n             * Needs to be an arrow function in order to preserve the context when it gets bound.\n             */\n            this._rootNodeFocusAndBlurListener = function (event) {\n                var target = getTarget(event);\n                var handler = event.type === 'focus' ? _this._onFocus : _this._onBlur;\n                // We need to walk up the ancestor chain in order to support `checkChildren`.\n                for (var element = target; element; element = element.parentElement) {\n                    handler.call(_this, event, element);\n                }\n            };\n            this._document = document;\n            this._detectionMode = (options === null || options === void 0 ? void 0 : options.detectionMode) || 0 /* IMMEDIATE */;\n        }\n        FocusMonitor.prototype.monitor = function (element, checkChildren) {\n            if (checkChildren === void 0) { checkChildren = false; }\n            var nativeElement = coercion.coerceElement(element);\n            // Do nothing if we're not on the browser platform or the passed in node isn't an element.\n            if (!this._platform.isBrowser || nativeElement.nodeType !== 1) {\n                return rxjs.of(null);\n            }\n            // If the element is inside the shadow DOM, we need to bind our focus/blur listeners to\n            // the shadow root, rather than the `document`, because the browser won't emit focus events\n            // to the `document`, if focus is moving within the same shadow root.\n            var rootNode = i1._getShadowRoot(nativeElement) || this._getDocument();\n            var cachedInfo = this._elementInfo.get(nativeElement);\n            // Check if we're already monitoring this element.\n            if (cachedInfo) {\n                if (checkChildren) {\n                    // TODO(COMP-318): this can be problematic, because it'll turn all non-checkChildren\n                    // observers into ones that behave as if `checkChildren` was turned on. We need a more\n                    // robust solution.\n                    cachedInfo.checkChildren = true;\n                }\n                return cachedInfo.subject;\n            }\n            // Create monitored element info.\n            var info = {\n                checkChildren: checkChildren,\n                subject: new rxjs.Subject(),\n                rootNode: rootNode\n            };\n            this._elementInfo.set(nativeElement, info);\n            this._registerGlobalListeners(info);\n            return info.subject;\n        };\n        FocusMonitor.prototype.stopMonitoring = function (element) {\n            var nativeElement = coercion.coerceElement(element);\n            var elementInfo = this._elementInfo.get(nativeElement);\n            if (elementInfo) {\n                elementInfo.subject.complete();\n                this._setClasses(nativeElement);\n                this._elementInfo.delete(nativeElement);\n                this._removeGlobalListeners(elementInfo);\n            }\n        };\n        FocusMonitor.prototype.focusVia = function (element, origin, options) {\n            var _this = this;\n            var nativeElement = coercion.coerceElement(element);\n            var focusedElement = this._getDocument().activeElement;\n            // If the element is focused already, calling `focus` again won't trigger the event listener\n            // which means that the focus classes won't be updated. If that's the case, update the classes\n            // directly without waiting for an event.\n            if (nativeElement === focusedElement) {\n                this._getClosestElementsInfo(nativeElement)\n                    .forEach(function (_a) {\n                    var _b = __read(_a, 2), currentElement = _b[0], info = _b[1];\n                    return _this._originChanged(currentElement, origin, info);\n                });\n            }\n            else {\n                this._setOriginForCurrentEventQueue(origin);\n                // `focus` isn't available on the server\n                if (typeof nativeElement.focus === 'function') {\n                    nativeElement.focus(options);\n                }\n            }\n        };\n        FocusMonitor.prototype.ngOnDestroy = function () {\n            var _this = this;\n            this._elementInfo.forEach(function (_info, element) { return _this.stopMonitoring(element); });\n        };\n        /** Access injected document if available or fallback to global document reference */\n        FocusMonitor.prototype._getDocument = function () {\n            return this._document || document;\n        };\n        /** Use defaultView of injected document if available or fallback to global window reference */\n        FocusMonitor.prototype._getWindow = function () {\n            var doc = this._getDocument();\n            return doc.defaultView || window;\n        };\n        FocusMonitor.prototype._toggleClass = function (element, className, shouldSet) {\n            if (shouldSet) {\n                element.classList.add(className);\n            }\n            else {\n                element.classList.remove(className);\n            }\n        };\n        FocusMonitor.prototype._getFocusOrigin = function (event) {\n            // If we couldn't detect a cause for the focus event, it's due to one of three reasons:\n            // 1) The window has just regained focus, in which case we want to restore the focused state of\n            //    the element from before the window blurred.\n            // 2) It was caused by a touch event, in which case we mark the origin as 'touch'.\n            // 3) The element was programmatically focused, in which case we should mark the origin as\n            //    'program'.\n            if (this._origin) {\n                return this._origin;\n            }\n            if (this._windowFocused && this._lastFocusOrigin) {\n                return this._lastFocusOrigin;\n            }\n            else if (this._wasCausedByTouch(event)) {\n                return 'touch';\n            }\n            else {\n                return 'program';\n            }\n        };\n        /**\n         * Sets the focus classes on the element based on the given focus origin.\n         * @param element The element to update the classes on.\n         * @param origin The focus origin.\n         */\n        FocusMonitor.prototype._setClasses = function (element, origin) {\n            this._toggleClass(element, 'cdk-focused', !!origin);\n            this._toggleClass(element, 'cdk-touch-focused', origin === 'touch');\n            this._toggleClass(element, 'cdk-keyboard-focused', origin === 'keyboard');\n            this._toggleClass(element, 'cdk-mouse-focused', origin === 'mouse');\n            this._toggleClass(element, 'cdk-program-focused', origin === 'program');\n        };\n        /**\n         * Sets the origin and schedules an async function to clear it at the end of the event queue.\n         * If the detection mode is 'eventual', the origin is never cleared.\n         * @param origin The origin to set.\n         */\n        FocusMonitor.prototype._setOriginForCurrentEventQueue = function (origin) {\n            var _this = this;\n            this._ngZone.runOutsideAngular(function () {\n                _this._origin = origin;\n                if (_this._detectionMode === 0 /* IMMEDIATE */) {\n                    // Sometimes the focus origin won't be valid in Firefox because Firefox seems to focus *one*\n                    // tick after the interaction event fired. To ensure the focus origin is always correct,\n                    // the focus origin will be determined at the beginning of the next tick.\n                    _this._originTimeoutId = setTimeout(function () { return _this._origin = null; }, 1);\n                }\n            });\n        };\n        /**\n         * Checks whether the given focus event was caused by a touchstart event.\n         * @param event The focus event to check.\n         * @returns Whether the event was caused by a touch.\n         */\n        FocusMonitor.prototype._wasCausedByTouch = function (event) {\n            // Note(mmalerba): This implementation is not quite perfect, there is a small edge case.\n            // Consider the following dom structure:\n            //\n            // <div #parent tabindex=\"0\" cdkFocusClasses>\n            //   <div #child (click)=\"#parent.focus()\"></div>\n            // </div>\n            //\n            // If the user touches the #child element and the #parent is programmatically focused as a\n            // result, this code will still consider it to have been caused by the touch event and will\n            // apply the cdk-touch-focused class rather than the cdk-program-focused class. This is a\n            // relatively small edge-case that can be worked around by using\n            // focusVia(parentEl, 'program') to focus the parent element.\n            //\n            // If we decide that we absolutely must handle this case correctly, we can do so by listening\n            // for the first focus event after the touchstart, and then the first blur event after that\n            // focus event. When that blur event fires we know that whatever follows is not a result of the\n            // touchstart.\n            var focusTarget = getTarget(event);\n            return this._lastTouchTarget instanceof Node && focusTarget instanceof Node &&\n                (focusTarget === this._lastTouchTarget || focusTarget.contains(this._lastTouchTarget));\n        };\n        /**\n         * Handles focus events on a registered element.\n         * @param event The focus event.\n         * @param element The monitored element.\n         */\n        FocusMonitor.prototype._onFocus = function (event, element) {\n            // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent\n            // focus event affecting the monitored element. If we want to use the origin of the first event\n            // instead we should check for the cdk-focused class here and return if the element already has\n            // it. (This only matters for elements that have includesChildren = true).\n            // If we are not counting child-element-focus as focused, make sure that the event target is the\n            // monitored element itself.\n            var elementInfo = this._elementInfo.get(element);\n            if (!elementInfo || (!elementInfo.checkChildren && element !== getTarget(event))) {\n                return;\n            }\n            this._originChanged(element, this._getFocusOrigin(event), elementInfo);\n        };\n        /**\n         * Handles blur events on a registered element.\n         * @param event The blur event.\n         * @param element The monitored element.\n         */\n        FocusMonitor.prototype._onBlur = function (event, element) {\n            // If we are counting child-element-focus as focused, make sure that we aren't just blurring in\n            // order to focus another child of the monitored element.\n            var elementInfo = this._elementInfo.get(element);\n            if (!elementInfo || (elementInfo.checkChildren && event.relatedTarget instanceof Node &&\n                element.contains(event.relatedTarget))) {\n                return;\n            }\n            this._setClasses(element);\n            this._emitOrigin(elementInfo.subject, null);\n        };\n        FocusMonitor.prototype._emitOrigin = function (subject, origin) {\n            this._ngZone.run(function () { return subject.next(origin); });\n        };\n        FocusMonitor.prototype._registerGlobalListeners = function (elementInfo) {\n            var _this = this;\n            if (!this._platform.isBrowser) {\n                return;\n            }\n            var rootNode = elementInfo.rootNode;\n            var rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode) || 0;\n            if (!rootNodeFocusListeners) {\n                this._ngZone.runOutsideAngular(function () {\n                    rootNode.addEventListener('focus', _this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n                    rootNode.addEventListener('blur', _this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n                });\n            }\n            this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners + 1);\n            // Register global listeners when first element is monitored.\n            if (++this._monitoredElementCount === 1) {\n                // Note: we listen to events in the capture phase so we\n                // can detect them even if the user stops propagation.\n                this._ngZone.runOutsideAngular(function () {\n                    var document = _this._getDocument();\n                    var window = _this._getWindow();\n                    document.addEventListener('keydown', _this._documentKeydownListener, captureEventListenerOptions);\n                    document.addEventListener('mousedown', _this._documentMousedownListener, captureEventListenerOptions);\n                    document.addEventListener('touchstart', _this._documentTouchstartListener, captureEventListenerOptions);\n                    window.addEventListener('focus', _this._windowFocusListener);\n                });\n            }\n        };\n        FocusMonitor.prototype._removeGlobalListeners = function (elementInfo) {\n            var rootNode = elementInfo.rootNode;\n            if (this._rootNodeFocusListenerCount.has(rootNode)) {\n                var rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode);\n                if (rootNodeFocusListeners > 1) {\n                    this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners - 1);\n                }\n                else {\n                    rootNode.removeEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n                    rootNode.removeEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n                    this._rootNodeFocusListenerCount.delete(rootNode);\n                }\n            }\n            // Unregister global listeners when last element is unmonitored.\n            if (!--this._monitoredElementCount) {\n                var document = this._getDocument();\n                var window = this._getWindow();\n                document.removeEventListener('keydown', this._documentKeydownListener, captureEventListenerOptions);\n                document.removeEventListener('mousedown', this._documentMousedownListener, captureEventListenerOptions);\n                document.removeEventListener('touchstart', this._documentTouchstartListener, captureEventListenerOptions);\n                window.removeEventListener('focus', this._windowFocusListener);\n                // Clear timeouts for all potentially pending timeouts to prevent the leaks.\n                clearTimeout(this._windowFocusTimeoutId);\n                clearTimeout(this._touchTimeoutId);\n                clearTimeout(this._originTimeoutId);\n            }\n        };\n        /** Updates all the state on an element once its focus origin has changed. */\n        FocusMonitor.prototype._originChanged = function (element, origin, elementInfo) {\n            this._setClasses(element, origin);\n            this._emitOrigin(elementInfo.subject, origin);\n            this._lastFocusOrigin = origin;\n        };\n        /**\n         * Collects the `MonitoredElementInfo` of a particular element and\n         * all of its ancestors that have enabled `checkChildren`.\n         * @param element Element from which to start the search.\n         */\n        FocusMonitor.prototype._getClosestElementsInfo = function (element) {\n            var results = [];\n            this._elementInfo.forEach(function (info, currentElement) {\n                if (currentElement === element || (info.checkChildren && currentElement.contains(element))) {\n                    results.push([currentElement, info]);\n                }\n            });\n            return results;\n        };\n        return FocusMonitor;\n    }());\n    FocusMonitor.ɵprov = i0.ɵɵdefineInjectable({ factory: function FocusMonitor_Factory() { return new FocusMonitor(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i2.DOCUMENT, 8), i0.ɵɵinject(FOCUS_MONITOR_DEFAULT_OPTIONS, 8)); }, token: FocusMonitor, providedIn: \"root\" });\n    FocusMonitor.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    FocusMonitor.ctorParameters = function () { return [\n        { type: i0.NgZone },\n        { type: i1.Platform },\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [i2.DOCUMENT,] }] },\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [FOCUS_MONITOR_DEFAULT_OPTIONS,] }] }\n    ]; };\n    /** Gets the target of an event, accounting for Shadow DOM. */\n    function getTarget(event) {\n        // If an event is bound outside the Shadow DOM, the `event.target` will\n        // point to the shadow root so we have to use `composedPath` instead.\n        return (event.composedPath ? event.composedPath()[0] : event.target);\n    }\n    /**\n     * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or\n     * programmatically) and adds corresponding classes to the element.\n     *\n     * There are two variants of this directive:\n     * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is\n     *    focused.\n     * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.\n     */\n    var CdkMonitorFocus = /** @class */ (function () {\n        function CdkMonitorFocus(_elementRef, _focusMonitor) {\n            this._elementRef = _elementRef;\n            this._focusMonitor = _focusMonitor;\n            this.cdkFocusChange = new i0.EventEmitter();\n        }\n        CdkMonitorFocus.prototype.ngAfterViewInit = function () {\n            var _this = this;\n            var element = this._elementRef.nativeElement;\n            this._monitorSubscription = this._focusMonitor.monitor(element, element.nodeType === 1 && element.hasAttribute('cdkMonitorSubtreeFocus'))\n                .subscribe(function (origin) { return _this.cdkFocusChange.emit(origin); });\n        };\n        CdkMonitorFocus.prototype.ngOnDestroy = function () {\n            this._focusMonitor.stopMonitoring(this._elementRef);\n            if (this._monitorSubscription) {\n                this._monitorSubscription.unsubscribe();\n            }\n        };\n        return CdkMonitorFocus;\n    }());\n    CdkMonitorFocus.decorators = [\n        { type: i0.Directive, args: [{\n                    selector: '[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]',\n                },] }\n    ];\n    CdkMonitorFocus.ctorParameters = function () { return [\n        { type: i0.ElementRef },\n        { type: FocusMonitor }\n    ]; };\n    CdkMonitorFocus.propDecorators = {\n        cdkFocusChange: [{ type: i0.Output }]\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    /** CSS class applied to the document body when in black-on-white high-contrast mode. */\n    var BLACK_ON_WHITE_CSS_CLASS = 'cdk-high-contrast-black-on-white';\n    /** CSS class applied to the document body when in white-on-black high-contrast mode. */\n    var WHITE_ON_BLACK_CSS_CLASS = 'cdk-high-contrast-white-on-black';\n    /** CSS class applied to the document body when in high-contrast mode. */\n    var HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS = 'cdk-high-contrast-active';\n    /**\n     * Service to determine whether the browser is currently in a high-contrast-mode environment.\n     *\n     * Microsoft Windows supports an accessibility feature called \"High Contrast Mode\". This mode\n     * changes the appearance of all applications, including web applications, to dramatically increase\n     * contrast.\n     *\n     * IE, Edge, and Firefox currently support this mode. Chrome does not support Windows High Contrast\n     * Mode. This service does not detect high-contrast mode as added by the Chrome \"High Contrast\"\n     * browser extension.\n     */\n    var HighContrastModeDetector = /** @class */ (function () {\n        function HighContrastModeDetector(_platform, document) {\n            this._platform = _platform;\n            this._document = document;\n        }\n        /** Gets the current high-contrast-mode for the page. */\n        HighContrastModeDetector.prototype.getHighContrastMode = function () {\n            if (!this._platform.isBrowser) {\n                return 0 /* NONE */;\n            }\n            // Create a test element with an arbitrary background-color that is neither black nor\n            // white; high-contrast mode will coerce the color to either black or white. Also ensure that\n            // appending the test element to the DOM does not affect layout by absolutely positioning it\n            var testElement = this._document.createElement('div');\n            testElement.style.backgroundColor = 'rgb(1,2,3)';\n            testElement.style.position = 'absolute';\n            this._document.body.appendChild(testElement);\n            // Get the computed style for the background color, collapsing spaces to normalize between\n            // browsers. Once we get this color, we no longer need the test element. Access the `window`\n            // via the document so we can fake it in tests. Note that we have extra null checks, because\n            // this logic will likely run during app bootstrap and throwing can break the entire app.\n            var documentWindow = this._document.defaultView || window;\n            var computedStyle = (documentWindow && documentWindow.getComputedStyle) ?\n                documentWindow.getComputedStyle(testElement) : null;\n            var computedColor = (computedStyle && computedStyle.backgroundColor || '').replace(/ /g, '');\n            this._document.body.removeChild(testElement);\n            switch (computedColor) {\n                case 'rgb(0,0,0)': return 2 /* WHITE_ON_BLACK */;\n                case 'rgb(255,255,255)': return 1 /* BLACK_ON_WHITE */;\n            }\n            return 0 /* NONE */;\n        };\n        /** Applies CSS classes indicating high-contrast mode to document body (browser-only). */\n        HighContrastModeDetector.prototype._applyBodyHighContrastModeCssClasses = function () {\n            if (this._platform.isBrowser && this._document.body) {\n                var bodyClasses = this._document.body.classList;\n                // IE11 doesn't support `classList` operations with multiple arguments\n                bodyClasses.remove(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n                bodyClasses.remove(BLACK_ON_WHITE_CSS_CLASS);\n                bodyClasses.remove(WHITE_ON_BLACK_CSS_CLASS);\n                var mode = this.getHighContrastMode();\n                if (mode === 1 /* BLACK_ON_WHITE */) {\n                    bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n                    bodyClasses.add(BLACK_ON_WHITE_CSS_CLASS);\n                }\n                else if (mode === 2 /* WHITE_ON_BLACK */) {\n                    bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n                    bodyClasses.add(WHITE_ON_BLACK_CSS_CLASS);\n                }\n            }\n        };\n        return HighContrastModeDetector;\n    }());\n    HighContrastModeDetector.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighContrastModeDetector_Factory() { return new HighContrastModeDetector(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i2.DOCUMENT)); }, token: HighContrastModeDetector, providedIn: \"root\" });\n    HighContrastModeDetector.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    HighContrastModeDetector.ctorParameters = function () { return [\n        { type: i1.Platform },\n        { type: undefined, decorators: [{ type: i0.Inject, args: [i2.DOCUMENT,] }] }\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    var A11yModule = /** @class */ (function () {\n        function A11yModule(highContrastModeDetector) {\n            highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n        }\n        return A11yModule;\n    }());\n    A11yModule.decorators = [\n        { type: i0.NgModule, args: [{\n                    imports: [i1.PlatformModule, observers.ObserversModule],\n                    declarations: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n                    exports: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n                },] }\n    ];\n    A11yModule.ctorParameters = function () { return [\n        { type: HighContrastModeDetector }\n    ]; };\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    exports.A11yModule = A11yModule;\n    exports.ActiveDescendantKeyManager = ActiveDescendantKeyManager;\n    exports.AriaDescriber = AriaDescriber;\n    exports.CDK_DESCRIBEDBY_HOST_ATTRIBUTE = CDK_DESCRIBEDBY_HOST_ATTRIBUTE;\n    exports.CDK_DESCRIBEDBY_ID_PREFIX = CDK_DESCRIBEDBY_ID_PREFIX;\n    exports.CdkAriaLive = CdkAriaLive;\n    exports.CdkMonitorFocus = CdkMonitorFocus;\n    exports.CdkTrapFocus = CdkTrapFocus;\n    exports.ConfigurableFocusTrap = ConfigurableFocusTrap;\n    exports.ConfigurableFocusTrapFactory = ConfigurableFocusTrapFactory;\n    exports.EventListenerFocusTrapInertStrategy = EventListenerFocusTrapInertStrategy;\n    exports.FOCUS_MONITOR_DEFAULT_OPTIONS = FOCUS_MONITOR_DEFAULT_OPTIONS;\n    exports.FOCUS_TRAP_INERT_STRATEGY = FOCUS_TRAP_INERT_STRATEGY;\n    exports.FocusKeyManager = FocusKeyManager;\n    exports.FocusMonitor = FocusMonitor;\n    exports.FocusTrap = FocusTrap;\n    exports.FocusTrapFactory = FocusTrapFactory;\n    exports.HighContrastModeDetector = HighContrastModeDetector;\n    exports.InteractivityChecker = InteractivityChecker;\n    exports.IsFocusableConfig = IsFocusableConfig;\n    exports.LIVE_ANNOUNCER_DEFAULT_OPTIONS = LIVE_ANNOUNCER_DEFAULT_OPTIONS;\n    exports.LIVE_ANNOUNCER_ELEMENT_TOKEN = LIVE_ANNOUNCER_ELEMENT_TOKEN;\n    exports.LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY = LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY;\n    exports.ListKeyManager = ListKeyManager;\n    exports.LiveAnnouncer = LiveAnnouncer;\n    exports.MESSAGES_CONTAINER_ID = MESSAGES_CONTAINER_ID;\n    exports.TOUCH_BUFFER_MS = TOUCH_BUFFER_MS;\n    exports.isFakeMousedownFromScreenReader = isFakeMousedownFromScreenReader;\n    exports.isFakeTouchstartFromScreenReader = isFakeTouchstartFromScreenReader;\n    exports.ɵangular_material_src_cdk_a11y_a11y_a = FocusTrapManager;\n    exports.ɵangular_material_src_cdk_a11y_a11y_b = ConfigurableFocusTrapConfig;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=cdk-a11y.umd.js.map\n"]}