"use strict";
/**
 * @license Angular v12.0.0-next.0
 * (c) 2010-2020 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
!function(e){var n,o=null,c=null,t=!(!(n=e.wtf)||!(o=n.trace)||(c=o.events,0)),a=function(){function e(){this.name="WTF"}return e.prototype.onFork=function(n,o,c,t){var a=n.fork(c,t);return e.forkInstance(i(c),a.name),a},e.prototype.onInvoke=function(n,t,a,r,s,u,f){var l=f||"unknown",p=e.invokeScope[l];return p||(p=e.invokeScope[l]=c.createScope("Zone:invoke:"+f+"(ascii zone)")),o.leaveScope(p(i(a)),n.invoke(a,r,s,u,f))},e.prototype.onHandleError=function(e,n,o,c){return e.handleError(o,c)},e.prototype.onScheduleTask=function(n,o,t,a){var s=a.type+":"+a.source,u=e.scheduleInstance[s];u||(u=e.scheduleInstance[s]=c.createInstance("Zone:schedule:"+s+"(ascii zone, any data)"));var f=n.scheduleTask(t,a);return u(i(t),r(a.data,2)),f},e.prototype.onInvokeTask=function(n,t,a,r,s,u){var f=r.source,l=e.invokeTaskScope[f];return l||(l=e.invokeTaskScope[f]=c.createScope("Zone:invokeTask:"+f+"(ascii zone)")),o.leaveScope(l(i(a)),n.invokeTask(a,r,s,u))},e.prototype.onCancelTask=function(n,o,t,a){var s=a.source,u=e.cancelInstance[s];u||(u=e.cancelInstance[s]=c.createInstance("Zone:cancel:"+s+"(ascii zone, any options)"));var f=n.cancelTask(t,a);return u(i(t),r(a.data,2)),f},e}();function r(e,n){if(!e||!n)return null;var o={};for(var c in e)if(e.hasOwnProperty(c)){var t=e[c];switch(typeof t){case"object":var a=t&&t.constructor&&t.constructor.name;t=a==Object.name?r(t,n-1):a;break;case"function":t=t.name||void 0}o[c]=t}return o}function i(e){for(var n=e.name,o=e.parent;null!=o;)n=o.name+"::"+n,o=o.parent;return n}a.forkInstance=t?c.createInstance("Zone:fork(ascii zone, ascii newZone)"):null,a.scheduleInstance={},a.cancelInstance={},a.invokeScope={},a.invokeTaskScope={},Zone.wtfZoneSpec=t?new a:null}("object"==typeof window&&window||"object"==typeof self&&self||global)}));