@angular/cdk 14.0.0-next.11 → 14.0.0-next.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/a11y/focus-monitor/focus-monitor.d.ts +1 -1
  2. package/a11y/focus-trap/focus-trap.d.ts +1 -1
  3. package/a11y/live-announcer/live-announcer.d.ts +1 -1
  4. package/accordion/accordion-item.d.ts +1 -1
  5. package/accordion/accordion.d.ts +1 -1
  6. package/bidi/dir.d.ts +1 -1
  7. package/clipboard/copy-to-clipboard.d.ts +1 -1
  8. package/dialog/dialog-config.d.ts +115 -0
  9. package/dialog/dialog-container.d.ts +95 -0
  10. package/dialog/dialog-injectors.d.ts +24 -0
  11. package/dialog/dialog-module.d.ts +10 -0
  12. package/dialog/dialog-ref.d.ts +64 -0
  13. package/dialog/dialog.d.ts +103 -0
  14. package/dialog/dialog_public_index.d.ts +4 -0
  15. package/dialog/index.d.ts +8 -0
  16. package/dialog/package.json +9 -0
  17. package/dialog/public-api.d.ts +13 -0
  18. package/drag-drop/directives/drag-handle.d.ts +1 -1
  19. package/drag-drop/directives/drag-placeholder.d.ts +1 -1
  20. package/drag-drop/directives/drag-preview.d.ts +1 -1
  21. package/drag-drop/directives/drag.d.ts +8 -9
  22. package/drag-drop/directives/drop-list-group.d.ts +1 -1
  23. package/drag-drop/directives/drop-list.d.ts +1 -1
  24. package/esm2020/a11y/a11y-module.mjs +4 -4
  25. package/esm2020/a11y/aria-describer/aria-describer.mjs +3 -3
  26. package/esm2020/a11y/focus-monitor/focus-monitor.mjs +6 -6
  27. package/esm2020/a11y/focus-trap/configurable-focus-trap-factory.mjs +3 -3
  28. package/esm2020/a11y/focus-trap/focus-trap-manager.mjs +3 -3
  29. package/esm2020/a11y/focus-trap/focus-trap.mjs +6 -6
  30. package/esm2020/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +3 -3
  31. package/esm2020/a11y/input-modality/input-modality-detector.mjs +3 -3
  32. package/esm2020/a11y/interactivity-checker/interactivity-checker.mjs +3 -3
  33. package/esm2020/a11y/live-announcer/live-announcer.mjs +6 -6
  34. package/esm2020/accordion/accordion-item.mjs +3 -3
  35. package/esm2020/accordion/accordion-module.mjs +4 -4
  36. package/esm2020/accordion/accordion.mjs +3 -3
  37. package/esm2020/bidi/bidi-module.mjs +4 -4
  38. package/esm2020/bidi/dir.mjs +3 -3
  39. package/esm2020/bidi/directionality.mjs +3 -3
  40. package/esm2020/clipboard/clipboard-module.mjs +4 -4
  41. package/esm2020/clipboard/clipboard.mjs +3 -3
  42. package/esm2020/clipboard/copy-to-clipboard.mjs +3 -3
  43. package/esm2020/collections/unique-selection-dispatcher.mjs +3 -3
  44. package/esm2020/dialog/dialog-config.mjs +58 -0
  45. package/esm2020/dialog/dialog-container.mjs +265 -0
  46. package/esm2020/dialog/dialog-injectors.mjs +26 -0
  47. package/esm2020/dialog/dialog-module.mjs +42 -0
  48. package/esm2020/dialog/dialog-ref.mjs +76 -0
  49. package/esm2020/dialog/dialog.mjs +285 -0
  50. package/esm2020/dialog/dialog_public_index.mjs +5 -0
  51. package/esm2020/dialog/index.mjs +9 -0
  52. package/esm2020/dialog/public-api.mjs +14 -0
  53. package/esm2020/drag-drop/directives/drag-handle.mjs +3 -3
  54. package/esm2020/drag-drop/directives/drag-placeholder.mjs +3 -3
  55. package/esm2020/drag-drop/directives/drag-preview.mjs +3 -3
  56. package/esm2020/drag-drop/directives/drag.mjs +11 -4
  57. package/esm2020/drag-drop/directives/drop-list-group.mjs +3 -3
  58. package/esm2020/drag-drop/directives/drop-list.mjs +3 -3
  59. package/esm2020/drag-drop/drag-drop-module.mjs +4 -4
  60. package/esm2020/drag-drop/drag-drop-registry.mjs +3 -3
  61. package/esm2020/drag-drop/drag-drop.mjs +3 -3
  62. package/esm2020/layout/breakpoints-observer.mjs +3 -3
  63. package/esm2020/layout/layout-module.mjs +4 -4
  64. package/esm2020/layout/media-matcher.mjs +3 -3
  65. package/esm2020/menu/context-menu-trigger.mjs +227 -0
  66. package/esm2020/menu/index.mjs +9 -0
  67. package/esm2020/menu/menu-aim.mjs +204 -0
  68. package/esm2020/menu/menu-bar.mjs +159 -0
  69. package/esm2020/menu/menu-base.mjs +203 -0
  70. package/esm2020/menu/menu-errors.mjs +22 -0
  71. package/esm2020/menu/menu-group.mjs +30 -0
  72. package/esm2020/menu/menu-interface.mjs +11 -0
  73. package/esm2020/menu/menu-item-checkbox.mjs +48 -0
  74. package/esm2020/menu/menu-item-radio.mjs +114 -0
  75. package/esm2020/menu/menu-item-selectable.mjs +42 -0
  76. package/esm2020/menu/menu-item.mjs +289 -0
  77. package/esm2020/menu/menu-module.mjs +62 -0
  78. package/esm2020/menu/menu-stack.mjs +156 -0
  79. package/esm2020/menu/menu-trigger-base.mjs +114 -0
  80. package/esm2020/menu/menu-trigger.mjs +302 -0
  81. package/esm2020/menu/menu.mjs +168 -0
  82. package/esm2020/menu/menu_public_index.mjs +5 -0
  83. package/esm2020/menu/pointer-focus-tracker.mjs +51 -0
  84. package/esm2020/menu/public-api.mjs +24 -0
  85. package/esm2020/observers/observe-content.mjs +13 -13
  86. package/esm2020/overlay/dispatchers/base-overlay-dispatcher.mjs +3 -3
  87. package/esm2020/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +3 -3
  88. package/esm2020/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +3 -3
  89. package/esm2020/overlay/fullscreen-overlay-container.mjs +3 -3
  90. package/esm2020/overlay/overlay-container.mjs +3 -3
  91. package/esm2020/overlay/overlay-directives.mjs +6 -6
  92. package/esm2020/overlay/overlay-module.mjs +4 -4
  93. package/esm2020/overlay/overlay-ref.mjs +4 -3
  94. package/esm2020/overlay/overlay.mjs +3 -3
  95. package/esm2020/overlay/position/overlay-position-builder.mjs +3 -3
  96. package/esm2020/overlay/scroll/scroll-strategy-options.mjs +3 -3
  97. package/esm2020/platform/platform-module.mjs +4 -4
  98. package/esm2020/platform/platform.mjs +3 -3
  99. package/esm2020/portal/portal-directives.mjs +16 -16
  100. package/esm2020/scrolling/fixed-size-virtual-scroll.mjs +3 -3
  101. package/esm2020/scrolling/scroll-dispatcher.mjs +3 -3
  102. package/esm2020/scrolling/scrollable.mjs +3 -3
  103. package/esm2020/scrolling/scrolling-module.mjs +8 -8
  104. package/esm2020/scrolling/viewport-ruler.mjs +3 -3
  105. package/esm2020/scrolling/virtual-for-of.mjs +3 -3
  106. package/esm2020/scrolling/virtual-scroll-viewport.mjs +3 -3
  107. package/esm2020/stepper/step-header.mjs +3 -3
  108. package/esm2020/stepper/step-label.mjs +3 -3
  109. package/esm2020/stepper/stepper-button.mjs +6 -6
  110. package/esm2020/stepper/stepper-module.mjs +4 -4
  111. package/esm2020/stepper/stepper.mjs +6 -6
  112. package/esm2020/table/cell.mjs +21 -21
  113. package/esm2020/table/coalesced-style-scheduler.mjs +3 -3
  114. package/esm2020/table/row.mjs +28 -28
  115. package/esm2020/table/table-module.mjs +4 -4
  116. package/esm2020/table/table.mjs +20 -20
  117. package/esm2020/table/text-column.mjs +4 -4
  118. package/esm2020/text-field/autofill.mjs +6 -6
  119. package/esm2020/text-field/autosize.mjs +3 -3
  120. package/esm2020/text-field/text-field-module.mjs +4 -4
  121. package/esm2020/tree/nested-node.mjs +3 -3
  122. package/esm2020/tree/node.mjs +3 -3
  123. package/esm2020/tree/outlet.mjs +3 -3
  124. package/esm2020/tree/padding.mjs +3 -3
  125. package/esm2020/tree/toggle.mjs +3 -3
  126. package/esm2020/tree/tree-module.mjs +4 -4
  127. package/esm2020/tree/tree.mjs +6 -6
  128. package/esm2020/version.mjs +1 -1
  129. package/fesm2015/a11y.mjs +40 -40
  130. package/fesm2015/accordion.mjs +10 -10
  131. package/fesm2015/bidi.mjs +10 -10
  132. package/fesm2015/cdk.mjs +1 -1
  133. package/fesm2015/cdk.mjs.map +1 -1
  134. package/fesm2015/clipboard.mjs +10 -10
  135. package/fesm2015/collections.mjs +3 -3
  136. package/fesm2015/dialog.mjs +749 -0
  137. package/fesm2015/dialog.mjs.map +1 -0
  138. package/fesm2015/drag-drop.mjs +35 -28
  139. package/fesm2015/drag-drop.mjs.map +1 -1
  140. package/fesm2015/layout.mjs +10 -10
  141. package/fesm2015/menu.mjs +2131 -0
  142. package/fesm2015/menu.mjs.map +1 -0
  143. package/fesm2015/observers.mjs +13 -13
  144. package/fesm2015/overlay.mjs +37 -36
  145. package/fesm2015/overlay.mjs.map +1 -1
  146. package/fesm2015/platform.mjs +7 -7
  147. package/fesm2015/portal.mjs +16 -16
  148. package/fesm2015/scrolling.mjs +26 -26
  149. package/fesm2015/stepper.mjs +22 -22
  150. package/fesm2015/table.mjs +78 -78
  151. package/fesm2015/table.mjs.map +1 -1
  152. package/fesm2015/text-field.mjs +13 -13
  153. package/fesm2015/tree.mjs +25 -25
  154. package/fesm2015/tree.mjs.map +1 -1
  155. package/fesm2020/a11y.mjs +40 -40
  156. package/fesm2020/accordion.mjs +10 -10
  157. package/fesm2020/bidi.mjs +10 -10
  158. package/fesm2020/cdk.mjs +1 -1
  159. package/fesm2020/cdk.mjs.map +1 -1
  160. package/fesm2020/clipboard.mjs +10 -10
  161. package/fesm2020/collections.mjs +3 -3
  162. package/fesm2020/dialog.mjs +753 -0
  163. package/fesm2020/dialog.mjs.map +1 -0
  164. package/fesm2020/drag-drop.mjs +35 -28
  165. package/fesm2020/drag-drop.mjs.map +1 -1
  166. package/fesm2020/layout.mjs +10 -10
  167. package/fesm2020/menu.mjs +2104 -0
  168. package/fesm2020/menu.mjs.map +1 -0
  169. package/fesm2020/observers.mjs +13 -13
  170. package/fesm2020/overlay.mjs +37 -36
  171. package/fesm2020/overlay.mjs.map +1 -1
  172. package/fesm2020/platform.mjs +7 -7
  173. package/fesm2020/portal.mjs +16 -16
  174. package/fesm2020/scrolling.mjs +26 -26
  175. package/fesm2020/stepper.mjs +22 -22
  176. package/fesm2020/table.mjs +78 -78
  177. package/fesm2020/table.mjs.map +1 -1
  178. package/fesm2020/text-field.mjs +13 -13
  179. package/fesm2020/tree.mjs +25 -25
  180. package/fesm2020/tree.mjs.map +1 -1
  181. package/menu/context-menu-trigger.d.ts +98 -0
  182. package/menu/index.d.ts +8 -0
  183. package/menu/menu-aim.d.ts +107 -0
  184. package/menu/menu-bar.d.ts +52 -0
  185. package/menu/menu-base.d.ts +104 -0
  186. package/menu/menu-errors.d.ts +17 -0
  187. package/menu/menu-group.d.ts +8 -0
  188. package/menu/menu-interface.d.ts +25 -0
  189. package/menu/menu-item-checkbox.d.ts +18 -0
  190. package/menu/menu-item-radio.d.ts +59 -0
  191. package/menu/menu-item-selectable.d.ts +21 -0
  192. package/menu/menu-item.d.ts +140 -0
  193. package/menu/menu-module.d.ts +17 -0
  194. package/menu/menu-stack.d.ts +122 -0
  195. package/menu/menu-trigger-base.d.ts +77 -0
  196. package/menu/menu-trigger.d.ts +104 -0
  197. package/menu/menu.d.ts +60 -0
  198. package/menu/menu_public_index.d.ts +4 -0
  199. package/menu/package.json +9 -0
  200. package/menu/pointer-focus-tracker.d.ts +47 -0
  201. package/menu/public-api.d.ts +23 -0
  202. package/observers/observe-content.d.ts +1 -1
  203. package/overlay/overlay-directives.d.ts +2 -2
  204. package/package.json +17 -1
  205. package/portal/portal-directives.d.ts +4 -4
  206. package/schematics/ng-add/index.js +1 -1
  207. package/schematics/ng-add/index.mjs +1 -1
  208. package/scrolling/fixed-size-virtual-scroll.d.ts +1 -1
  209. package/scrolling/scrollable.d.ts +1 -1
  210. package/scrolling/virtual-for-of.d.ts +1 -1
  211. package/scrolling/virtual-scroll-viewport.d.ts +1 -1
  212. package/stepper/step-header.d.ts +1 -1
  213. package/stepper/step-label.d.ts +1 -1
  214. package/stepper/stepper-button.d.ts +2 -2
  215. package/stepper/stepper.d.ts +2 -2
  216. package/table/cell.d.ts +7 -7
  217. package/table/row.d.ts +9 -9
  218. package/table/table.d.ts +6 -6
  219. package/table/text-column.d.ts +1 -1
  220. package/text-field/autofill.d.ts +1 -1
  221. package/text-field/autosize.d.ts +1 -1
  222. package/tree/nested-node.d.ts +1 -1
  223. package/tree/node.d.ts +1 -1
  224. package/tree/outlet.d.ts +1 -1
  225. package/tree/padding.d.ts +1 -1
  226. package/tree/toggle.d.ts +1 -1
  227. package/tree/tree.d.ts +2 -2
@@ -0,0 +1,227 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { Directive, Inject, Injectable, Injector, Input, Optional, ViewContainerRef, } from '@angular/core';
9
+ import { Directionality } from '@angular/cdk/bidi';
10
+ import { Overlay, OverlayConfig, STANDARD_DROPDOWN_BELOW_POSITIONS, } from '@angular/cdk/overlay';
11
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
12
+ import { merge, partition } from 'rxjs';
13
+ import { skip, takeUntil } from 'rxjs/operators';
14
+ import { MENU_STACK, MenuStack } from './menu-stack';
15
+ import { CdkMenuTriggerBase, MENU_TRIGGER } from './menu-trigger-base';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/cdk/overlay";
18
+ import * as i2 from "@angular/cdk/bidi";
19
+ import * as i3 from "./menu-stack";
20
+ /** The preferred menu positions for the context menu. */
21
+ const CONTEXT_MENU_POSITIONS = STANDARD_DROPDOWN_BELOW_POSITIONS.map(position => {
22
+ // In cases where the first menu item in the context menu is a trigger the submenu opens on a
23
+ // hover event. We offset the context menu 2px by default to prevent this from occurring.
24
+ const offsetX = position.overlayX === 'start' ? 2 : -2;
25
+ const offsetY = position.overlayY === 'top' ? 2 : -2;
26
+ return { ...position, offsetX, offsetY };
27
+ });
28
+ /** Tracks the last open context menu trigger across the entire application. */
29
+ export class ContextMenuTracker {
30
+ /**
31
+ * Close the previous open context menu and set the given one as being open.
32
+ * @param trigger The trigger for the currently open Context Menu.
33
+ */
34
+ update(trigger) {
35
+ if (ContextMenuTracker._openContextMenuTrigger !== trigger) {
36
+ ContextMenuTracker._openContextMenuTrigger?.close();
37
+ ContextMenuTracker._openContextMenuTrigger = trigger;
38
+ }
39
+ }
40
+ }
41
+ ContextMenuTracker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: ContextMenuTracker, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
42
+ ContextMenuTracker.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: ContextMenuTracker, providedIn: 'root' });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: ContextMenuTracker, decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: 'root' }]
46
+ }] });
47
+ /**
48
+ * A directive that opens a menu when a user right-clicks within its host element.
49
+ * It is aware of nested context menus and will trigger only the lowest level non-disabled context menu.
50
+ */
51
+ export class CdkContextMenuTrigger extends CdkMenuTriggerBase {
52
+ constructor(
53
+ /** The DI injector for this component */
54
+ injector,
55
+ /** The view container ref for this component */
56
+ viewContainerRef,
57
+ /** The CDK overlay service */
58
+ _overlay,
59
+ /** The app's context menu tracking registry */
60
+ _contextMenuTracker,
61
+ /** The menu stack this menu is part of. */
62
+ menuStack,
63
+ /** The directionality of the current page */
64
+ _directionality) {
65
+ super(injector, viewContainerRef, menuStack);
66
+ this._overlay = _overlay;
67
+ this._contextMenuTracker = _contextMenuTracker;
68
+ this._directionality = _directionality;
69
+ this._disabled = false;
70
+ this._setMenuStackCloseListener();
71
+ }
72
+ /** Whether the context menu is disabled. */
73
+ get disabled() {
74
+ return this._disabled;
75
+ }
76
+ set disabled(value) {
77
+ this._disabled = coerceBooleanProperty(value);
78
+ }
79
+ /**
80
+ * Open the attached menu at the specified location.
81
+ * @param coordinates where to open the context menu
82
+ */
83
+ open(coordinates) {
84
+ this._open(coordinates, false);
85
+ }
86
+ /** Close the currently opened context menu. */
87
+ close() {
88
+ this.menuStack.closeAll();
89
+ }
90
+ /**
91
+ * Open the context menu and closes any previously open menus.
92
+ * @param event the mouse event which opens the context menu.
93
+ */
94
+ _openOnContextMenu(event) {
95
+ if (!this.disabled) {
96
+ // Prevent the native context menu from opening because we're opening a custom one.
97
+ event.preventDefault();
98
+ // Stop event propagation to ensure that only the closest enabled context menu opens.
99
+ // Otherwise, any context menus attached to containing elements would *also* open,
100
+ // resulting in multiple stacked context menus being displayed.
101
+ event.stopPropagation();
102
+ this._contextMenuTracker.update(this);
103
+ this._open({ x: event.clientX, y: event.clientY }, true);
104
+ // A context menu can be triggered via a mouse right click or a keyboard shortcut.
105
+ if (event.button === 2) {
106
+ this.childMenu?.focusFirstItem('mouse');
107
+ }
108
+ else if (event.button === 0) {
109
+ this.childMenu?.focusFirstItem('keyboard');
110
+ }
111
+ else {
112
+ this.childMenu?.focusFirstItem('program');
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Get the configuration object used to create the overlay.
118
+ * @param coordinates the location to place the opened menu
119
+ */
120
+ _getOverlayConfig(coordinates) {
121
+ return new OverlayConfig({
122
+ positionStrategy: this._getOverlayPositionStrategy(coordinates),
123
+ scrollStrategy: this._overlay.scrollStrategies.block(),
124
+ direction: this._directionality,
125
+ });
126
+ }
127
+ /**
128
+ * Get the position strategy for the overlay which specifies where to place the menu.
129
+ * @param coordinates the location to place the opened menu
130
+ */
131
+ _getOverlayPositionStrategy(coordinates) {
132
+ return this._overlay
133
+ .position()
134
+ .flexibleConnectedTo(coordinates)
135
+ .withPositions(this.menuPosition ?? CONTEXT_MENU_POSITIONS);
136
+ }
137
+ /** Subscribe to the menu stack close events and close this menu when requested. */
138
+ _setMenuStackCloseListener() {
139
+ this.menuStack.closed.pipe(takeUntil(this.destroyed)).subscribe(({ item }) => {
140
+ if (item === this.childMenu && this.isOpen()) {
141
+ this.closed.next();
142
+ this.overlayRef.detach();
143
+ }
144
+ });
145
+ }
146
+ /**
147
+ * Subscribe to the overlays outside pointer events stream and handle closing out the stack if a
148
+ * click occurs outside the menus.
149
+ * @param ignoreFirstAuxClick Whether to ignore the first auxclick event outside the menu.
150
+ */
151
+ _subscribeToOutsideClicks(ignoreFirstAuxClick) {
152
+ if (this.overlayRef) {
153
+ let outsideClicks = this.overlayRef.outsidePointerEvents();
154
+ // If the menu was triggered by the `contextmenu` event, skip the first `auxclick` event
155
+ // because it fires when the mouse is released on the same click that opened the menu.
156
+ if (ignoreFirstAuxClick) {
157
+ const [auxClicks, nonAuxClicks] = partition(outsideClicks, ({ type }) => type === 'auxclick');
158
+ outsideClicks = merge(nonAuxClicks, auxClicks.pipe(skip(1)));
159
+ }
160
+ outsideClicks.pipe(takeUntil(this.stopOutsideClicksListener)).subscribe(event => {
161
+ if (!this.isElementInsideMenuStack(event.target)) {
162
+ this.menuStack.closeAll();
163
+ }
164
+ });
165
+ }
166
+ }
167
+ /**
168
+ * Open the attached menu at the specified location.
169
+ * @param coordinates where to open the context menu
170
+ * @param ignoreFirstOutsideAuxClick Whether to ignore the first auxclick outside the menu after opening.
171
+ */
172
+ _open(coordinates, ignoreFirstOutsideAuxClick) {
173
+ if (this.disabled) {
174
+ return;
175
+ }
176
+ if (this.isOpen()) {
177
+ // since we're moving this menu we need to close any submenus first otherwise they end up
178
+ // disconnected from this one.
179
+ this.menuStack.closeSubMenuOf(this.childMenu);
180
+ this.overlayRef.getConfig().positionStrategy.setOrigin(coordinates);
181
+ this.overlayRef.updatePosition();
182
+ }
183
+ else {
184
+ this.opened.next();
185
+ if (this.overlayRef) {
186
+ this.overlayRef.getConfig().positionStrategy.setOrigin(coordinates);
187
+ this.overlayRef.updatePosition();
188
+ }
189
+ else {
190
+ this.overlayRef = this._overlay.create(this._getOverlayConfig(coordinates));
191
+ }
192
+ this.overlayRef.attach(this.getMenuContentPortal());
193
+ this._subscribeToOutsideClicks(ignoreFirstOutsideAuxClick);
194
+ }
195
+ }
196
+ }
197
+ CdkContextMenuTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkContextMenuTrigger, deps: [{ token: i0.Injector }, { token: i0.ViewContainerRef }, { token: i1.Overlay }, { token: ContextMenuTracker }, { token: MENU_STACK }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
198
+ CdkContextMenuTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "14.0.0-next.14", type: CdkContextMenuTrigger, selector: "[cdkContextMenuTriggerFor]", inputs: { menuTemplateRef: ["cdkContextMenuTriggerFor", "menuTemplateRef"], menuPosition: ["cdkContextMenuPosition", "menuPosition"], disabled: ["cdkContextMenuDisabled", "disabled"] }, outputs: { opened: "cdkContextMenuOpened", closed: "cdkContextMenuClosed" }, host: { listeners: { "contextmenu": "_openOnContextMenu($event)" }, properties: { "attr.data-cdk-menu-stack-id": "null" } }, providers: [
199
+ { provide: MENU_TRIGGER, useExisting: CdkContextMenuTrigger },
200
+ { provide: MENU_STACK, useClass: MenuStack },
201
+ ], exportAs: ["cdkContextMenuTriggerFor"], usesInheritance: true, ngImport: i0 });
202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkContextMenuTrigger, decorators: [{
203
+ type: Directive,
204
+ args: [{
205
+ selector: '[cdkContextMenuTriggerFor]',
206
+ exportAs: 'cdkContextMenuTriggerFor',
207
+ host: {
208
+ '[attr.data-cdk-menu-stack-id]': 'null',
209
+ '(contextmenu)': '_openOnContextMenu($event)',
210
+ },
211
+ inputs: ['menuTemplateRef: cdkContextMenuTriggerFor', 'menuPosition: cdkContextMenuPosition'],
212
+ outputs: ['opened: cdkContextMenuOpened', 'closed: cdkContextMenuClosed'],
213
+ providers: [
214
+ { provide: MENU_TRIGGER, useExisting: CdkContextMenuTrigger },
215
+ { provide: MENU_STACK, useClass: MenuStack },
216
+ ],
217
+ }]
218
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i1.Overlay }, { type: ContextMenuTracker }, { type: i3.MenuStack, decorators: [{
219
+ type: Inject,
220
+ args: [MENU_STACK]
221
+ }] }, { type: i2.Directionality, decorators: [{
222
+ type: Optional
223
+ }] }]; }, propDecorators: { disabled: [{
224
+ type: Input,
225
+ args: ['cdkContextMenuDisabled']
226
+ }] } });
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LXRyaWdnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvY29udGV4dC1tZW51LXRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUVMLE9BQU8sRUFDUCxhQUFhLEVBQ2IsaUNBQWlDLEdBQ2xDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFlLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUUsT0FBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0scUJBQXFCLENBQUM7Ozs7O0FBRXJFLHlEQUF5RDtBQUN6RCxNQUFNLHNCQUFzQixHQUFHLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtJQUM5RSw2RkFBNkY7SUFDN0YseUZBQXlGO0lBQ3pGLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFD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QUFrQjswQkFFdkQsTUFBTTsyQkFBQyxVQUFVOzswQkFFakIsUUFBUTs0Q0FwQlAsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7XG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheUNvbmZpZyxcbiAgU1RBTkRBUkRfRFJPUERPV05fQkVMT1dfUE9TSVRJT05TLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge0Jvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHttZXJnZSwgcGFydGl0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7c2tpcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01FTlVfU1RBQ0ssIE1lbnVTdGFja30gZnJvbSAnLi9tZW51LXN0YWNrJztcbmltcG9ydCB7Q2RrTWVudVRyaWdnZXJCYXNlLCBNRU5VX1RSSUdHRVJ9IGZyb20gJy4vbWVudS10cmlnZ2VyLWJhc2UnO1xuXG4vKiogVGhlIHByZWZlcnJlZCBtZW51IHBvc2l0aW9ucyBmb3IgdGhlIGNvbnRleHQgbWVudS4gKi9cbmNvbnN0IENPTlRFWFRfTUVOVV9QT1NJVElPTlMgPSBTVEFOREFSRF9EUk9QRE9XTl9CRUxPV19QT1NJVElPTlMubWFwKHBvc2l0aW9uID0+IHtcbiAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIGZpcnN0IG1lbnUgaXRlbSBpbiB0aGUgY29udGV4dCBtZW51IGlzIGEgdHJpZ2dlciB0aGUgc3VibWVudSBvcGVucyBvbiBhXG4gIC8vIGhvdmVyIGV2ZW50LiBXZSBvZmZzZXQgdGhlIGNvbnRleHQgbWVudSAycHggYnkgZGVmYXVsdCB0byBwcmV2ZW50IHRoaXMgZnJvbSBvY2N1cnJpbmcuXG4gIGNvbnN0IG9mZnNldFggPSBwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JyA/IDIgOiAtMjtcbiAgY29uc3Qgb2Zmc2V0WSA9IHBvc2l0aW9uLm92ZXJsYXlZID09PSAndG9wJyA/IDIgOiAtMjtcbiAgcmV0dXJuIHsuLi5wb3NpdGlvbiwgb2Zmc2V0WCwgb2Zmc2V0WX07XG59KTtcblxuLyoqIFRyYWNrcyB0aGUgbGFzdCBvcGVuIGNvbnRleHQgbWVudSB0cmlnZ2VyIGFjcm9zcyB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVUcmFja2VyIHtcbiAgLyoqIFRoZSBsYXN0IG9wZW4gY29udGV4dCBtZW51IHRyaWdnZXIuICovXG4gIHByaXZhdGUgc3RhdGljIF9vcGVuQ29udGV4dE1lbnVUcmlnZ2VyPzogQ2RrQ29udGV4dE1lbnVUcmlnZ2VyO1xuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcHJldmlvdXMgb3BlbiBjb250ZXh0IG1lbnUgYW5kIHNldCB0aGUgZ2l2ZW4gb25lIGFzIGJlaW5nIG9wZW4uXG4gICAqIEBwYXJhbSB0cmlnZ2VyIFRoZSB0cmlnZ2VyIGZvciB0aGUgY3VycmVudGx5IG9wZW4gQ29udGV4dCBNZW51LlxuICAgKi9cbiAgdXBkYXRlKHRyaWdnZXI6IENka0NvbnRleHRNZW51VHJpZ2dlcikge1xuICAgIGlmIChDb250ZXh0TWVudVRyYWNrZXIuX29wZW5Db250ZXh0TWVudVRyaWdnZXIgIT09IHRyaWdnZXIpIHtcbiAgICAgIENvbnRleHRNZW51VHJhY2tlci5fb3BlbkNvbnRleHRNZW51VHJpZ2dlcj8uY2xvc2UoKTtcbiAgICAgIENvbnRleHRNZW51VHJhY2tlci5fb3BlbkNvbnRleHRNZW51VHJpZ2dlciA9IHRyaWdnZXI7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgY29vcmRpbmF0ZXMgd2hlcmUgdGhlIGNvbnRleHQgbWVudSBzaG91bGQgb3Blbi4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRNZW51Q29vcmRpbmF0ZXMgPSB7eDogbnVtYmVyOyB5OiBudW1iZXJ9O1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgb3BlbnMgYSBtZW51IHdoZW4gYSB1c2VyIHJpZ2h0LWNsaWNrcyB3aXRoaW4gaXRzIGhvc3QgZWxlbWVudC5cbiAqIEl0IGlzIGF3YXJlIG9mIG5lc3RlZCBjb250ZXh0IG1lbnVzIGFuZCB3aWxsIHRyaWdnZXIgb25seSB0aGUgbG93ZXN0IGxldmVsIG5vbi1kaXNhYmxlZCBjb250ZXh0IG1lbnUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjZGtDb250ZXh0TWVudVRyaWdnZXJGb3JdJyxcbiAgZXhwb3J0QXM6ICdjZGtDb250ZXh0TWVudVRyaWdnZXJGb3InLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmRhdGEtY2RrLW1lbnUtc3RhY2staWRdJzogJ251bGwnLFxuICAgICcoY29udGV4dG1lbnUpJzogJ19vcGVuT25Db250ZXh0TWVudSgkZXZlbnQpJyxcbiAgfSxcbiAgaW5wdXRzOiBbJ21lbnVUZW1wbGF0ZVJlZjogY2RrQ29udGV4dE1lbnVUcmlnZ2VyRm9yJywgJ21lbnVQb3NpdGlvbjogY2RrQ29udGV4dE1lbnVQb3NpdGlvbiddLFxuICBvdXRwdXRzOiBbJ29wZW5lZDogY2RrQ29udGV4dE1lbnVPcGVuZWQnLCAnY2xvc2VkOiBjZGtDb250ZXh0TWVudUNsb3NlZCddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogTUVOVV9UUklHR0VSLCB1c2VFeGlzdGluZzogQ2RrQ29udGV4dE1lbnVUcmlnZ2VyfSxcbiAgICB7cHJvdmlkZTogTUVOVV9TVEFDSywgdXNlQ2xhc3M6IE1lbnVTdGFja30sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENka0NvbnRleHRNZW51VHJpZ2dlciBleHRlbmRzIENka01lbnVUcmlnZ2VyQmFzZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb250ZXh0IG1lbnUgaXMgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgnY2RrQ29udGV4dE1lbnVEaXNhYmxlZCcpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIERJIGluamVjdG9yIGZvciB0aGlzIGNvbXBvbmVudCAqL1xuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAvKiogVGhlIHZpZXcgY29udGFpbmVyIHJlZiBmb3IgdGhpcyBjb21wb25lbnQgKi9cbiAgICB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIC8qKiBUaGUgQ0RLIG92ZXJsYXkgc2VydmljZSAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgLyoqIFRoZSBhcHAncyBjb250ZXh0IG1lbnUgdHJhY2tpbmcgcmVnaXN0cnkgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0TWVudVRyYWNrZXI6IENvbnRleHRNZW51VHJhY2tlcixcbiAgICAvKiogVGhlIG1lbnUgc3RhY2sgdGhpcyBtZW51IGlzIHBhcnQgb2YuICovXG4gICAgQEluamVjdChNRU5VX1NUQUNLKSBtZW51U3RhY2s6IE1lbnVTdGFjayxcbiAgICAvKiogVGhlIGRpcmVjdGlvbmFsaXR5IG9mIHRoZSBjdXJyZW50IHBhZ2UgKi9cbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IF9kaXJlY3Rpb25hbGl0eT86IERpcmVjdGlvbmFsaXR5LFxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvciwgdmlld0NvbnRhaW5lclJlZiwgbWVudVN0YWNrKTtcbiAgICB0aGlzLl9zZXRNZW51U3RhY2tDbG9zZUxpc3RlbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgYXR0YWNoZWQgbWVudSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgd2hlcmUgdG8gb3BlbiB0aGUgY29udGV4dCBtZW51XG4gICAqL1xuICBvcGVuKGNvb3JkaW5hdGVzOiBDb250ZXh0TWVudUNvb3JkaW5hdGVzKSB7XG4gICAgdGhpcy5fb3Blbihjb29yZGluYXRlcywgZmFsc2UpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjdXJyZW50bHkgb3BlbmVkIGNvbnRleHQgbWVudS4gKi9cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5tZW51U3RhY2suY2xvc2VBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjb250ZXh0IG1lbnUgYW5kIGNsb3NlcyBhbnkgcHJldmlvdXNseSBvcGVuIG1lbnVzLlxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IHdoaWNoIG9wZW5zIHRoZSBjb250ZXh0IG1lbnUuXG4gICAqL1xuICBfb3Blbk9uQ29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIC8vIFByZXZlbnQgdGhlIG5hdGl2ZSBjb250ZXh0IG1lbnUgZnJvbSBvcGVuaW5nIGJlY2F1c2Ugd2UncmUgb3BlbmluZyBhIGN1c3RvbSBvbmUuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBTdG9wIGV2ZW50IHByb3BhZ2F0aW9uIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIGNsb3Nlc3QgZW5hYmxlZCBjb250ZXh0IG1lbnUgb3BlbnMuXG4gICAgICAvLyBPdGhlcndpc2UsIGFueSBjb250ZXh0IG1lbnVzIGF0dGFjaGVkIHRvIGNvbnRhaW5pbmcgZWxlbWVudHMgd291bGQgKmFsc28qIG9wZW4sXG4gICAgICAvLyByZXN1bHRpbmcgaW4gbXVsdGlwbGUgc3RhY2tlZCBjb250ZXh0IG1lbnVzIGJlaW5nIGRpc3BsYXllZC5cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICB0aGlzLl9jb250ZXh0TWVudVRyYWNrZXIudXBkYXRlKHRoaXMpO1xuICAgICAgdGhpcy5fb3Blbih7eDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WX0sIHRydWUpO1xuXG4gICAgICAvLyBBIGNvbnRleHQgbWVudSBjYW4gYmUgdHJpZ2dlcmVkIHZpYSBhIG1vdXNlIHJpZ2h0IGNsaWNrIG9yIGEga2V5Ym9hcmQgc2hvcnRjdXQuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgIHRoaXMuY2hpbGRNZW51Py5mb2N1c0ZpcnN0SXRlbSgnbW91c2UnKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2hpbGRNZW51Py5mb2N1c0ZpcnN0SXRlbSgna2V5Ym9hcmQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hpbGRNZW51Py5mb2N1c0ZpcnN0SXRlbSgncHJvZ3JhbScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBvdmVybGF5LlxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgdGhlIGxvY2F0aW9uIHRvIHBsYWNlIHRoZSBvcGVuZWQgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheUNvbmZpZyhjb29yZGluYXRlczogQ29udGV4dE1lbnVDb29yZGluYXRlcykge1xuICAgIHJldHVybiBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9nZXRPdmVybGF5UG9zaXRpb25TdHJhdGVneShjb29yZGluYXRlcyksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXG4gICAgICBkaXJlY3Rpb246IHRoaXMuX2RpcmVjdGlvbmFsaXR5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcG9zaXRpb24gc3RyYXRlZ3kgZm9yIHRoZSBvdmVybGF5IHdoaWNoIHNwZWNpZmllcyB3aGVyZSB0byBwbGFjZSB0aGUgbWVudS5cbiAgICogQHBhcmFtIGNvb3JkaW5hdGVzIHRoZSBsb2NhdGlvbiB0byBwbGFjZSB0aGUgb3BlbmVkIG1lbnVcbiAgICovXG4gIHByaXZhdGUgX2dldE92ZXJsYXlQb3NpdGlvblN0cmF0ZWd5KFxuICAgIGNvb3JkaW5hdGVzOiBDb250ZXh0TWVudUNvb3JkaW5hdGVzLFxuICApOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLl9vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8oY29vcmRpbmF0ZXMpXG4gICAgICAud2l0aFBvc2l0aW9ucyh0aGlzLm1lbnVQb3NpdGlvbiA/PyBDT05URVhUX01FTlVfUE9TSVRJT05TKTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdG8gdGhlIG1lbnUgc3RhY2sgY2xvc2UgZXZlbnRzIGFuZCBjbG9zZSB0aGlzIG1lbnUgd2hlbiByZXF1ZXN0ZWQuICovXG4gIHByaXZhdGUgX3NldE1lbnVTdGFja0Nsb3NlTGlzdGVuZXIoKSB7XG4gICAgdGhpcy5tZW51U3RhY2suY2xvc2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh7aXRlbX0pID0+IHtcbiAgICAgIGlmIChpdGVtID09PSB0aGlzLmNoaWxkTWVudSAmJiB0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkLm5leHQoKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5kZXRhY2goKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIG92ZXJsYXlzIG91dHNpZGUgcG9pbnRlciBldmVudHMgc3RyZWFtIGFuZCBoYW5kbGUgY2xvc2luZyBvdXQgdGhlIHN0YWNrIGlmIGFcbiAgICogY2xpY2sgb2NjdXJzIG91dHNpZGUgdGhlIG1lbnVzLlxuICAgKiBAcGFyYW0gaWdub3JlRmlyc3RBdXhDbGljayBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgZmlyc3QgYXV4Y2xpY2sgZXZlbnQgb3V0c2lkZSB0aGUgbWVudS5cbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvT3V0c2lkZUNsaWNrcyhpZ25vcmVGaXJzdEF1eENsaWNrOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgbGV0IG91dHNpZGVDbGlja3MgPSB0aGlzLm92ZXJsYXlSZWYub3V0c2lkZVBvaW50ZXJFdmVudHMoKTtcbiAgICAgIC8vIElmIHRoZSBtZW51IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGBjb250ZXh0bWVudWAgZXZlbnQsIHNraXAgdGhlIGZpcnN0IGBhdXhjbGlja2AgZXZlbnRcbiAgICAgIC8vIGJlY2F1c2UgaXQgZmlyZXMgd2hlbiB0aGUgbW91c2UgaXMgcmVsZWFzZWQgb24gdGhlIHNhbWUgY2xpY2sgdGhhdCBvcGVuZWQgdGhlIG1lbnUuXG4gICAgICBpZiAoaWdub3JlRmlyc3RBdXhDbGljaykge1xuICAgICAgICBjb25zdCBbYXV4Q2xpY2tzLCBub25BdXhDbGlja3NdID0gcGFydGl0aW9uKG91dHNpZGVDbGlja3MsICh7dHlwZX0pID0+IHR5cGUgPT09ICdhdXhjbGljaycpO1xuICAgICAgICBvdXRzaWRlQ2xpY2tzID0gbWVyZ2Uobm9uQXV4Q2xpY2tzLCBhdXhDbGlja3MucGlwZShza2lwKDEpKSk7XG4gICAgICB9XG4gICAgICBvdXRzaWRlQ2xpY2tzLnBpcGUodGFrZVVudGlsKHRoaXMuc3RvcE91dHNpZGVDbGlja3NMaXN0ZW5lcikpLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc0VsZW1lbnRJbnNpZGVNZW51U3RhY2soZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpKSB7XG4gICAgICAgICAgdGhpcy5tZW51U3RhY2suY2xvc2VBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGF0dGFjaGVkIG1lbnUgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAgICogQHBhcmFtIGNvb3JkaW5hdGVzIHdoZXJlIHRvIG9wZW4gdGhlIGNvbnRleHQgbWVudVxuICAgKiBAcGFyYW0gaWdub3JlRmlyc3RPdXRzaWRlQXV4Q2xpY2sgV2hldGhlciB0byBpZ25vcmUgdGhlIGZpcnN0IGF1eGNsaWNrIG91dHNpZGUgdGhlIG1lbnUgYWZ0ZXIgb3BlbmluZy5cbiAgICovXG4gIHByaXZhdGUgX29wZW4oY29vcmRpbmF0ZXM6IENvbnRleHRNZW51Q29vcmRpbmF0ZXMsIGlnbm9yZUZpcnN0T3V0c2lkZUF1eENsaWNrOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIC8vIHNpbmNlIHdlJ3JlIG1vdmluZyB0aGlzIG1lbnUgd2UgbmVlZCB0byBjbG9zZSBhbnkgc3VibWVudXMgZmlyc3Qgb3RoZXJ3aXNlIHRoZXkgZW5kIHVwXG4gICAgICAvLyBkaXNjb25uZWN0ZWQgZnJvbSB0aGlzIG9uZS5cbiAgICAgIHRoaXMubWVudVN0YWNrLmNsb3NlU3ViTWVudU9mKHRoaXMuY2hpbGRNZW51ISk7XG5cbiAgICAgIChcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneVxuICAgICAgKS5zZXRPcmlnaW4oY29vcmRpbmF0ZXMpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmIS51cGRhdGVQb3NpdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5lZC5uZXh0KCk7XG5cbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgKFxuICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneVxuICAgICAgICApLnNldE9yaWdpbihjb29yZGluYXRlcyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUodGhpcy5fZ2V0T3ZlcmxheUNvbmZpZyhjb29yZGluYXRlcykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHRoaXMuZ2V0TWVudUNvbnRlbnRQb3J0YWwoKSk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVUb091dHNpZGVDbGlja3MoaWdub3JlRmlyc3RPdXRzaWRlQXV4Q2xpY2spO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ export * from './public-api';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { Injectable, NgZone, InjectionToken, Directive } from '@angular/core';
9
+ import { fromEvent, Subject } from 'rxjs';
10
+ import { takeUntil, filter } from 'rxjs/operators';
11
+ import { throwMissingPointerFocusTracker, throwMissingMenuReference } from './menu-errors';
12
+ import * as i0 from "@angular/core";
13
+ /** Injection token used for an implementation of MenuAim. */
14
+ export const MENU_AIM = new InjectionToken('cdk-menu-aim');
15
+ /** Capture every nth mouse move event. */
16
+ const MOUSE_MOVE_SAMPLE_FREQUENCY = 3;
17
+ /** The number of mouse move events to track. */
18
+ const NUM_POINTS = 5;
19
+ /**
20
+ * How long to wait before closing a sibling menu if a user stops short of the submenu they were
21
+ * predicted to go into.
22
+ */
23
+ const CLOSE_DELAY = 300;
24
+ /** Calculate the slope between point a and b. */
25
+ function getSlope(a, b) {
26
+ return (b.y - a.y) / (b.x - a.x);
27
+ }
28
+ /** Calculate the y intercept for the given point and slope. */
29
+ function getYIntercept(point, slope) {
30
+ return point.y - slope * point.x;
31
+ }
32
+ /**
33
+ * Whether the given mouse trajectory line defined by the slope and y intercept falls within the
34
+ * submenu as defined by `submenuPoints`
35
+ * @param submenuPoints the submenu DOMRect points.
36
+ * @param m the slope of the trajectory line.
37
+ * @param b the y intercept of the trajectory line.
38
+ * @return true if any point on the line falls within the submenu.
39
+ */
40
+ function isWithinSubmenu(submenuPoints, m, b) {
41
+ const { left, right, top, bottom } = submenuPoints;
42
+ // Check for intersection with each edge of the submenu (left, right, top, bottom)
43
+ // by fixing one coordinate to that edge's coordinate (either x or y) and checking if the
44
+ // other coordinate is within bounds.
45
+ return ((m * left + b >= top && m * left + b <= bottom) ||
46
+ (m * right + b >= top && m * right + b <= bottom) ||
47
+ ((top - b) / m >= left && (top - b) / m <= right) ||
48
+ ((bottom - b) / m >= left && (bottom - b) / m <= right));
49
+ }
50
+ /**
51
+ * TargetMenuAim predicts if a user is moving into a submenu. It calculates the
52
+ * trajectory of the user's mouse movement in the current menu to determine if the
53
+ * mouse is moving towards an open submenu.
54
+ *
55
+ * The determination is made by calculating the slope of the users last NUM_POINTS moves where each
56
+ * pair of points determines if the trajectory line points into the submenu. It uses consensus
57
+ * approach by checking if at least NUM_POINTS / 2 pairs determine that the user is moving towards
58
+ * to submenu.
59
+ */
60
+ export class TargetMenuAim {
61
+ constructor(
62
+ /** The Angular zone. */
63
+ _ngZone) {
64
+ this._ngZone = _ngZone;
65
+ /** The last NUM_POINTS mouse move events. */
66
+ this._points = [];
67
+ /** Emits when this service is destroyed. */
68
+ this._destroyed = new Subject();
69
+ }
70
+ ngOnDestroy() {
71
+ this._destroyed.next();
72
+ this._destroyed.complete();
73
+ }
74
+ /**
75
+ * Set the Menu and its PointerFocusTracker.
76
+ * @param menu The menu that this menu aim service controls.
77
+ * @param pointerTracker The `PointerFocusTracker` for the given menu.
78
+ */
79
+ initialize(menu, pointerTracker) {
80
+ this._menu = menu;
81
+ this._pointerTracker = pointerTracker;
82
+ this._subscribeToMouseMoves();
83
+ }
84
+ /**
85
+ * Calls the `doToggle` callback when it is deemed that the user is not moving towards
86
+ * the submenu.
87
+ * @param doToggle the function called when the user is not moving towards the submenu.
88
+ */
89
+ toggle(doToggle) {
90
+ // If the menu is horizontal the sub-menus open below and there is no risk of premature
91
+ // closing of any sub-menus therefore we automatically resolve the callback.
92
+ if (this._menu.orientation === 'horizontal') {
93
+ doToggle();
94
+ }
95
+ this._checkConfigured();
96
+ const siblingItemIsWaiting = !!this._timeoutId;
97
+ const hasPoints = this._points.length > 1;
98
+ if (hasPoints && !siblingItemIsWaiting) {
99
+ if (this._isMovingToSubmenu()) {
100
+ this._startTimeout(doToggle);
101
+ }
102
+ else {
103
+ doToggle();
104
+ }
105
+ }
106
+ else if (!siblingItemIsWaiting) {
107
+ doToggle();
108
+ }
109
+ }
110
+ /**
111
+ * Start the delayed toggle handler if one isn't running already.
112
+ *
113
+ * The delayed toggle handler executes the `doToggle` callback after some period of time iff the
114
+ * users mouse is on an item in the current menu.
115
+ *
116
+ * @param doToggle the function called when the user is not moving towards the submenu.
117
+ */
118
+ _startTimeout(doToggle) {
119
+ // If the users mouse is moving towards a submenu we don't want to immediately resolve.
120
+ // Wait for some period of time before determining if the previous menu should close in
121
+ // cases where the user may have moved towards the submenu but stopped on a sibling menu
122
+ // item intentionally.
123
+ const timeoutId = setTimeout(() => {
124
+ // Resolve if the user is currently moused over some element in the root menu
125
+ if (this._pointerTracker.activeElement && timeoutId === this._timeoutId) {
126
+ doToggle();
127
+ }
128
+ this._timeoutId = null;
129
+ }, CLOSE_DELAY);
130
+ this._timeoutId = timeoutId;
131
+ }
132
+ /** Whether the user is heading towards the open submenu. */
133
+ _isMovingToSubmenu() {
134
+ const submenuPoints = this._getSubmenuBounds();
135
+ if (!submenuPoints) {
136
+ return false;
137
+ }
138
+ let numMoving = 0;
139
+ const currPoint = this._points[this._points.length - 1];
140
+ // start from the second last point and calculate the slope between each point and the last
141
+ // point.
142
+ for (let i = this._points.length - 2; i >= 0; i--) {
143
+ const previous = this._points[i];
144
+ const slope = getSlope(currPoint, previous);
145
+ if (isWithinSubmenu(submenuPoints, slope, getYIntercept(currPoint, slope))) {
146
+ numMoving++;
147
+ }
148
+ }
149
+ return numMoving >= Math.floor(NUM_POINTS / 2);
150
+ }
151
+ /** Get the bounding DOMRect for the open submenu. */
152
+ _getSubmenuBounds() {
153
+ return this._pointerTracker?.previousElement?.getMenu()?.nativeElement.getBoundingClientRect();
154
+ }
155
+ /**
156
+ * Check if a reference to the PointerFocusTracker and menu element is provided.
157
+ * @throws an error if neither reference is provided.
158
+ */
159
+ _checkConfigured() {
160
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
161
+ if (!this._pointerTracker) {
162
+ throwMissingPointerFocusTracker();
163
+ }
164
+ if (!this._menu) {
165
+ throwMissingMenuReference();
166
+ }
167
+ }
168
+ }
169
+ /** Subscribe to the root menus mouse move events and update the tracked mouse points. */
170
+ _subscribeToMouseMoves() {
171
+ this._ngZone.runOutsideAngular(() => {
172
+ fromEvent(this._menu.nativeElement, 'mousemove')
173
+ .pipe(filter((_, index) => index % MOUSE_MOVE_SAMPLE_FREQUENCY === 0), takeUntil(this._destroyed))
174
+ .subscribe((event) => {
175
+ this._points.push({ x: event.clientX, y: event.clientY });
176
+ if (this._points.length > NUM_POINTS) {
177
+ this._points.shift();
178
+ }
179
+ });
180
+ });
181
+ }
182
+ }
183
+ TargetMenuAim.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: TargetMenuAim, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
184
+ TargetMenuAim.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: TargetMenuAim });
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: TargetMenuAim, decorators: [{
186
+ type: Injectable
187
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
188
+ /**
189
+ * CdkTargetMenuAim is a provider for the TargetMenuAim service. It can be added to an
190
+ * element with either the `cdkMenu` or `cdkMenuBar` directive and child menu items.
191
+ */
192
+ export class CdkTargetMenuAim {
193
+ }
194
+ CdkTargetMenuAim.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkTargetMenuAim, deps: [], target: i0.ɵɵFactoryTarget.Directive });
195
+ CdkTargetMenuAim.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "14.0.0-next.14", type: CdkTargetMenuAim, selector: "[cdkTargetMenuAim]", providers: [{ provide: MENU_AIM, useClass: TargetMenuAim }], exportAs: ["cdkTargetMenuAim"], ngImport: i0 });
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.14", ngImport: i0, type: CdkTargetMenuAim, decorators: [{
197
+ type: Directive,
198
+ args: [{
199
+ selector: '[cdkTargetMenuAim]',
200
+ exportAs: 'cdkTargetMenuAim',
201
+ providers: [{ provide: MENU_AIM, useClass: TargetMenuAim }],
202
+ }]
203
+ }] });
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1haW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvbWVudS1haW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQWEsY0FBYyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBQywrQkFBK0IsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUF1QnpGLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQVUsY0FBYyxDQUFDLENBQUM7QUFFcEUsMENBQTBDO0FBQzFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBRXRDLGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckI7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBUXhCLGlEQUFpRDtBQUNqRCxTQUFTLFFBQVEsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtJQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsYUFBYSxDQUFDLEtBQVksRUFBRSxLQUFhO0lBQ2hELE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBS0Q7Ozs7Ozs7R0FPRztBQUNILFNBQVMs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QUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQzttR0FFOUMsZ0JBQWdCO2tCQUw1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7aUJBQzFEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIEluamVjdGlvblRva2VuLCBEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlVW50aWwsIGZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQb2ludGVyRm9jdXNUcmFja2VyLCBGb2N1c2FibGVFbGVtZW50fSBmcm9tICcuL3BvaW50ZXItZm9jdXMtdHJhY2tlcic7XG5pbXBvcnQge01lbnV9IGZyb20gJy4vbWVudS1pbnRlcmZhY2UnO1xuaW1wb3J0IHt0aHJvd01pc3NpbmdQb2ludGVyRm9jdXNUcmFja2VyLCB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlfSBmcm9tICcuL21lbnUtZXJyb3JzJztcblxuLyoqXG4gKiBNZW51QWltIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBpZiBhIHNpYmxpbmcgbWVudWl0ZW0ncyBtZW51IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBhXG4gKiBUb2dnbGVyIGl0ZW0gaXMgaG92ZXJlZCBpbnRvLiBJdCBpcyB1cCB0byB0aGUgaG92ZXJlZCBpbiBpdGVtIHRvIGNhbGwgdGhlIE1lbnVBaW0gc2VydmljZSBpblxuICogb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IG1heSBwZXJmb3JtIGl0cyBjbG9zZSBhY3Rpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVBaW0ge1xuICAvKipcbiAgICogU2V0IHRoZSBNZW51IGFuZCBpdHMgUG9pbnRlckZvY3VzVHJhY2tlci5cbiAgICogQHBhcmFtIG1lbnUgVGhlIG1lbnUgdGhhdCB0aGlzIG1lbnUgYWltIHNlcnZpY2UgY29udHJvbHMuXG4gICAqIEBwYXJhbSBwb2ludGVyVHJhY2tlciBUaGUgYFBvaW50ZXJGb2N1c1RyYWNrZXJgIGZvciB0aGUgZ2l2ZW4gbWVudS5cbiAgICovXG4gIGluaXRpYWxpemUobWVudTogTWVudSwgcG9pbnRlclRyYWNrZXI6IFBvaW50ZXJGb2N1c1RyYWNrZXI8Rm9jdXNhYmxlRWxlbWVudCAmIFRvZ2dsZXI+KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbHMgdGhlIGBkb1RvZ2dsZWAgY2FsbGJhY2sgd2hlbiBpdCBpcyBkZWVtZWQgdGhhdCB0aGUgdXNlciBpcyBub3QgbW92aW5nIHRvd2FyZHNcbiAgICogdGhlIHN1Ym1lbnUuXG4gICAqIEBwYXJhbSBkb1RvZ2dsZSB0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm90IG1vdmluZyB0b3dhcmRzIHRoZSBzdWJtZW51LlxuICAgKi9cbiAgdG9nZ2xlKGRvVG9nZ2xlOiAoKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB1c2VkIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNZW51QWltLiAqL1xuZXhwb3J0IGNvbnN0IE1FTlVfQUlNID0gbmV3IEluamVjdGlvblRva2VuPE1lbnVBaW0+KCdjZGstbWVudS1haW0nKTtcblxuLyoqIENhcHR1cmUgZXZlcnkgbnRoIG1vdXNlIG1vdmUgZXZlbnQuICovXG5jb25zdCBNT1VTRV9NT1ZFX1NBTVBMRV9GUkVRVUVOQ1kgPSAzO1xuXG4vKiogVGhlIG51bWJlciBvZiBtb3VzZSBtb3ZlIGV2ZW50cyB0byB0cmFjay4gKi9cbmNvbnN0IE5VTV9QT0lOVFMgPSA1O1xuXG4vKipcbiAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgYSBzaWJsaW5nIG1lbnUgaWYgYSB1c2VyIHN0b3BzIHNob3J0IG9mIHRoZSBzdWJtZW51IHRoZXkgd2VyZVxuICogcHJlZGljdGVkIHRvIGdvIGludG8uXG4gKi9cbmNvbnN0IENMT1NFX0RFTEFZID0gMzAwO1xuXG4vKiogQW4gZWxlbWVudCB3aGljaCB3aGVuIGhvdmVyZWQgb3ZlciBtYXkgb3BlbiBvciBjbG9zZSBhIG1lbnUuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvZ2dsZXIge1xuICAvKiogR2V0cyB0aGUgb3BlbiBtZW51LCBvciB1bmRlZmluZWQgaWYgbm8gbWVudSBpcyBvcGVuLiAqL1xuICBnZXRNZW51KCk6IE1lbnUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBDYWxjdWxhdGUgdGhlIHNsb3BlIGJldHdlZW4gcG9pbnQgYSBhbmQgYi4gKi9cbmZ1bmN0aW9uIGdldFNsb3BlKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICByZXR1cm4gKGIueSAtIGEueSkgLyAoYi54IC0gYS54KTtcbn1cblxuLyoqIENhbGN1bGF0ZSB0aGUgeSBpbnRlcmNlcHQgZm9yIHRoZSBnaXZlbiBwb2ludCBhbmQgc2xvcGUuICovXG5mdW5jdGlvbiBnZXRZSW50ZXJjZXB0KHBvaW50OiBQb2ludCwgc2xvcGU6IG51bWJlcikge1xuICByZXR1cm4gcG9pbnQueSAtIHNsb3BlICogcG9pbnQueDtcbn1cblxuLyoqIFJlcHJlc2VudHMgYSBjb29yZGluYXRlIG9mIG1vdXNlIHRyYXZlbC4gKi9cbnR5cGUgUG9pbnQgPSB7eDogbnVtYmVyOyB5OiBudW1iZXJ9O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIG1vdXNlIHRyYWplY3RvcnkgbGluZSBkZWZpbmVkIGJ5IHRoZSBzbG9wZSBhbmQgeSBpbnRlcmNlcHQgZmFsbHMgd2l0aGluIHRoZVxuICogc3VibWVudSBhcyBkZWZpbmVkIGJ5IGBzdWJtZW51UG9pbnRzYFxuICogQHBhcmFtIHN1Ym1lbnVQb2ludHMgdGhlIHN1Ym1lbnUgRE9NUmVjdCBwb2ludHMuXG4gKiBAcGFyYW0gbSB0aGUgc2xvcGUgb2YgdGhlIHRyYWplY3RvcnkgbGluZS5cbiAqIEBwYXJhbSBiIHRoZSB5IGludGVyY2VwdCBvZiB0aGUgdHJhamVjdG9yeSBsaW5lLlxuICogQHJldHVybiB0cnVlIGlmIGFueSBwb2ludCBvbiB0aGUgbGluZSBmYWxscyB3aXRoaW4gdGhlIHN1Ym1lbnUuXG4gKi9cbmZ1bmN0aW9uIGlzV2l0aGluU3VibWVudShzdWJtZW51UG9pbnRzOiBET01SZWN0LCBtOiBudW1iZXIsIGI6IG51bWJlcikge1xuICBjb25zdCB7bGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tfSA9IHN1Ym1lbnVQb2ludHM7XG5cbiAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiB3aXRoIGVhY2ggZWRnZSBvZiB0aGUgc3VibWVudSAobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKVxuICAvLyBieSBmaXhpbmcgb25lIGNvb3JkaW5hdGUgdG8gdGhhdCBlZGdlJ3MgY29vcmRpbmF0ZSAoZWl0aGVyIHggb3IgeSkgYW5kIGNoZWNraW5nIGlmIHRoZVxuICAvLyBvdGhlciBjb29yZGluYXRlIGlzIHdpdGhpbiBib3VuZHMuXG4gIHJldHVybiAoXG4gICAgKG0gKiBsZWZ0ICsgYiA+PSB0b3AgJiYgbSAqIGxlZnQgKyBiIDw9IGJvdHRvbSkgfHxcbiAgICAobSAqIHJpZ2h0ICsgYiA+PSB0b3AgJiYgbSAqIHJpZ2h0ICsgYiA8PSBib3R0b20pIHx8XG4gICAgKCh0b3AgLSBiKSAvIG0gPj0gbGVmdCAmJiAodG9wIC0gYikgLyBtIDw9IHJpZ2h0KSB8fFxuICAgICgoYm90dG9tIC0gYikgLyBtID49IGxlZnQgJiYgKGJvdHRvbSAtIGIpIC8gbSA8PSByaWdodClcbiAgKTtcbn1cblxuLyoqXG4gKiBUYXJnZXRNZW51QWltIHByZWRpY3RzIGlmIGEgdXNlciBpcyBtb3ZpbmcgaW50byBhIHN1Ym1lbnUuIEl0IGNhbGN1bGF0ZXMgdGhlXG4gKiB0cmFqZWN0b3J5IG9mIHRoZSB1c2VyJ3MgbW91c2UgbW92ZW1lbnQgaW4gdGhlIGN1cnJlbnQgbWVudSB0byBkZXRlcm1pbmUgaWYgdGhlXG4gKiBtb3VzZSBpcyBtb3ZpbmcgdG93YXJkcyBhbiBvcGVuIHN1Ym1lbnUuXG4gKlxuICogVGhlIGRldGVybWluYXRpb24gaXMgbWFkZSBieSBjYWxjdWxhdGluZyB0aGUgc2xvcGUgb2YgdGhlIHVzZXJzIGxhc3QgTlVNX1BPSU5UUyBtb3ZlcyB3aGVyZSBlYWNoXG4gKiBwYWlyIG9mIHBvaW50cyBkZXRlcm1pbmVzIGlmIHRoZSB0cmFqZWN0b3J5IGxpbmUgcG9pbnRzIGludG8gdGhlIHN1Ym1lbnUuIEl0IHVzZXMgY29uc2Vuc3VzXG4gKiBhcHByb2FjaCBieSBjaGVja2luZyBpZiBhdCBsZWFzdCBOVU1fUE9JTlRTIC8gMiBwYWlycyBkZXRlcm1pbmUgdGhhdCB0aGUgdXNlciBpcyBtb3ZpbmcgdG93YXJkc1xuICogdG8gc3VibWVudS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhcmdldE1lbnVBaW0gaW1wbGVtZW50cyBNZW51QWltLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIGxhc3QgTlVNX1BPSU5UUyBtb3VzZSBtb3ZlIGV2ZW50cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcG9pbnRzOiBQb2ludFtdID0gW107XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgcm9vdCBtZW51IGluIHdoaWNoIHdlIGFyZSB0cmFja2luZyBtb3VzZSBtb3Zlcy4gKi9cbiAgcHJpdmF0ZSBfbWVudTogTWVudTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IG1lbnUncyBtb3VzZSBtYW5hZ2VyLiAqL1xuICBwcml2YXRlIF9wb2ludGVyVHJhY2tlcjogUG9pbnRlckZvY3VzVHJhY2tlcjxUb2dnbGVyICYgRm9jdXNhYmxlRWxlbWVudD47XG5cbiAgLyoqIFRoZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZW91dCBjYWxsIHdhaXRpbmcgdG8gcmVzb2x2ZS4gKi9cbiAgcHJpdmF0ZSBfdGltZW91dElkOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoaXMgc2VydmljZSBpcyBkZXN0cm95ZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRoZSBBbmd1bGFyIHpvbmUuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgTWVudSBhbmQgaXRzIFBvaW50ZXJGb2N1c1RyYWNrZXIuXG4gICAqIEBwYXJhbSBtZW51IFRoZSBtZW51IHRoYXQgdGhpcyBtZW51IGFpbSBzZXJ2aWNlIGNvbnRyb2xzLlxuICAgKiBAcGFyYW0gcG9pbnRlclRyYWNrZXIgVGhlIGBQb2ludGVyRm9jdXNUcmFja2VyYCBmb3IgdGhlIGdpdmVuIG1lbnUuXG4gICAqL1xuICBpbml0aWFsaXplKG1lbnU6IE1lbnUsIHBvaW50ZXJUcmFja2VyOiBQb2ludGVyRm9jdXNUcmFja2VyPEZvY3VzYWJsZUVsZW1lbnQgJiBUb2dnbGVyPikge1xuICAgIHRoaXMuX21lbnUgPSBtZW51O1xuICAgIHRoaXMuX3BvaW50ZXJUcmFja2VyID0gcG9pbnRlclRyYWNrZXI7XG4gICAgdGhpcy5fc3Vic2NyaWJlVG9Nb3VzZU1vdmVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIGBkb1RvZ2dsZWAgY2FsbGJhY2sgd2hlbiBpdCBpcyBkZWVtZWQgdGhhdCB0aGUgdXNlciBpcyBub3QgbW92aW5nIHRvd2FyZHNcbiAgICogdGhlIHN1Ym1lbnUuXG4gICAqIEBwYXJhbSBkb1RvZ2dsZSB0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm90IG1vdmluZyB0b3dhcmRzIHRoZSBzdWJtZW51LlxuICAgKi9cbiAgdG9nZ2xlKGRvVG9nZ2xlOiAoKSA9PiB2b2lkKSB7XG4gICAgLy8gSWYgdGhlIG1lbnUgaXMgaG9yaXpvbnRhbCB0aGUgc3ViLW1lbnVzIG9wZW4gYmVsb3cgYW5kIHRoZXJlIGlzIG5vIHJpc2sgb2YgcHJlbWF0dXJlXG4gICAgLy8gY2xvc2luZyBvZiBhbnkgc3ViLW1lbnVzIHRoZXJlZm9yZSB3ZSBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIGNhbGxiYWNrLlxuICAgIGlmICh0aGlzLl9tZW51Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGRvVG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hlY2tDb25maWd1cmVkKCk7XG5cbiAgICBjb25zdCBzaWJsaW5nSXRlbUlzV2FpdGluZyA9ICEhdGhpcy5fdGltZW91dElkO1xuICAgIGNvbnN0IGhhc1BvaW50cyA9IHRoaXMuX3BvaW50cy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKGhhc1BvaW50cyAmJiAhc2libGluZ0l0ZW1Jc1dhaXRpbmcpIHtcbiAgICAgIGlmICh0aGlzLl9pc01vdmluZ1RvU3VibWVudSgpKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZW91dChkb1RvZ2dsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1RvZ2dsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNpYmxpbmdJdGVtSXNXYWl0aW5nKSB7XG4gICAgICBkb1RvZ2dsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZGVsYXllZCB0b2dnbGUgaGFuZGxlciBpZiBvbmUgaXNuJ3QgcnVubmluZyBhbHJlYWR5LlxuICAgKlxuICAgKiBUaGUgZGVsYXllZCB0b2dnbGUgaGFuZGxlciBleGVjdXRlcyB0aGUgYGRvVG9nZ2xlYCBjYWxsYmFjayBhZnRlciBzb21lIHBlcmlvZCBvZiB0aW1lIGlmZiB0aGVcbiAgICogdXNlcnMgbW91c2UgaXMgb24gYW4gaXRlbSBpbiB0aGUgY3VycmVudCBtZW51LlxuICAgKlxuICAgKiBAcGFyYW0gZG9Ub2dnbGUgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzIG5vdCBtb3ZpbmcgdG93YXJkcyB0aGUgc3VibWVudS5cbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZW91dChkb1RvZ2dsZTogKCkgPT4gdm9pZCkge1xuICAgIC8vIElmIHRoZSB1c2VycyBtb3VzZSBpcyBtb3ZpbmcgdG93YXJkcyBhIHN1Ym1lbnUgd2UgZG9uJ3Qgd2FudCB0byBpbW1lZGlhdGVseSByZXNvbHZlLlxuICAgIC8vIFdhaXQgZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIGRldGVybWluaW5nIGlmIHRoZSBwcmV2aW91cyBtZW51IHNob3VsZCBjbG9zZSBpblxuICAgIC8vIGNhc2VzIHdoZXJlIHRoZSB1c2VyIG1heSBoYXZlIG1vdmVkIHRvd2FyZHMgdGhlIHN1Ym1lbnUgYnV0IHN0b3BwZWQgb24gYSBzaWJsaW5nIG1lbnVcbiAgICAvLyBpdGVtIGludGVudGlvbmFsbHkuXG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBSZXNvbHZlIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQgb3ZlciBzb21lIGVsZW1lbnQgaW4gdGhlIHJvb3QgbWVudVxuICAgICAgaWYgKHRoaXMuX3BvaW50ZXJUcmFja2VyIS5hY3RpdmVFbGVtZW50ICYmIHRpbWVvdXRJZCA9PT0gdGhpcy5fdGltZW91dElkKSB7XG4gICAgICAgIGRvVG9nZ2xlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl90aW1lb3V0SWQgPSBudWxsO1xuICAgIH0sIENMT1NFX0RFTEFZKSBhcyBhbnkgYXMgbnVtYmVyO1xuXG4gICAgdGhpcy5fdGltZW91dElkID0gdGltZW91dElkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgaGVhZGluZyB0b3dhcmRzIHRoZSBvcGVuIHN1Ym1lbnUuICovXG4gIHByaXZhdGUgX2lzTW92aW5nVG9TdWJtZW51KCkge1xuICAgIGNvbnN0IHN1Ym1lbnVQb2ludHMgPSB0aGlzLl9nZXRTdWJtZW51Qm91bmRzKCk7XG4gICAgaWYgKCFzdWJtZW51UG9pbnRzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bU1vdmluZyA9IDA7XG4gICAgY29uc3QgY3VyclBvaW50ID0gdGhpcy5fcG9pbnRzW3RoaXMuX3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAvLyBzdGFydCBmcm9tIHRoZSBzZWNvbmQgbGFzdCBwb2ludCBhbmQgY2FsY3VsYXRlIHRoZSBzbG9wZSBiZXR3ZWVuIGVhY2ggcG9pbnQgYW5kIHRoZSBsYXN0XG4gICAgLy8gcG9pbnQuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX3BvaW50cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9wb2ludHNbaV07XG4gICAgICBjb25zdCBzbG9wZSA9IGdldFNsb3BlKGN1cnJQb2ludCwgcHJldmlvdXMpO1xuICAgICAgaWYgKGlzV2l0aGluU3VibWVudShzdWJtZW51UG9pbnRzLCBzbG9wZSwgZ2V0WUludGVyY2VwdChjdXJyUG9pbnQsIHNsb3BlKSkpIHtcbiAgICAgICAgbnVtTW92aW5nKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW1Nb3ZpbmcgPj0gTWF0aC5mbG9vcihOVU1fUE9JTlRTIC8gMik7XG4gIH1cblxuICAvKiogR2V0IHRoZSBib3VuZGluZyBET01SZWN0IGZvciB0aGUgb3BlbiBzdWJtZW51LiAqL1xuICBwcml2YXRlIF9nZXRTdWJtZW51Qm91bmRzKCk6IERPTVJlY3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wb2ludGVyVHJhY2tlcj8ucHJldmlvdXNFbGVtZW50Py5nZXRNZW51KCk/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWZlcmVuY2UgdG8gdGhlIFBvaW50ZXJGb2N1c1RyYWNrZXIgYW5kIG1lbnUgZWxlbWVudCBpcyBwcm92aWRlZC5cbiAgICogQHRocm93cyBhbiBlcnJvciBpZiBuZWl0aGVyIHJlZmVyZW5jZSBpcyBwcm92aWRlZC5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrQ29uZmlndXJlZCgpIHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuX3BvaW50ZXJUcmFja2VyKSB7XG4gICAgICAgIHRocm93TWlzc2luZ1BvaW50ZXJGb2N1c1RyYWNrZXIoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0byB0aGUgcm9vdCBtZW51cyBtb3VzZSBtb3ZlIGV2ZW50cyBhbmQgdXBkYXRlIHRoZSB0cmFja2VkIG1vdXNlIHBvaW50cy4gKi9cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9Nb3VzZU1vdmVzKCkge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fbWVudS5uYXRpdmVFbGVtZW50LCAnbW91c2Vtb3ZlJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfOiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIE1PVVNFX01PVkVfU0FNUExFX0ZSRVFVRU5DWSA9PT0gMCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9wb2ludHMucHVzaCh7eDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WX0pO1xuICAgICAgICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoID4gTlVNX1BPSU5UUykge1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENka1RhcmdldE1lbnVBaW0gaXMgYSBwcm92aWRlciBmb3IgdGhlIFRhcmdldE1lbnVBaW0gc2VydmljZS4gSXQgY2FuIGJlIGFkZGVkIHRvIGFuXG4gKiBlbGVtZW50IHdpdGggZWl0aGVyIHRoZSBgY2RrTWVudWAgb3IgYGNka01lbnVCYXJgIGRpcmVjdGl2ZSBhbmQgY2hpbGQgbWVudSBpdGVtcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Nka1RhcmdldE1lbnVBaW1dJyxcbiAgZXhwb3J0QXM6ICdjZGtUYXJnZXRNZW51QWltJyxcbiAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IE1FTlVfQUlNLCB1c2VDbGFzczogVGFyZ2V0TWVudUFpbX1dLFxufSlcbmV4cG9ydCBjbGFzcyBDZGtUYXJnZXRNZW51QWltIHt9XG4iXX0=