@angular/cdk 19.0.0-next.1 → 19.0.0-next.3

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 (330) hide show
  1. package/a11y/_index.scss +12 -54
  2. package/a11y/index.d.ts +5 -1
  3. package/fesm2022/a11y.mjs +61 -51
  4. package/fesm2022/a11y.mjs.map +1 -1
  5. package/fesm2022/accordion.mjs +10 -10
  6. package/fesm2022/bidi.mjs +10 -10
  7. package/fesm2022/cdk.mjs +1 -1
  8. package/fesm2022/cdk.mjs.map +1 -1
  9. package/fesm2022/clipboard.mjs +10 -10
  10. package/fesm2022/collections.mjs +3 -3
  11. package/fesm2022/dialog.mjs +10 -10
  12. package/fesm2022/drag-drop.mjs +33 -32
  13. package/fesm2022/drag-drop.mjs.map +1 -1
  14. package/fesm2022/layout.mjs +10 -10
  15. package/fesm2022/listbox.mjs +10 -10
  16. package/fesm2022/menu.mjs +49 -49
  17. package/fesm2022/observers/private.mjs +3 -3
  18. package/fesm2022/observers.mjs +13 -13
  19. package/fesm2022/overlay.mjs +54 -35
  20. package/fesm2022/overlay.mjs.map +1 -1
  21. package/fesm2022/platform.mjs +7 -7
  22. package/fesm2022/portal.mjs +16 -16
  23. package/fesm2022/private.mjs +12 -10
  24. package/fesm2022/private.mjs.map +1 -1
  25. package/fesm2022/scrolling.mjs +38 -35
  26. package/fesm2022/scrolling.mjs.map +1 -1
  27. package/fesm2022/stepper.mjs +22 -22
  28. package/fesm2022/table.mjs +76 -76
  29. package/fesm2022/text-field.mjs +30 -15
  30. package/fesm2022/text-field.mjs.map +1 -1
  31. package/fesm2022/tree.mjs +36 -30
  32. package/fesm2022/tree.mjs.map +1 -1
  33. package/overlay/_index.scss +15 -13
  34. package/overlay/index.d.ts +6 -1
  35. package/overlay-prebuilt.css +1 -1
  36. package/package.json +1 -57
  37. package/private/index.d.ts +1 -0
  38. package/schematics/ng-add/index.js +1 -1
  39. package/schematics/ng-add/index.mjs +1 -1
  40. package/scrolling/index.d.ts +1 -0
  41. package/table/index.d.ts +8 -8
  42. package/text-field/index.d.ts +1 -0
  43. package/tree/index.d.ts +6 -4
  44. package/esm2022/a11y/a11y-module.mjs +0 -31
  45. package/esm2022/a11y/a11y_public_index.mjs +0 -5
  46. package/esm2022/a11y/aria-describer/aria-describer.mjs +0 -232
  47. package/esm2022/a11y/aria-describer/aria-reference.mjs +0 -47
  48. package/esm2022/a11y/fake-event-detection.mjs +0 -29
  49. package/esm2022/a11y/focus-monitor/focus-monitor.mjs +0 -468
  50. package/esm2022/a11y/focus-trap/configurable-focus-trap-config.mjs +0 -9
  51. package/esm2022/a11y/focus-trap/configurable-focus-trap-factory.mjs +0 -54
  52. package/esm2022/a11y/focus-trap/configurable-focus-trap.mjs +0 -51
  53. package/esm2022/a11y/focus-trap/event-listener-inert-strategy.mjs +0 -61
  54. package/esm2022/a11y/focus-trap/focus-trap-inert-strategy.mjs +0 -11
  55. package/esm2022/a11y/focus-trap/focus-trap-manager.mjs +0 -53
  56. package/esm2022/a11y/focus-trap/focus-trap.mjs +0 -396
  57. package/esm2022/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +0 -116
  58. package/esm2022/a11y/index.mjs +0 -9
  59. package/esm2022/a11y/input-modality/input-modality-detector.mjs +0 -176
  60. package/esm2022/a11y/interactivity-checker/interactivity-checker.mjs +0 -238
  61. package/esm2022/a11y/key-manager/activedescendant-key-manager.mjs +0 -20
  62. package/esm2022/a11y/key-manager/focus-key-manager.mjs +0 -29
  63. package/esm2022/a11y/key-manager/list-key-manager.mjs +0 -357
  64. package/esm2022/a11y/key-manager/noop-tree-key-manager.mjs +0 -94
  65. package/esm2022/a11y/key-manager/tree-key-manager-strategy.mjs +0 -9
  66. package/esm2022/a11y/key-manager/tree-key-manager.mjs +0 -345
  67. package/esm2022/a11y/key-manager/typeahead.mjs +0 -91
  68. package/esm2022/a11y/live-announcer/live-announcer-tokens.mjs +0 -19
  69. package/esm2022/a11y/live-announcer/live-announcer.mjs +0 -210
  70. package/esm2022/a11y/public-api.mjs +0 -30
  71. package/esm2022/accordion/accordion-item.mjs +0 -162
  72. package/esm2022/accordion/accordion-module.mjs +0 -24
  73. package/esm2022/accordion/accordion.mjs +0 -65
  74. package/esm2022/accordion/accordion_public_index.mjs +0 -5
  75. package/esm2022/accordion/index.mjs +0 -9
  76. package/esm2022/accordion/public-api.mjs +0 -11
  77. package/esm2022/bidi/bidi-module.mjs +0 -23
  78. package/esm2022/bidi/bidi_public_index.mjs +0 -5
  79. package/esm2022/bidi/dir-document-token.mjs +0 -33
  80. package/esm2022/bidi/dir.mjs +0 -70
  81. package/esm2022/bidi/directionality.mjs +0 -52
  82. package/esm2022/bidi/index.mjs +0 -9
  83. package/esm2022/bidi/public-api.mjs +0 -12
  84. package/esm2022/clipboard/clipboard-module.mjs +0 -23
  85. package/esm2022/clipboard/clipboard.mjs +0 -53
  86. package/esm2022/clipboard/clipboard_public_index.mjs +0 -5
  87. package/esm2022/clipboard/copy-to-clipboard.mjs +0 -100
  88. package/esm2022/clipboard/index.mjs +0 -9
  89. package/esm2022/clipboard/pending-copy.mjs +0 -71
  90. package/esm2022/clipboard/public-api.mjs +0 -12
  91. package/esm2022/coercion/array.mjs +0 -11
  92. package/esm2022/coercion/boolean-property.mjs +0 -12
  93. package/esm2022/coercion/css-pixel-value.mjs +0 -15
  94. package/esm2022/coercion/element.mjs +0 -16
  95. package/esm2022/coercion/index.mjs +0 -9
  96. package/esm2022/coercion/number-property.mjs +0 -24
  97. package/esm2022/coercion/private/index.mjs +0 -9
  98. package/esm2022/coercion/private/observable.mjs +0 -19
  99. package/esm2022/coercion/private/private_public_index.mjs +0 -5
  100. package/esm2022/coercion/public-api.mjs +0 -14
  101. package/esm2022/coercion/string-array.mjs +0 -38
  102. package/esm2022/collections/array-data-source.mjs +0 -21
  103. package/esm2022/collections/collection-viewer.mjs +0 -9
  104. package/esm2022/collections/collections_public_index.mjs +0 -5
  105. package/esm2022/collections/data-source.mjs +0 -19
  106. package/esm2022/collections/dispose-view-repeater-strategy.mjs +0 -48
  107. package/esm2022/collections/index.mjs +0 -9
  108. package/esm2022/collections/public-api.mjs +0 -17
  109. package/esm2022/collections/recycle-view-repeater-strategy.mjs +0 -129
  110. package/esm2022/collections/selection-model.mjs +0 -225
  111. package/esm2022/collections/tree-adapter.mjs +0 -9
  112. package/esm2022/collections/unique-selection-dispatcher.mjs +0 -55
  113. package/esm2022/collections/view-repeater.mjs +0 -26
  114. package/esm2022/dialog/dialog-config.mjs +0 -70
  115. package/esm2022/dialog/dialog-container.mjs +0 -308
  116. package/esm2022/dialog/dialog-injectors.mjs +0 -40
  117. package/esm2022/dialog/dialog-module.mjs +0 -40
  118. package/esm2022/dialog/dialog-ref.mjs +0 -85
  119. package/esm2022/dialog/dialog.mjs +0 -303
  120. package/esm2022/dialog/dialog_public_index.mjs +0 -5
  121. package/esm2022/dialog/index.mjs +0 -9
  122. package/esm2022/dialog/public-api.mjs +0 -14
  123. package/esm2022/drag-drop/directives/assertions.mjs +0 -18
  124. package/esm2022/drag-drop/directives/config.mjs +0 -14
  125. package/esm2022/drag-drop/directives/drag-handle.mjs +0 -68
  126. package/esm2022/drag-drop/directives/drag-placeholder.mjs +0 -43
  127. package/esm2022/drag-drop/directives/drag-preview.mjs +0 -48
  128. package/esm2022/drag-drop/directives/drag.mjs +0 -520
  129. package/esm2022/drag-drop/directives/drop-list-group.mjs +0 -47
  130. package/esm2022/drag-drop/directives/drop-list.mjs +0 -352
  131. package/esm2022/drag-drop/dom/clone-node.mjs +0 -65
  132. package/esm2022/drag-drop/dom/dom-rect.mjs +0 -64
  133. package/esm2022/drag-drop/dom/parent-position-tracker.mjs +0 -76
  134. package/esm2022/drag-drop/dom/root-node.mjs +0 -21
  135. package/esm2022/drag-drop/dom/styling.mjs +0 -89
  136. package/esm2022/drag-drop/dom/transition-duration.mjs +0 -36
  137. package/esm2022/drag-drop/drag-drop-module.mjs +0 -49
  138. package/esm2022/drag-drop/drag-drop-registry.mjs +0 -248
  139. package/esm2022/drag-drop/drag-drop.mjs +0 -57
  140. package/esm2022/drag-drop/drag-drop_public_index.mjs +0 -5
  141. package/esm2022/drag-drop/drag-events.mjs +0 -9
  142. package/esm2022/drag-drop/drag-parent.mjs +0 -16
  143. package/esm2022/drag-drop/drag-ref.mjs +0 -1097
  144. package/esm2022/drag-drop/drag-utils.mjs +0 -60
  145. package/esm2022/drag-drop/drop-list-ref.mjs +0 -672
  146. package/esm2022/drag-drop/index.mjs +0 -9
  147. package/esm2022/drag-drop/preview-ref.mjs +0 -125
  148. package/esm2022/drag-drop/public-api.mjs +0 -23
  149. package/esm2022/drag-drop/sorting/drop-list-sort-strategy.mjs +0 -9
  150. package/esm2022/drag-drop/sorting/mixed-sort-strategy.mjs +0 -246
  151. package/esm2022/drag-drop/sorting/single-axis-sort-strategy.mjs +0 -343
  152. package/esm2022/index.mjs +0 -9
  153. package/esm2022/keycodes/index.mjs +0 -9
  154. package/esm2022/keycodes/keycodes.mjs +0 -127
  155. package/esm2022/keycodes/keycodes_public_index.mjs +0 -5
  156. package/esm2022/keycodes/modifiers.mjs +0 -18
  157. package/esm2022/keycodes/public-api.mjs +0 -10
  158. package/esm2022/layout/breakpoints-observer.mjs +0 -105
  159. package/esm2022/layout/breakpoints.mjs +0 -29
  160. package/esm2022/layout/index.mjs +0 -9
  161. package/esm2022/layout/layout-module.mjs +0 -19
  162. package/esm2022/layout/layout_public_index.mjs +0 -5
  163. package/esm2022/layout/media-matcher.mjs +0 -94
  164. package/esm2022/layout/public-api.mjs +0 -12
  165. package/esm2022/listbox/index.mjs +0 -9
  166. package/esm2022/listbox/listbox-module.mjs +0 -24
  167. package/esm2022/listbox/listbox.mjs +0 -888
  168. package/esm2022/listbox/listbox_public_index.mjs +0 -5
  169. package/esm2022/listbox/public-api.mjs +0 -10
  170. package/esm2022/menu/context-menu-trigger.mjs +0 -221
  171. package/esm2022/menu/event-detection.mjs +0 -28
  172. package/esm2022/menu/index.mjs +0 -9
  173. package/esm2022/menu/menu-aim.mjs +0 -204
  174. package/esm2022/menu/menu-bar.mjs +0 -134
  175. package/esm2022/menu/menu-base.mjs +0 -192
  176. package/esm2022/menu/menu-errors.mjs +0 -22
  177. package/esm2022/menu/menu-group.mjs +0 -31
  178. package/esm2022/menu/menu-interface.mjs +0 -11
  179. package/esm2022/menu/menu-item-checkbox.mjs +0 -50
  180. package/esm2022/menu/menu-item-radio.mjs +0 -72
  181. package/esm2022/menu/menu-item-selectable.mjs +0 -36
  182. package/esm2022/menu/menu-item.mjs +0 -270
  183. package/esm2022/menu/menu-module.mjs +0 -60
  184. package/esm2022/menu/menu-stack.mjs +0 -163
  185. package/esm2022/menu/menu-trigger-base.mjs +0 -119
  186. package/esm2022/menu/menu-trigger.mjs +0 -313
  187. package/esm2022/menu/menu.mjs +0 -135
  188. package/esm2022/menu/menu_public_index.mjs +0 -5
  189. package/esm2022/menu/pointer-focus-tracker.mjs +0 -51
  190. package/esm2022/menu/public-api.mjs +0 -24
  191. package/esm2022/observers/index.mjs +0 -9
  192. package/esm2022/observers/observe-content.mjs +0 -216
  193. package/esm2022/observers/observers_public_index.mjs +0 -5
  194. package/esm2022/observers/private/index.mjs +0 -9
  195. package/esm2022/observers/private/private_public_index.mjs +0 -5
  196. package/esm2022/observers/private/shared-resize-observer.mjs +0 -125
  197. package/esm2022/observers/public-api.mjs +0 -9
  198. package/esm2022/overlay/dispatchers/base-overlay-dispatcher.mjs +0 -52
  199. package/esm2022/overlay/dispatchers/index.mjs +0 -10
  200. package/esm2022/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +0 -81
  201. package/esm2022/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +0 -151
  202. package/esm2022/overlay/fullscreen-overlay-container.mjs +0 -94
  203. package/esm2022/overlay/index.mjs +0 -9
  204. package/esm2022/overlay/overlay-config.mjs +0 -45
  205. package/esm2022/overlay/overlay-container.mjs +0 -81
  206. package/esm2022/overlay/overlay-directives.mjs +0 -432
  207. package/esm2022/overlay/overlay-module.mjs +0 -28
  208. package/esm2022/overlay/overlay-ref.mjs +0 -437
  209. package/esm2022/overlay/overlay.mjs +0 -126
  210. package/esm2022/overlay/overlay_public_index.mjs +0 -5
  211. package/esm2022/overlay/position/connected-position.mjs +0 -88
  212. package/esm2022/overlay/position/flexible-connected-position-strategy.mjs +0 -1002
  213. package/esm2022/overlay/position/global-position-strategy.mjs +0 -237
  214. package/esm2022/overlay/position/overlay-position-builder.mjs +0 -50
  215. package/esm2022/overlay/position/position-strategy.mjs +0 -9
  216. package/esm2022/overlay/position/scroll-clip.mjs +0 -40
  217. package/esm2022/overlay/public-api.mjs +0 -22
  218. package/esm2022/overlay/scroll/block-scroll-strategy.mjs +0 -80
  219. package/esm2022/overlay/scroll/close-scroll-strategy.mjs +0 -65
  220. package/esm2022/overlay/scroll/index.mjs +0 -14
  221. package/esm2022/overlay/scroll/noop-scroll-strategy.mjs +0 -17
  222. package/esm2022/overlay/scroll/reposition-scroll-strategy.mjs +0 -61
  223. package/esm2022/overlay/scroll/scroll-strategy-options.mjs +0 -55
  224. package/esm2022/overlay/scroll/scroll-strategy.mjs +0 -14
  225. package/esm2022/platform/features/input-types.mjs +0 -59
  226. package/esm2022/platform/features/passive-listeners.mjs +0 -36
  227. package/esm2022/platform/features/scrolling.mjs +0 -104
  228. package/esm2022/platform/features/shadow-dom.mjs +0 -54
  229. package/esm2022/platform/features/test-environment.mjs +0 -24
  230. package/esm2022/platform/index.mjs +0 -9
  231. package/esm2022/platform/platform-module.mjs +0 -19
  232. package/esm2022/platform/platform.mjs +0 -82
  233. package/esm2022/platform/platform_public_index.mjs +0 -5
  234. package/esm2022/platform/public-api.mjs +0 -15
  235. package/esm2022/portal/dom-portal-outlet.mjs +0 -158
  236. package/esm2022/portal/index.mjs +0 -9
  237. package/esm2022/portal/portal-directives.mjs +0 -251
  238. package/esm2022/portal/portal-errors.mjs +0 -51
  239. package/esm2022/portal/portal-injector.mjs +0 -28
  240. package/esm2022/portal/portal.mjs +0 -189
  241. package/esm2022/portal/portal_public_index.mjs +0 -5
  242. package/esm2022/portal/public-api.mjs +0 -12
  243. package/esm2022/private/index.mjs +0 -9
  244. package/esm2022/private/private_public_index.mjs +0 -5
  245. package/esm2022/private/public-api.mjs +0 -9
  246. package/esm2022/private/style-loader.mjs +0 -50
  247. package/esm2022/public-api.mjs +0 -9
  248. package/esm2022/scrolling/fixed-size-virtual-scroll.mjs +0 -218
  249. package/esm2022/scrolling/index.mjs +0 -9
  250. package/esm2022/scrolling/public-api.mjs +0 -20
  251. package/esm2022/scrolling/scroll-dispatcher.mjs +0 -163
  252. package/esm2022/scrolling/scrollable.mjs +0 -177
  253. package/esm2022/scrolling/scrolling-module.mjs +0 -69
  254. package/esm2022/scrolling/scrolling_public_index.mjs +0 -5
  255. package/esm2022/scrolling/viewport-ruler.mjs +0 -146
  256. package/esm2022/scrolling/virtual-for-of.mjs +0 -299
  257. package/esm2022/scrolling/virtual-scroll-repeater.mjs +0 -9
  258. package/esm2022/scrolling/virtual-scroll-strategy.mjs +0 -11
  259. package/esm2022/scrolling/virtual-scroll-viewport.mjs +0 -445
  260. package/esm2022/scrolling/virtual-scrollable-element.mjs +0 -42
  261. package/esm2022/scrolling/virtual-scrollable-window.mjs +0 -41
  262. package/esm2022/scrolling/virtual-scrollable.mjs +0 -40
  263. package/esm2022/stepper/index.mjs +0 -9
  264. package/esm2022/stepper/public-api.mjs +0 -13
  265. package/esm2022/stepper/step-header.mjs +0 -31
  266. package/esm2022/stepper/step-label.mjs +0 -24
  267. package/esm2022/stepper/stepper-button.mjs +0 -58
  268. package/esm2022/stepper/stepper-module.mjs +0 -41
  269. package/esm2022/stepper/stepper.mjs +0 -452
  270. package/esm2022/stepper/stepper_public_index.mjs +0 -5
  271. package/esm2022/table/can-stick.mjs +0 -46
  272. package/esm2022/table/cell.mjs +0 -245
  273. package/esm2022/table/coalesced-style-scheduler.mjs +0 -79
  274. package/esm2022/table/index.mjs +0 -9
  275. package/esm2022/table/public-api.mjs +0 -20
  276. package/esm2022/table/row.mjs +0 -317
  277. package/esm2022/table/sticky-position-listener.mjs +0 -11
  278. package/esm2022/table/sticky-styler.mjs +0 -347
  279. package/esm2022/table/table-errors.mjs +0 -67
  280. package/esm2022/table/table-module.mjs +0 -93
  281. package/esm2022/table/table.mjs +0 -1148
  282. package/esm2022/table/table_public_index.mjs +0 -5
  283. package/esm2022/table/text-column.mjs +0 -154
  284. package/esm2022/table/tokens.mjs +0 -16
  285. package/esm2022/testing/change-detection.mjs +0 -102
  286. package/esm2022/testing/component-harness.mjs +0 -328
  287. package/esm2022/testing/element-dimensions.mjs +0 -9
  288. package/esm2022/testing/harness-environment.mjs +0 -220
  289. package/esm2022/testing/index.mjs +0 -9
  290. package/esm2022/testing/public-api.mjs +0 -15
  291. package/esm2022/testing/selenium-webdriver/index.mjs +0 -9
  292. package/esm2022/testing/selenium-webdriver/public-api.mjs +0 -10
  293. package/esm2022/testing/selenium-webdriver/selenium-web-driver-element.mjs +0 -216
  294. package/esm2022/testing/selenium-webdriver/selenium-web-driver-harness-environment.mjs +0 -88
  295. package/esm2022/testing/selenium-webdriver/selenium-webdriver-keys.mjs +0 -64
  296. package/esm2022/testing/test-element-errors.mjs +0 -15
  297. package/esm2022/testing/test-element.mjs +0 -49
  298. package/esm2022/testing/testbed/fake-events/dispatch-events.mjs +0 -53
  299. package/esm2022/testing/testbed/fake-events/element-focus.mjs +0 -39
  300. package/esm2022/testing/testbed/fake-events/event-objects.mjs +0 -127
  301. package/esm2022/testing/testbed/fake-events/index.mjs +0 -14
  302. package/esm2022/testing/testbed/fake-events/type-in-element.mjs +0 -97
  303. package/esm2022/testing/testbed/index.mjs +0 -9
  304. package/esm2022/testing/testbed/public-api.mjs +0 -10
  305. package/esm2022/testing/testbed/task-state-zone-interceptor.mjs +0 -83
  306. package/esm2022/testing/testbed/testbed-harness-environment.mjs +0 -165
  307. package/esm2022/testing/testbed/unit-test-element.mjs +0 -258
  308. package/esm2022/testing/text-filtering.mjs +0 -21
  309. package/esm2022/text-field/autofill.mjs +0 -114
  310. package/esm2022/text-field/autosize.mjs +0 -309
  311. package/esm2022/text-field/index.mjs +0 -9
  312. package/esm2022/text-field/public-api.mjs +0 -11
  313. package/esm2022/text-field/text-field-module.mjs +0 -24
  314. package/esm2022/text-field/text-field_public_index.mjs +0 -5
  315. package/esm2022/tree/control/base-tree-control.mjs +0 -62
  316. package/esm2022/tree/control/flat-tree-control.mjs +0 -57
  317. package/esm2022/tree/control/nested-tree-control.mjs +0 -67
  318. package/esm2022/tree/control/tree-control.mjs +0 -2
  319. package/esm2022/tree/index.mjs +0 -9
  320. package/esm2022/tree/nested-node.mjs +0 -103
  321. package/esm2022/tree/node.mjs +0 -36
  322. package/esm2022/tree/outlet.mjs +0 -40
  323. package/esm2022/tree/padding.mjs +0 -129
  324. package/esm2022/tree/public-api.mjs +0 -20
  325. package/esm2022/tree/toggle.mjs +0 -51
  326. package/esm2022/tree/tree-errors.mjs +0 -44
  327. package/esm2022/tree/tree-module.mjs +0 -49
  328. package/esm2022/tree/tree.mjs +0 -1123
  329. package/esm2022/tree/tree_public_index.mjs +0 -5
  330. package/esm2022/version.mjs +0 -11
@@ -1,343 +0,0 @@
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 { moveItemInArray } from '../drag-utils';
9
- import { combineTransforms } from '../dom/styling';
10
- import { adjustDomRect, getMutableClientRect, isInsideClientRect } from '../dom/dom-rect';
11
- /**
12
- * Strategy that only supports sorting along a single axis.
13
- * Items are reordered using CSS transforms which allows for sorting to be animated.
14
- * @docs-private
15
- */
16
- export class SingleAxisSortStrategy {
17
- constructor(_dragDropRegistry) {
18
- this._dragDropRegistry = _dragDropRegistry;
19
- /** Cache of the dimensions of all the items inside the container. */
20
- this._itemPositions = [];
21
- /** Direction in which the list is oriented. */
22
- this.orientation = 'vertical';
23
- /**
24
- * Keeps track of the item that was last swapped with the dragged item, as well as what direction
25
- * the pointer was moving in when the swap occurred and whether the user's pointer continued to
26
- * overlap with the swapped item after the swapping occurred.
27
- */
28
- this._previousSwap = {
29
- drag: null,
30
- delta: 0,
31
- overlaps: false,
32
- };
33
- }
34
- /**
35
- * To be called when the drag sequence starts.
36
- * @param items Items that are currently in the list.
37
- */
38
- start(items) {
39
- this.withItems(items);
40
- }
41
- /**
42
- * To be called when an item is being sorted.
43
- * @param item Item to be sorted.
44
- * @param pointerX Position of the item along the X axis.
45
- * @param pointerY Position of the item along the Y axis.
46
- * @param pointerDelta Direction in which the pointer is moving along each axis.
47
- */
48
- sort(item, pointerX, pointerY, pointerDelta) {
49
- const siblings = this._itemPositions;
50
- const newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY, pointerDelta);
51
- if (newIndex === -1 && siblings.length > 0) {
52
- return null;
53
- }
54
- const isHorizontal = this.orientation === 'horizontal';
55
- const currentIndex = siblings.findIndex(currentItem => currentItem.drag === item);
56
- const siblingAtNewPosition = siblings[newIndex];
57
- const currentPosition = siblings[currentIndex].clientRect;
58
- const newPosition = siblingAtNewPosition.clientRect;
59
- const delta = currentIndex > newIndex ? 1 : -1;
60
- // How many pixels the item's placeholder should be offset.
61
- const itemOffset = this._getItemOffsetPx(currentPosition, newPosition, delta);
62
- // How many pixels all the other items should be offset.
63
- const siblingOffset = this._getSiblingOffsetPx(currentIndex, siblings, delta);
64
- // Save the previous order of the items before moving the item to its new index.
65
- // We use this to check whether an item has been moved as a result of the sorting.
66
- const oldOrder = siblings.slice();
67
- // Shuffle the array in place.
68
- moveItemInArray(siblings, currentIndex, newIndex);
69
- siblings.forEach((sibling, index) => {
70
- // Don't do anything if the position hasn't changed.
71
- if (oldOrder[index] === sibling) {
72
- return;
73
- }
74
- const isDraggedItem = sibling.drag === item;
75
- const offset = isDraggedItem ? itemOffset : siblingOffset;
76
- const elementToOffset = isDraggedItem
77
- ? item.getPlaceholderElement()
78
- : sibling.drag.getRootElement();
79
- // Update the offset to reflect the new position.
80
- sibling.offset += offset;
81
- const transformAmount = Math.round(sibling.offset * (1 / sibling.drag.scale));
82
- // Since we're moving the items with a `transform`, we need to adjust their cached
83
- // client rects to reflect their new position, as well as swap their positions in the cache.
84
- // Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the
85
- // elements may be mid-animation which will give us a wrong result.
86
- if (isHorizontal) {
87
- // Round the transforms since some browsers will
88
- // blur the elements, for sub-pixel transforms.
89
- elementToOffset.style.transform = combineTransforms(`translate3d(${transformAmount}px, 0, 0)`, sibling.initialTransform);
90
- adjustDomRect(sibling.clientRect, 0, offset);
91
- }
92
- else {
93
- elementToOffset.style.transform = combineTransforms(`translate3d(0, ${transformAmount}px, 0)`, sibling.initialTransform);
94
- adjustDomRect(sibling.clientRect, offset, 0);
95
- }
96
- });
97
- // Note that it's important that we do this after the client rects have been adjusted.
98
- this._previousSwap.overlaps = isInsideClientRect(newPosition, pointerX, pointerY);
99
- this._previousSwap.drag = siblingAtNewPosition.drag;
100
- this._previousSwap.delta = isHorizontal ? pointerDelta.x : pointerDelta.y;
101
- return { previousIndex: currentIndex, currentIndex: newIndex };
102
- }
103
- /**
104
- * Called when an item is being moved into the container.
105
- * @param item Item that was moved into the container.
106
- * @param pointerX Position of the item along the X axis.
107
- * @param pointerY Position of the item along the Y axis.
108
- * @param index Index at which the item entered. If omitted, the container will try to figure it
109
- * out automatically.
110
- */
111
- enter(item, pointerX, pointerY, index) {
112
- const newIndex = index == null || index < 0
113
- ? // We use the coordinates of where the item entered the drop
114
- // zone to figure out at which index it should be inserted.
115
- this._getItemIndexFromPointerPosition(item, pointerX, pointerY)
116
- : index;
117
- const activeDraggables = this._activeDraggables;
118
- const currentIndex = activeDraggables.indexOf(item);
119
- const placeholder = item.getPlaceholderElement();
120
- let newPositionReference = activeDraggables[newIndex];
121
- // If the item at the new position is the same as the item that is being dragged,
122
- // it means that we're trying to restore the item to its initial position. In this
123
- // case we should use the next item from the list as the reference.
124
- if (newPositionReference === item) {
125
- newPositionReference = activeDraggables[newIndex + 1];
126
- }
127
- // If we didn't find a new position reference, it means that either the item didn't start off
128
- // in this container, or that the item requested to be inserted at the end of the list.
129
- if (!newPositionReference &&
130
- (newIndex == null || newIndex === -1 || newIndex < activeDraggables.length - 1) &&
131
- this._shouldEnterAsFirstChild(pointerX, pointerY)) {
132
- newPositionReference = activeDraggables[0];
133
- }
134
- // Since the item may be in the `activeDraggables` already (e.g. if the user dragged it
135
- // into another container and back again), we have to ensure that it isn't duplicated.
136
- if (currentIndex > -1) {
137
- activeDraggables.splice(currentIndex, 1);
138
- }
139
- // Don't use items that are being dragged as a reference, because
140
- // their element has been moved down to the bottom of the body.
141
- if (newPositionReference && !this._dragDropRegistry.isDragging(newPositionReference)) {
142
- const element = newPositionReference.getRootElement();
143
- element.parentElement.insertBefore(placeholder, element);
144
- activeDraggables.splice(newIndex, 0, item);
145
- }
146
- else {
147
- this._element.appendChild(placeholder);
148
- activeDraggables.push(item);
149
- }
150
- // The transform needs to be cleared so it doesn't throw off the measurements.
151
- placeholder.style.transform = '';
152
- // Note that usually `start` is called together with `enter` when an item goes into a new
153
- // container. This will cache item positions, but we need to refresh them since the amount
154
- // of items has changed.
155
- this._cacheItemPositions();
156
- }
157
- /** Sets the items that are currently part of the list. */
158
- withItems(items) {
159
- this._activeDraggables = items.slice();
160
- this._cacheItemPositions();
161
- }
162
- /** Assigns a sort predicate to the strategy. */
163
- withSortPredicate(predicate) {
164
- this._sortPredicate = predicate;
165
- }
166
- /** Resets the strategy to its initial state before dragging was started. */
167
- reset() {
168
- // TODO(crisbeto): may have to wait for the animations to finish.
169
- this._activeDraggables?.forEach(item => {
170
- const rootElement = item.getRootElement();
171
- if (rootElement) {
172
- const initialTransform = this._itemPositions.find(p => p.drag === item)?.initialTransform;
173
- rootElement.style.transform = initialTransform || '';
174
- }
175
- });
176
- this._itemPositions = [];
177
- this._activeDraggables = [];
178
- this._previousSwap.drag = null;
179
- this._previousSwap.delta = 0;
180
- this._previousSwap.overlaps = false;
181
- }
182
- /**
183
- * Gets a snapshot of items currently in the list.
184
- * Can include items that we dragged in from another list.
185
- */
186
- getActiveItemsSnapshot() {
187
- return this._activeDraggables;
188
- }
189
- /** Gets the index of a specific item. */
190
- getItemIndex(item) {
191
- // Items are sorted always by top/left in the cache, however they flow differently in RTL.
192
- // The rest of the logic still stands no matter what orientation we're in, however
193
- // we need to invert the array when determining the index.
194
- const items = this.orientation === 'horizontal' && this.direction === 'rtl'
195
- ? this._itemPositions.slice().reverse()
196
- : this._itemPositions;
197
- return items.findIndex(currentItem => currentItem.drag === item);
198
- }
199
- /** Used to notify the strategy that the scroll position has changed. */
200
- updateOnScroll(topDifference, leftDifference) {
201
- // Since we know the amount that the user has scrolled we can shift all of the
202
- // client rectangles ourselves. This is cheaper than re-measuring everything and
203
- // we can avoid inconsistent behavior where we might be measuring the element before
204
- // its position has changed.
205
- this._itemPositions.forEach(({ clientRect }) => {
206
- adjustDomRect(clientRect, topDifference, leftDifference);
207
- });
208
- // We need two loops for this, because we want all of the cached
209
- // positions to be up-to-date before we re-sort the item.
210
- this._itemPositions.forEach(({ drag }) => {
211
- if (this._dragDropRegistry.isDragging(drag)) {
212
- // We need to re-sort the item manually, because the pointer move
213
- // events won't be dispatched while the user is scrolling.
214
- drag._sortFromLastPointerPosition();
215
- }
216
- });
217
- }
218
- withElementContainer(container) {
219
- this._element = container;
220
- }
221
- /** Refreshes the position cache of the items and sibling containers. */
222
- _cacheItemPositions() {
223
- const isHorizontal = this.orientation === 'horizontal';
224
- this._itemPositions = this._activeDraggables
225
- .map(drag => {
226
- const elementToMeasure = drag.getVisibleElement();
227
- return {
228
- drag,
229
- offset: 0,
230
- initialTransform: elementToMeasure.style.transform || '',
231
- clientRect: getMutableClientRect(elementToMeasure),
232
- };
233
- })
234
- .sort((a, b) => {
235
- return isHorizontal
236
- ? a.clientRect.left - b.clientRect.left
237
- : a.clientRect.top - b.clientRect.top;
238
- });
239
- }
240
- /**
241
- * Gets the offset in pixels by which the item that is being dragged should be moved.
242
- * @param currentPosition Current position of the item.
243
- * @param newPosition Position of the item where the current item should be moved.
244
- * @param delta Direction in which the user is moving.
245
- */
246
- _getItemOffsetPx(currentPosition, newPosition, delta) {
247
- const isHorizontal = this.orientation === 'horizontal';
248
- let itemOffset = isHorizontal
249
- ? newPosition.left - currentPosition.left
250
- : newPosition.top - currentPosition.top;
251
- // Account for differences in the item width/height.
252
- if (delta === -1) {
253
- itemOffset += isHorizontal
254
- ? newPosition.width - currentPosition.width
255
- : newPosition.height - currentPosition.height;
256
- }
257
- return itemOffset;
258
- }
259
- /**
260
- * Gets the offset in pixels by which the items that aren't being dragged should be moved.
261
- * @param currentIndex Index of the item currently being dragged.
262
- * @param siblings All of the items in the list.
263
- * @param delta Direction in which the user is moving.
264
- */
265
- _getSiblingOffsetPx(currentIndex, siblings, delta) {
266
- const isHorizontal = this.orientation === 'horizontal';
267
- const currentPosition = siblings[currentIndex].clientRect;
268
- const immediateSibling = siblings[currentIndex + delta * -1];
269
- let siblingOffset = currentPosition[isHorizontal ? 'width' : 'height'] * delta;
270
- if (immediateSibling) {
271
- const start = isHorizontal ? 'left' : 'top';
272
- const end = isHorizontal ? 'right' : 'bottom';
273
- // Get the spacing between the start of the current item and the end of the one immediately
274
- // after it in the direction in which the user is dragging, or vice versa. We add it to the
275
- // offset in order to push the element to where it will be when it's inline and is influenced
276
- // by the `margin` of its siblings.
277
- if (delta === -1) {
278
- siblingOffset -= immediateSibling.clientRect[start] - currentPosition[end];
279
- }
280
- else {
281
- siblingOffset += currentPosition[start] - immediateSibling.clientRect[end];
282
- }
283
- }
284
- return siblingOffset;
285
- }
286
- /**
287
- * Checks if pointer is entering in the first position
288
- * @param pointerX Position of the user's pointer along the X axis.
289
- * @param pointerY Position of the user's pointer along the Y axis.
290
- */
291
- _shouldEnterAsFirstChild(pointerX, pointerY) {
292
- if (!this._activeDraggables.length) {
293
- return false;
294
- }
295
- const itemPositions = this._itemPositions;
296
- const isHorizontal = this.orientation === 'horizontal';
297
- // `itemPositions` are sorted by position while `activeDraggables` are sorted by child index
298
- // check if container is using some sort of "reverse" ordering (eg: flex-direction: row-reverse)
299
- const reversed = itemPositions[0].drag !== this._activeDraggables[0];
300
- if (reversed) {
301
- const lastItemRect = itemPositions[itemPositions.length - 1].clientRect;
302
- return isHorizontal ? pointerX >= lastItemRect.right : pointerY >= lastItemRect.bottom;
303
- }
304
- else {
305
- const firstItemRect = itemPositions[0].clientRect;
306
- return isHorizontal ? pointerX <= firstItemRect.left : pointerY <= firstItemRect.top;
307
- }
308
- }
309
- /**
310
- * Gets the index of an item in the drop container, based on the position of the user's pointer.
311
- * @param item Item that is being sorted.
312
- * @param pointerX Position of the user's pointer along the X axis.
313
- * @param pointerY Position of the user's pointer along the Y axis.
314
- * @param delta Direction in which the user is moving their pointer.
315
- */
316
- _getItemIndexFromPointerPosition(item, pointerX, pointerY, delta) {
317
- const isHorizontal = this.orientation === 'horizontal';
318
- const index = this._itemPositions.findIndex(({ drag, clientRect }) => {
319
- // Skip the item itself.
320
- if (drag === item) {
321
- return false;
322
- }
323
- if (delta) {
324
- const direction = isHorizontal ? delta.x : delta.y;
325
- // If the user is still hovering over the same item as last time, their cursor hasn't left
326
- // the item after we made the swap, and they didn't change the direction in which they're
327
- // dragging, we don't consider it a direction swap.
328
- if (drag === this._previousSwap.drag &&
329
- this._previousSwap.overlaps &&
330
- direction === this._previousSwap.delta) {
331
- return false;
332
- }
333
- }
334
- return isHorizontal
335
- ? // Round these down since most browsers report client rects with
336
- // sub-pixel precision, whereas the pointer coordinates are rounded to pixels.
337
- pointerX >= Math.floor(clientRect.left) && pointerX < Math.floor(clientRect.right)
338
- : pointerY >= Math.floor(clientRect.top) && pointerY < Math.floor(clientRect.bottom);
339
- });
340
- return index === -1 || !this._sortPredicate(index, item) ? -1 : index;
341
- }
342
- }
343
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLWF4aXMtc29ydC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvZHJhZy1kcm9wL3NvcnRpbmcvc2luZ2xlLWF4aXMtc29ydC1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFJSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQW1CeEY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUF1QmpDLFlBQW9CLGlCQUFtQztRQUFuQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBaEJ2RCxxRUFBcUU7UUFDN0QsbUJBQWMsR0FBa0MsRUFBRSxDQUFDO1FBUzNELCtDQUErQztRQUMvQyxnQkFBVyxHQUE4QixVQUFVLENBQUM7UUFPcEQ7Ozs7V0FJRztRQUNLLGtCQUFhLEdBQUc7WUFDdEIsSUFBSSxFQUFFLElBQXNCO1lBQzVCLEtBQUssRUFBRSxDQUFDO1lBQ1IsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQztJQVh3RCxDQUFDO0lBYTNEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxLQUF5QjtRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQUMsSUFBYSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxZQUFvQztRQUMxRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFB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QUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHtEcmFnRHJvcFJlZ2lzdHJ5fSBmcm9tICcuLi9kcmFnLWRyb3AtcmVnaXN0cnknO1xuaW1wb3J0IHttb3ZlSXRlbUluQXJyYXl9IGZyb20gJy4uL2RyYWctdXRpbHMnO1xuaW1wb3J0IHtjb21iaW5lVHJhbnNmb3Jtc30gZnJvbSAnLi4vZG9tL3N0eWxpbmcnO1xuaW1wb3J0IHthZGp1c3REb21SZWN0LCBnZXRNdXRhYmxlQ2xpZW50UmVjdCwgaXNJbnNpZGVDbGllbnRSZWN0fSBmcm9tICcuLi9kb20vZG9tLXJlY3QnO1xuaW1wb3J0IHtEcm9wTGlzdFNvcnRTdHJhdGVneSwgU29ydFByZWRpY2F0ZX0gZnJvbSAnLi9kcm9wLWxpc3Qtc29ydC1zdHJhdGVneSc7XG5pbXBvcnQgdHlwZSB7RHJhZ1JlZn0gZnJvbSAnLi4vZHJhZy1yZWYnO1xuXG4vKipcbiAqIEVudHJ5IGluIHRoZSBwb3NpdGlvbiBjYWNoZSBmb3IgZHJhZ2dhYmxlIGl0ZW1zLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5pbnRlcmZhY2UgQ2FjaGVkSXRlbVBvc2l0aW9uPFQ+IHtcbiAgLyoqIEluc3RhbmNlIG9mIHRoZSBkcmFnIGl0ZW0uICovXG4gIGRyYWc6IFQ7XG4gIC8qKiBEaW1lbnNpb25zIG9mIHRoZSBpdGVtLiAqL1xuICBjbGllbnRSZWN0OiBET01SZWN0O1xuICAvKiogQW1vdW50IGJ5IHdoaWNoIHRoZSBpdGVtIGhhcyBiZWVuIG1vdmVkIHNpbmNlIGRyYWdnaW5nIHN0YXJ0ZWQuICovXG4gIG9mZnNldDogbnVtYmVyO1xuICAvKiogSW5saW5lIHRyYW5zZm9ybSB0aGF0IHRoZSBkcmFnIGl0ZW0gaGFkIHdoZW4gZHJhZ2dpbmcgc3RhcnRlZC4gKi9cbiAgaW5pdGlhbFRyYW5zZm9ybTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IHRoYXQgb25seSBzdXBwb3J0cyBzb3J0aW5nIGFsb25nIGEgc2luZ2xlIGF4aXMuXG4gKiBJdGVtcyBhcmUgcmVvcmRlcmVkIHVzaW5nIENTUyB0cmFuc2Zvcm1zIHdoaWNoIGFsbG93cyBmb3Igc29ydGluZyB0byBiZSBhbmltYXRlZC5cbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUF4aXNTb3J0U3RyYXRlZ3kgaW1wbGVtZW50cyBEcm9wTGlzdFNvcnRTdHJhdGVneSB7XG4gIC8qKiBSb290IGVsZW1lbnQgY29udGFpbmVyIG9mIHRoZSBkcm9wIGxpc3QuICovXG4gIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIC8qKiBGdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpdGVtIGNhbiBiZSBzb3J0ZWQgaW50byBhIHNwZWNpZmljIGluZGV4LiAqL1xuICBwcml2YXRlIF9zb3J0UHJlZGljYXRlOiBTb3J0UHJlZGljYXRlPERyYWdSZWY+O1xuXG4gIC8qKiBDYWNoZSBvZiB0aGUgZGltZW5zaW9ucyBvZiBhbGwgdGhlIGl0ZW1zIGluc2lkZSB0aGUgY29udGFpbmVyLiAqL1xuICBwcml2YXRlIF9pdGVtUG9zaXRpb25zOiBDYWNoZWRJdGVtUG9zaXRpb248RHJhZ1JlZj5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBEcmFnZ2FibGUgaXRlbXMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBpbnNpZGUgdGhlIGNvbnRhaW5lci4gSW5jbHVkZXMgdGhlIGl0ZW1zXG4gICAqIHRoYXQgd2VyZSB0aGVyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlLCBhcyB3ZWxsIGFzIGFueSBpdGVtcyB0aGF0IGhhdmUgYmVlbiBkcmFnZ2VkXG4gICAqIGluLCBidXQgaGF2ZW4ndCBiZWVuIGRyb3BwZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBfYWN0aXZlRHJhZ2dhYmxlczogRHJhZ1JlZltdO1xuXG4gIC8qKiBEaXJlY3Rpb24gaW4gd2hpY2ggdGhlIGxpc3QgaXMgb3JpZW50ZWQuICovXG4gIG9yaWVudGF0aW9uOiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnID0gJ3ZlcnRpY2FsJztcblxuICAvKiogTGF5b3V0IGRpcmVjdGlvbiBvZiB0aGUgZHJvcCBsaXN0LiAqL1xuICBkaXJlY3Rpb246IERpcmVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kcmFnRHJvcFJlZ2lzdHJ5OiBEcmFnRHJvcFJlZ2lzdHJ5KSB7fVxuXG4gIC8qKlxuICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgaXRlbSB0aGF0IHdhcyBsYXN0IHN3YXBwZWQgd2l0aCB0aGUgZHJhZ2dlZCBpdGVtLCBhcyB3ZWxsIGFzIHdoYXQgZGlyZWN0aW9uXG4gICAqIHRoZSBwb2ludGVyIHdhcyBtb3ZpbmcgaW4gd2hlbiB0aGUgc3dhcCBvY2N1cnJlZCBhbmQgd2hldGhlciB0aGUgdXNlcidzIHBvaW50ZXIgY29udGludWVkIHRvXG4gICAqIG92ZXJsYXAgd2l0aCB0aGUgc3dhcHBlZCBpdGVtIGFmdGVyIHRoZSBzd2FwcGluZyBvY2N1cnJlZC5cbiAgICovXG4gIHByaXZhdGUgX3ByZXZpb3VzU3dhcCA9IHtcbiAgICBkcmFnOiBudWxsIGFzIERyYWdSZWYgfCBudWxsLFxuICAgIGRlbHRhOiAwLFxuICAgIG92ZXJsYXBzOiBmYWxzZSxcbiAgfTtcblxuICAvKipcbiAgICogVG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRyYWcgc2VxdWVuY2Ugc3RhcnRzLlxuICAgKiBAcGFyYW0gaXRlbXMgSXRlbXMgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSBsaXN0LlxuICAgKi9cbiAgc3RhcnQoaXRlbXM6IHJlYWRvbmx5IERyYWdSZWZbXSkge1xuICAgIHRoaXMud2l0aEl0ZW1zKGl0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBiZSBjYWxsZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIHNvcnRlZC5cbiAgICogQHBhcmFtIGl0ZW0gSXRlbSB0byBiZSBzb3J0ZWQuXG4gICAqIEBwYXJhbSBwb2ludGVyWCBQb3NpdGlvbiBvZiB0aGUgaXRlbSBhbG9uZyB0aGUgWCBheGlzLlxuICAgKiBAcGFyYW0gcG9pbnRlclkgUG9zaXRpb24gb2YgdGhlIGl0ZW0gYWxvbmcgdGhlIFkgYXhpcy5cbiAgICogQHBhcmFtIHBvaW50ZXJEZWx0YSBEaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHBvaW50ZXIgaXMgbW92aW5nIGFsb25nIGVhY2ggYXhpcy5cbiAgICovXG4gIHNvcnQoaXRlbTogRHJhZ1JlZiwgcG9pbnRlclg6IG51bWJlciwgcG9pbnRlclk6IG51bWJlciwgcG9pbnRlckRlbHRhOiB7eDogbnVtYmVyOyB5OiBudW1iZXJ9KSB7XG4gICAgY29uc3Qgc2libGluZ3MgPSB0aGlzLl9pdGVtUG9zaXRpb25zO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4RnJvbVBvaW50ZXJQb3NpdGlvbihpdGVtLCBwb2ludGVyWCwgcG9pbnRlclksIHBvaW50ZXJEZWx0YSk7XG5cbiAgICBpZiAobmV3SW5kZXggPT09IC0xICYmIHNpYmxpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzaWJsaW5ncy5maW5kSW5kZXgoY3VycmVudEl0ZW0gPT4gY3VycmVudEl0ZW0uZHJhZyA9PT0gaXRlbSk7XG4gICAgY29uc3Qgc2libGluZ0F0TmV3UG9zaXRpb24gPSBzaWJsaW5nc1tuZXdJbmRleF07XG4gICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gc2libGluZ3NbY3VycmVudEluZGV4XS5jbGllbnRSZWN0O1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gc2libGluZ0F0TmV3UG9zaXRpb24uY2xpZW50UmVjdDtcbiAgICBjb25zdCBkZWx0YSA9IGN1cnJlbnRJbmRleCA+IG5ld0luZGV4ID8gMSA6IC0xO1xuXG4gICAgLy8gSG93IG1hbnkgcGl4ZWxzIHRoZSBpdGVtJ3MgcGxhY2Vob2xkZXIgc2hvdWxkIGJlIG9mZnNldC5cbiAgICBjb25zdCBpdGVtT2Zmc2V0ID0gdGhpcy5fZ2V0SXRlbU9mZnNldFB4KGN1cnJlbnRQb3NpdGlvbiwgbmV3UG9zaXRpb24sIGRlbHRhKTtcblxuICAgIC8vIEhvdyBtYW55IHBpeGVscyBhbGwgdGhlIG90aGVyIGl0ZW1zIHNob3VsZCBiZSBvZmZzZXQuXG4gICAgY29uc3Qgc2libGluZ09mZnNldCA9IHRoaXMuX2dldFNpYmxpbmdPZmZzZXRQeChjdXJyZW50SW5kZXgsIHNpYmxpbmdzLCBkZWx0YSk7XG5cbiAgICAvLyBTYXZlIHRoZSBwcmV2aW91cyBvcmRlciBvZiB0aGUgaXRlbXMgYmVmb3JlIG1vdmluZyB0aGUgaXRlbSB0byBpdHMgbmV3IGluZGV4LlxuICAgIC8vIFdlIHVzZSB0aGlzIHRvIGNoZWNrIHdoZXRoZXIgYW4gaXRlbSBoYXMgYmVlbiBtb3ZlZCBhcyBhIHJlc3VsdCBvZiB0aGUgc29ydGluZy5cbiAgICBjb25zdCBvbGRPcmRlciA9IHNpYmxpbmdzLnNsaWNlKCk7XG5cbiAgICAvLyBTaHVmZmxlIHRoZSBhcnJheSBpbiBwbGFjZS5cbiAgICBtb3ZlSXRlbUluQXJyYXkoc2libGluZ3MsIGN1cnJlbnRJbmRleCwgbmV3SW5kZXgpO1xuXG4gICAgc2libGluZ3MuZm9yRWFjaCgoc2libGluZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBwb3NpdGlvbiBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIGlmIChvbGRPcmRlcltpbmRleF0gPT09IHNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0RyYWdnZWRJdGVtID0gc2libGluZy5kcmFnID09PSBpdGVtO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gaXNEcmFnZ2VkSXRlbSA/IGl0ZW1PZmZzZXQgOiBzaWJsaW5nT2Zmc2V0O1xuICAgICAgY29uc3QgZWxlbWVudFRvT2Zmc2V0ID0gaXNEcmFnZ2VkSXRlbVxuICAgICAgICA/IGl0ZW0uZ2V0UGxhY2Vob2xkZXJFbGVtZW50KClcbiAgICAgICAgOiBzaWJsaW5nLmRyYWcuZ2V0Um9vdEVsZW1lbnQoKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBvZmZzZXQgdG8gcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLlxuICAgICAgc2libGluZy5vZmZzZXQgKz0gb2Zmc2V0O1xuXG4gICAgICBjb25zdCB0cmFuc2Zvcm1BbW91bnQgPSBNYXRoLnJvdW5kKHNpYmxpbmcub2Zmc2V0ICogKDEgLyBzaWJsaW5nLmRyYWcuc2NhbGUpKTtcblxuICAgICAgLy8gU2luY2Ugd2UncmUgbW92aW5nIHRoZSBpdGVtcyB3aXRoIGEgYHRyYW5zZm9ybWAsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZWlyIGNhY2hlZFxuICAgICAgLy8gY2xpZW50IHJlY3RzIHRvIHJlZmxlY3QgdGhlaXIgbmV3IHBvc2l0aW9uLCBhcyB3ZWxsIGFzIHN3YXAgdGhlaXIgcG9zaXRpb25zIGluIHRoZSBjYWNoZS5cbiAgICAgIC8vIE5vdGUgdGhhdCB3ZSBzaG91bGRuJ3QgdXNlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIGhlcmUgdG8gdXBkYXRlIHRoZSBjYWNoZSwgYmVjYXVzZSB0aGVcbiAgICAgIC8vIGVsZW1lbnRzIG1heSBiZSBtaWQtYW5pbWF0aW9uIHdoaWNoIHdpbGwgZ2l2ZSB1cyBhIHdyb25nIHJlc3VsdC5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgLy8gUm91bmQgdGhlIHRyYW5zZm9ybXMgc2luY2Ugc29tZSBicm93c2VycyB3aWxsXG4gICAgICAgIC8vIGJsdXIgdGhlIGVsZW1lbnRzLCBmb3Igc3ViLXBpeGVsIHRyYW5zZm9ybXMuXG4gICAgICAgIGVsZW1lbnRUb09mZnNldC5zdHlsZS50cmFuc2Zvcm0gPSBjb21iaW5lVHJhbnNmb3JtcyhcbiAgICAgICAgICBgdHJhbnNsYXRlM2QoJHt0cmFuc2Zvcm1BbW91bnR9cHgsIDAsIDApYCxcbiAgICAgICAgICBzaWJsaW5nLmluaXRpYWxUcmFuc2Zvcm0sXG4gICAgICAgICk7XG4gICAgICAgIGFkanVzdERvbVJlY3Qoc2libGluZy5jbGllbnRSZWN0LCAwLCBvZmZzZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudFRvT2Zmc2V0LnN0eWxlLnRyYW5zZm9ybSA9IGNvbWJpbmVUcmFuc2Zvcm1zKFxuICAgICAgICAgIGB0cmFuc2xhdGUzZCgwLCAke3RyYW5zZm9ybUFtb3VudH1weCwgMClgLFxuICAgICAgICAgIHNpYmxpbmcuaW5pdGlhbFRyYW5zZm9ybSxcbiAgICAgICAgKTtcbiAgICAgICAgYWRqdXN0RG9tUmVjdChzaWJsaW5nLmNsaWVudFJlY3QsIG9mZnNldCwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIGFmdGVyIHRoZSBjbGllbnQgcmVjdHMgaGF2ZSBiZWVuIGFkanVzdGVkLlxuICAgIHRoaXMuX3ByZXZpb3VzU3dhcC5vdmVybGFwcyA9IGlzSW5zaWRlQ2xpZW50UmVjdChuZXdQb3NpdGlvbiwgcG9pbnRlclgsIHBvaW50ZXJZKTtcbiAgICB0aGlzLl9wcmV2aW91c1N3YXAuZHJhZyA9IHNpYmxpbmdBdE5ld1Bvc2l0aW9uLmRyYWc7XG4gICAgdGhpcy5fcHJldmlvdXNTd2FwLmRlbHRhID0gaXNIb3Jpem9udGFsID8gcG9pbnRlckRlbHRhLnggOiBwb2ludGVyRGVsdGEueTtcblxuICAgIHJldHVybiB7cHJldmlvdXNJbmRleDogY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXg6IG5ld0luZGV4fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIG1vdmVkIGludG8gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGl0ZW0gSXRlbSB0aGF0IHdhcyBtb3ZlZCBpbnRvIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBwb2ludGVyWCBQb3NpdGlvbiBvZiB0aGUgaXRlbSBhbG9uZyB0aGUgWCBheGlzLlxuICAgKiBAcGFyYW0gcG9pbnRlclkgUG9zaXRpb24gb2YgdGhlIGl0ZW0gYWxvbmcgdGhlIFkgYXhpcy5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IGF0IHdoaWNoIHRoZSBpdGVtIGVudGVyZWQuIElmIG9taXR0ZWQsIHRoZSBjb250YWluZXIgd2lsbCB0cnkgdG8gZmlndXJlIGl0XG4gICAqICAgb3V0IGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBlbnRlcihpdGVtOiBEcmFnUmVmLCBwb2ludGVyWDogbnVtYmVyLCBwb2ludGVyWTogbnVtYmVyLCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5ld0luZGV4ID1cbiAgICAgIGluZGV4ID09IG51bGwgfHwgaW5kZXggPCAwXG4gICAgICAgID8gLy8gV2UgdXNlIHRoZSBjb29yZGluYXRlcyBvZiB3aGVyZSB0aGUgaXRlbSBlbnRlcmVkIHRoZSBkcm9wXG4gICAgICAgICAgLy8gem9uZSB0byBmaWd1cmUgb3V0IGF0IHdoaWNoIGluZGV4IGl0IHNob3VsZCBiZSBpbnNlcnRlZC5cbiAgICAgICAgICB0aGlzLl9nZXRJdGVtSW5kZXhGcm9tUG9pbnRlclBvc2l0aW9uKGl0ZW0sIHBvaW50ZXJYLCBwb2ludGVyWSlcbiAgICAgICAgOiBpbmRleDtcblxuICAgIGNvbnN0IGFjdGl2ZURyYWdnYWJsZXMgPSB0aGlzLl9hY3RpdmVEcmFnZ2FibGVzO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFjdGl2ZURyYWdnYWJsZXMuaW5kZXhPZihpdGVtKTtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGl0ZW0uZ2V0UGxhY2Vob2xkZXJFbGVtZW50KCk7XG4gICAgbGV0IG5ld1Bvc2l0aW9uUmVmZXJlbmNlOiBEcmFnUmVmIHwgdW5kZWZpbmVkID0gYWN0aXZlRHJhZ2dhYmxlc1tuZXdJbmRleF07XG5cbiAgICAvLyBJZiB0aGUgaXRlbSBhdCB0aGUgbmV3IHBvc2l0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBpdGVtIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZCxcbiAgICAvLyBpdCBtZWFucyB0aGF0IHdlJ3JlIHRyeWluZyB0byByZXN0b3JlIHRoZSBpdGVtIHRvIGl0cyBpbml0aWFsIHBvc2l0aW9uLiBJbiB0aGlzXG4gICAgLy8gY2FzZSB3ZSBzaG91bGQgdXNlIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgbGlzdCBhcyB0aGUgcmVmZXJlbmNlLlxuICAgIGlmIChuZXdQb3NpdGlvblJlZmVyZW5jZSA9PT0gaXRlbSkge1xuICAgICAgbmV3UG9zaXRpb25SZWZlcmVuY2UgPSBhY3RpdmVEcmFnZ2FibGVzW25ld0luZGV4ICsgMV07XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBuZXcgcG9zaXRpb24gcmVmZXJlbmNlLCBpdCBtZWFucyB0aGF0IGVpdGhlciB0aGUgaXRlbSBkaWRuJ3Qgc3RhcnQgb2ZmXG4gICAgLy8gaW4gdGhpcyBjb250YWluZXIsIG9yIHRoYXQgdGhlIGl0ZW0gcmVxdWVzdGVkIHRvIGJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgaWYgKFxuICAgICAgIW5ld1Bvc2l0aW9uUmVmZXJlbmNlICYmXG4gICAgICAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEgfHwgbmV3SW5kZXggPCBhY3RpdmVEcmFnZ2FibGVzLmxlbmd0aCAtIDEpICYmXG4gICAgICB0aGlzLl9zaG91bGRFbnRlckFzRmlyc3RDaGlsZChwb2ludGVyWCwgcG9pbnRlclkpXG4gICAgKSB7XG4gICAgICBuZXdQb3NpdGlvblJlZmVyZW5jZSA9IGFjdGl2ZURyYWdnYWJsZXNbMF07XG4gICAgfVxuXG4gICAgLy8gU2luY2UgdGhlIGl0ZW0gbWF5IGJlIGluIHRoZSBgYWN0aXZlRHJhZ2dhYmxlc2AgYWxyZWFkeSAoZS5nLiBpZiB0aGUgdXNlciBkcmFnZ2VkIGl0XG4gICAgLy8gaW50byBhbm90aGVyIGNvbnRhaW5lciBhbmQgYmFjayBhZ2FpbiksIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgaXQgaXNuJ3QgZHVwbGljYXRlZC5cbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHtcbiAgICAgIGFjdGl2ZURyYWdnYWJsZXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXNlIGl0ZW1zIHRoYXQgYXJlIGJlaW5nIGRyYWdnZWQgYXMgYSByZWZlcmVuY2UsIGJlY2F1c2VcbiAgICAvLyB0aGVpciBlbGVtZW50IGhhcyBiZWVuIG1vdmVkIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgYm9keS5cbiAgICBpZiAobmV3UG9zaXRpb25SZWZlcmVuY2UgJiYgIXRoaXMuX2RyYWdEcm9wUmVnaXN0cnkuaXNEcmFnZ2luZyhuZXdQb3NpdGlvblJlZmVyZW5jZSkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdQb3NpdGlvblJlZmVyZW5jZS5nZXRSb290RWxlbWVudCgpO1xuICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50IS5pbnNlcnRCZWZvcmUocGxhY2Vob2xkZXIsIGVsZW1lbnQpO1xuICAgICAgYWN0aXZlRHJhZ2dhYmxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTtcbiAgICAgIGFjdGl2ZURyYWdnYWJsZXMucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdHJhbnNmb3JtIG5lZWRzIHRvIGJlIGNsZWFyZWQgc28gaXQgZG9lc24ndCB0aHJvdyBvZmYgdGhlIG1lYXN1cmVtZW50cy5cbiAgICBwbGFjZWhvbGRlci5zdHlsZS50cmFuc2Zvcm0gPSAnJztcblxuICAgIC8vIE5vdGUgdGhhdCB1c3VhbGx5IGBzdGFydGAgaXMgY2FsbGVkIHRvZ2V0aGVyIHdpdGggYGVudGVyYCB3aGVuIGFuIGl0ZW0gZ29lcyBpbnRvIGEgbmV3XG4gICAgLy8gY29udGFpbmVyLiBUaGlzIHdpbGwgY2FjaGUgaXRlbSBwb3NpdGlvbnMsIGJ1dCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlbSBzaW5jZSB0aGUgYW1vdW50XG4gICAgLy8gb2YgaXRlbXMgaGFzIGNoYW5nZWQuXG4gICAgdGhpcy5fY2FjaGVJdGVtUG9zaXRpb25zKCk7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgaXRlbXMgdGhhdCBhcmUgY3VycmVudGx5IHBhcnQgb2YgdGhlIGxpc3QuICovXG4gIHdpdGhJdGVtcyhpdGVtczogcmVhZG9ubHkgRHJhZ1JlZltdKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlRHJhZ2dhYmxlcyA9IGl0ZW1zLnNsaWNlKCk7XG4gICAgdGhpcy5fY2FjaGVJdGVtUG9zaXRpb25zKCk7XG4gIH1cblxuICAvKiogQXNzaWducyBhIHNvcnQgcHJlZGljYXRlIHRvIHRoZSBzdHJhdGVneS4gKi9cbiAgd2l0aFNvcnRQcmVkaWNhdGUocHJlZGljYXRlOiBTb3J0UHJlZGljYXRlPERyYWdSZWY+KTogdm9pZCB7XG4gICAgdGhpcy5fc29ydFByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIHN0cmF0ZWd5IHRvIGl0cyBpbml0aWFsIHN0YXRlIGJlZm9yZSBkcmFnZ2luZyB3YXMgc3RhcnRlZC4gKi9cbiAgcmVzZXQoKSB7XG4gICAgLy8gVE9ETyhjcmlzYmV0byk6IG1heSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBhbmltYXRpb25zIHRvIGZpbmlzaC5cbiAgICB0aGlzLl9hY3RpdmVEcmFnZ2FibGVzPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpdGVtLmdldFJvb3RFbGVtZW50KCk7XG5cbiAgICAgIGlmIChyb290RWxlbWVudCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVHJhbnNmb3JtID0gdGhpcy5faXRlbVBvc2l0aW9ucy5maW5kKHAgPT4gcC5kcmFnID09PSBpdGVtKT8uaW5pdGlhbFRyYW5zZm9ybTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gaW5pdGlhbFRyYW5zZm9ybSB8fCAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2l0ZW1Qb3NpdGlvbnMgPSBbXTtcbiAgICB0aGlzLl9hY3RpdmVEcmFnZ2FibGVzID0gW107XG4gICAgdGhpcy5fcHJldmlvdXNTd2FwLmRyYWcgPSBudWxsO1xuICAgIHRoaXMuX3ByZXZpb3VzU3dhcC5kZWx0YSA9IDA7XG4gICAgdGhpcy5fcHJldmlvdXNTd2FwLm92ZXJsYXBzID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNuYXBzaG90IG9mIGl0ZW1zIGN1cnJlbnRseSBpbiB0aGUgbGlzdC5cbiAgICogQ2FuIGluY2x1ZGUgaXRlbXMgdGhhdCB3ZSBkcmFnZ2VkIGluIGZyb20gYW5vdGhlciBsaXN0LlxuICAgKi9cbiAgZ2V0QWN0aXZlSXRlbXNTbmFwc2hvdCgpOiByZWFkb25seSBEcmFnUmVmW10ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEcmFnZ2FibGVzO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgaXRlbS4gKi9cbiAgZ2V0SXRlbUluZGV4KGl0ZW06IERyYWdSZWYpOiBudW1iZXIge1xuICAgIC8vIEl0ZW1zIGFyZSBzb3J0ZWQgYWx3YXlzIGJ5IHRvcC9sZWZ0IGluIHRoZSBjYWNoZSwgaG93ZXZlciB0aGV5IGZsb3cgZGlmZmVyZW50bHkgaW4gUlRMLlxuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBsb2dpYyBzdGlsbCBzdGFuZHMgbm8gbWF0dGVyIHdoYXQgb3JpZW50YXRpb24gd2UncmUgaW4sIGhvd2V2ZXJcbiAgICAvLyB3ZSBuZWVkIHRvIGludmVydCB0aGUgYXJyYXkgd2hlbiBkZXRlcm1pbmluZyB0aGUgaW5kZXguXG4gICAgY29uc3QgaXRlbXMgPVxuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIHRoaXMuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgICA/IHRoaXMuX2l0ZW1Qb3NpdGlvbnMuc2xpY2UoKS5yZXZlcnNlKClcbiAgICAgICAgOiB0aGlzLl9pdGVtUG9zaXRpb25zO1xuXG4gICAgcmV0dXJuIGl0ZW1zLmZpbmRJbmRleChjdXJyZW50SXRlbSA9PiBjdXJyZW50SXRlbS5kcmFnID09PSBpdGVtKTtcbiAgfVxuXG4gIC8qKiBVc2VkIHRvIG5vdGlmeSB0aGUgc3RyYXRlZ3kgdGhhdCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLiAqL1xuICB1cGRhdGVPblNjcm9sbCh0b3BEaWZmZXJlbmNlOiBudW1iZXIsIGxlZnREaWZmZXJlbmNlOiBudW1iZXIpIHtcbiAgICAvLyBTaW5jZSB3ZSBrbm93IHRoZSBhbW91bnQgdGhhdCB0aGUgdXNlciBoYXMgc2Nyb2xsZWQgd2UgY2FuIHNoaWZ0IGFsbCBvZiB0aGVcbiAgICAvLyBjbGllbnQgcmVjdGFuZ2xlcyBvdXJzZWx2ZXMuIFRoaXMgaXMgY2hlYXBlciB0aGFuIHJlLW1lYXN1cmluZyBldmVyeXRoaW5nIGFuZFxuICAgIC8vIHdlIGNhbiBhdm9pZCBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2hlcmUgd2UgbWlnaHQgYmUgbWVhc3VyaW5nIHRoZSBlbGVtZW50IGJlZm9yZVxuICAgIC8vIGl0cyBwb3NpdGlvbiBoYXMgY2hhbmdlZC5cbiAgICB0aGlzLl9pdGVtUG9zaXRpb25zLmZvckVhY2goKHtjbGllbnRSZWN0fSkgPT4ge1xuICAgICAgYWRqdXN0RG9tUmVjdChjbGllbnRSZWN0LCB0b3BEaWZmZXJlbmNlLCBsZWZ0RGlmZmVyZW5jZSk7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHR3byBsb29wcyBmb3IgdGhpcywgYmVjYXVzZSB3ZSB3YW50IGFsbCBvZiB0aGUgY2FjaGVkXG4gICAgLy8gcG9zaXRpb25zIHRvIGJlIHVwLXRvLWRhdGUgYmVmb3JlIHdlIHJlLXNvcnQgdGhlIGl0ZW0uXG4gICAgdGhpcy5faXRlbVBvc2l0aW9ucy5mb3JFYWNoKCh7ZHJhZ30pID0+IHtcbiAgICAgIGlmICh0aGlzLl9kcmFnRHJvcFJlZ2lzdHJ5LmlzRHJhZ2dpbmcoZHJhZykpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byByZS1zb3J0IHRoZSBpdGVtIG1hbnVhbGx5LCBiZWNhdXNlIHRoZSBwb2ludGVyIG1vdmVcbiAgICAgICAgLy8gZXZlbnRzIHdvbid0IGJlIGRpc3BhdGNoZWQgd2hpbGUgdGhlIHVzZXIgaXMgc2Nyb2xsaW5nLlxuICAgICAgICBkcmFnLl9zb3J0RnJvbUxhc3RQb2ludGVyUG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdpdGhFbGVtZW50Q29udGFpbmVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gY29udGFpbmVyO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgcG9zaXRpb24gY2FjaGUgb2YgdGhlIGl0ZW1zIGFuZCBzaWJsaW5nIGNvbnRhaW5lcnMuICovXG4gIHByaXZhdGUgX2NhY2hlSXRlbVBvc2l0aW9ucygpIHtcbiAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG5cbiAgICB0aGlzLl9pdGVtUG9zaXRpb25zID0gdGhpcy5fYWN0aXZlRHJhZ2dhYmxlc1xuICAgICAgLm1hcChkcmFnID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvTWVhc3VyZSA9IGRyYWcuZ2V0VmlzaWJsZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkcmFnLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBpbml0aWFsVHJhbnNmb3JtOiBlbGVtZW50VG9NZWFzdXJlLnN0eWxlLnRyYW5zZm9ybSB8fCAnJyxcbiAgICAgICAgICBjbGllbnRSZWN0OiBnZXRNdXRhYmxlQ2xpZW50UmVjdChlbGVtZW50VG9NZWFzdXJlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gaXNIb3Jpem9udGFsXG4gICAgICAgICAgPyBhLmNsaWVudFJlY3QubGVmdCAtIGIuY2xpZW50UmVjdC5sZWZ0XG4gICAgICAgICAgOiBhLmNsaWVudFJlY3QudG9wIC0gYi5jbGllbnRSZWN0LnRvcDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9mZnNldCBpbiBwaXhlbHMgYnkgd2hpY2ggdGhlIGl0ZW0gdGhhdCBpcyBiZWluZyBkcmFnZ2VkIHNob3VsZCBiZSBtb3ZlZC5cbiAgICogQHBhcmFtIGN1cnJlbnRQb3NpdGlvbiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gbmV3UG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGl0ZW0gd2hlcmUgdGhlIGN1cnJlbnQgaXRlbSBzaG91bGQgYmUgbW92ZWQuXG4gICAqIEBwYXJhbSBkZWx0YSBEaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHVzZXIgaXMgbW92aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0SXRlbU9mZnNldFB4KGN1cnJlbnRQb3NpdGlvbjogRE9NUmVjdCwgbmV3UG9zaXRpb246IERPTVJlY3QsIGRlbHRhOiAxIHwgLTEpIHtcbiAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgbGV0IGl0ZW1PZmZzZXQgPSBpc0hvcml6b250YWxcbiAgICAgID8gbmV3UG9zaXRpb24ubGVmdCAtIGN1cnJlbnRQb3NpdGlvbi5sZWZ0XG4gICAgICA6IG5ld1Bvc2l0aW9uLnRvcCAtIGN1cnJlbnRQb3NpdGlvbi50b3A7XG5cbiAgICAvLyBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgaXRlbSB3aWR0aC9oZWlnaHQuXG4gICAgaWYgKGRlbHRhID09PSAtMSkge1xuICAgICAgaXRlbU9mZnNldCArPSBpc0hvcml6b250YWxcbiAgICAgICAgPyBuZXdQb3NpdGlvbi53aWR0aCAtIGN1cnJlbnRQb3NpdGlvbi53aWR0aFxuICAgICAgICA6IG5ld1Bvc2l0aW9uLmhlaWdodCAtIGN1cnJlbnRQb3NpdGlvbi5oZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1PZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb2Zmc2V0IGluIHBpeGVscyBieSB3aGljaCB0aGUgaXRlbXMgdGhhdCBhcmVuJ3QgYmVpbmcgZHJhZ2dlZCBzaG91bGQgYmUgbW92ZWQuXG4gICAqIEBwYXJhbSBjdXJyZW50SW5kZXggSW5kZXggb2YgdGhlIGl0ZW0gY3VycmVudGx5IGJlaW5nIGRyYWdnZWQuXG4gICAqIEBwYXJhbSBzaWJsaW5ncyBBbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gZGVsdGEgRGlyZWN0aW9uIGluIHdoaWNoIHRoZSB1c2VyIGlzIG1vdmluZy5cbiAgICovXG4gIHByaXZhdGUgX2dldFNpYmxpbmdPZmZzZXRQeChcbiAgICBjdXJyZW50SW5kZXg6IG51bWJlcixcbiAgICBzaWJsaW5nczogQ2FjaGVkSXRlbVBvc2l0aW9uPERyYWdSZWY+W10sXG4gICAgZGVsdGE6IDEgfCAtMSxcbiAgKSB7XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IHNpYmxpbmdzW2N1cnJlbnRJbmRleF0uY2xpZW50UmVjdDtcbiAgICBjb25zdCBpbW1lZGlhdGVTaWJsaW5nID0gc2libGluZ3NbY3VycmVudEluZGV4ICsgZGVsdGEgKiAtMV07XG4gICAgbGV0IHNpYmxpbmdPZmZzZXQgPSBjdXJyZW50UG9zaXRpb25baXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnXSAqIGRlbHRhO1xuXG4gICAgaWYgKGltbWVkaWF0ZVNpYmxpbmcpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaXNIb3Jpem9udGFsID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgICBjb25zdCBlbmQgPSBpc0hvcml6b250YWwgPyAncmlnaHQnIDogJ2JvdHRvbSc7XG5cbiAgICAgIC8vIEdldCB0aGUgc3BhY2luZyBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpdGVtIGFuZCB0aGUgZW5kIG9mIHRoZSBvbmUgaW1tZWRpYXRlbHlcbiAgICAgIC8vIGFmdGVyIGl0IGluIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHVzZXIgaXMgZHJhZ2dpbmcsIG9yIHZpY2UgdmVyc2EuIFdlIGFkZCBpdCB0byB0aGVcbiAgICAgIC8vIG9mZnNldCBpbiBvcmRlciB0byBwdXNoIHRoZSBlbGVtZW50IHRvIHdoZXJlIGl0IHdpbGwgYmUgd2hlbiBpdCdzIGlubGluZSBhbmQgaXMgaW5mbHVlbmNlZFxuICAgICAgLy8gYnkgdGhlIGBtYXJnaW5gIG9mIGl0cyBzaWJsaW5ncy5cbiAgICAgIGlmIChkZWx0YSA9PT0gLTEpIHtcbiAgICAgICAgc2libGluZ09mZnNldCAtPSBpbW1lZGlhdGVTaWJsaW5nLmNsaWVudFJlY3Rbc3RhcnRdIC0gY3VycmVudFBvc2l0aW9uW2VuZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWJsaW5nT2Zmc2V0ICs9IGN1cnJlbnRQb3NpdGlvbltzdGFydF0gLSBpbW1lZGlhdGVTaWJsaW5nLmNsaWVudFJlY3RbZW5kXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2libGluZ09mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcG9pbnRlciBpcyBlbnRlcmluZyBpbiB0aGUgZmlyc3QgcG9zaXRpb25cbiAgICogQHBhcmFtIHBvaW50ZXJYIFBvc2l0aW9uIG9mIHRoZSB1c2VyJ3MgcG9pbnRlciBhbG9uZyB0aGUgWCBheGlzLlxuICAgKiBAcGFyYW0gcG9pbnRlclkgUG9zaXRpb24gb2YgdGhlIHVzZXIncyBwb2ludGVyIGFsb25nIHRoZSBZIGF4aXMuXG4gICAqL1xuICBwcml2YXRlIF9zaG91bGRFbnRlckFzRmlyc3RDaGlsZChwb2ludGVyWDogbnVtYmVyLCBwb2ludGVyWTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVEcmFnZ2FibGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1Qb3NpdGlvbnMgPSB0aGlzLl9pdGVtUG9zaXRpb25zO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcblxuICAgIC8vIGBpdGVtUG9zaXRpb25zYCBhcmUgc29ydGVkIGJ5IHBvc2l0aW9uIHdoaWxlIGBhY3RpdmVEcmFnZ2FibGVzYCBhcmUgc29ydGVkIGJ5IGNoaWxkIGluZGV4XG4gICAgLy8gY2hlY2sgaWYgY29udGFpbmVyIGlzIHVzaW5nIHNvbWUgc29ydCBvZiBcInJldmVyc2VcIiBvcmRlcmluZyAoZWc6IGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZSlcbiAgICBjb25zdCByZXZlcnNlZCA9IGl0ZW1Qb3NpdGlvbnNbMF0uZHJhZyAhPT0gdGhpcy5fYWN0aXZlRHJhZ2dhYmxlc1swXTtcbiAgICBpZiAocmV2ZXJzZWQpIHtcbiAgICAgIGNvbnN0IGxhc3RJdGVtUmVjdCA9IGl0ZW1Qb3NpdGlvbnNbaXRlbVBvc2l0aW9ucy5sZW5ndGggLSAxXS5jbGllbnRSZWN0O1xuICAgICAgcmV0dXJuIGlzSG9yaXpvbnRhbCA/IHBvaW50ZXJYID49IGxhc3RJdGVtUmVjdC5yaWdodCA6IHBvaW50ZXJZID49IGxhc3RJdGVtUmVjdC5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0SXRlbVJlY3QgPSBpdGVtUG9zaXRpb25zWzBdLmNsaWVudFJlY3Q7XG4gICAgICByZXR1cm4gaXNIb3Jpem9udGFsID8gcG9pbnRlclggPD0gZmlyc3RJdGVtUmVjdC5sZWZ0IDogcG9pbnRlclkgPD0gZmlyc3RJdGVtUmVjdC50b3A7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIGFuIGl0ZW0gaW4gdGhlIGRyb3AgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHVzZXIncyBwb2ludGVyLlxuICAgKiBAcGFyYW0gaXRlbSBJdGVtIHRoYXQgaXMgYmVpbmcgc29ydGVkLlxuICAgKiBAcGFyYW0gcG9pbnRlclggUG9zaXRpb24gb2YgdGhlIHVzZXIncyBwb2ludGVyIGFsb25nIHRoZSBYIGF4aXMuXG4gICAqIEBwYXJhbSBwb2ludGVyWSBQb3NpdGlvbiBvZiB0aGUgdXNlcidzIHBvaW50ZXIgYWxvbmcgdGhlIFkgYXhpcy5cbiAgICogQHBhcmFtIGRlbHRhIERpcmVjdGlvbiBpbiB3aGljaCB0aGUgdXNlciBpcyBtb3ZpbmcgdGhlaXIgcG9pbnRlci5cbiAgICovXG4gIHByaXZhdGUgX2dldEl0ZW1JbmRleEZyb21Qb2ludGVyUG9zaXRpb24oXG4gICAgaXRlbTogRHJhZ1JlZixcbiAgICBwb2ludGVyWDogbnVtYmVyLFxuICAgIHBvaW50ZXJZOiBudW1iZXIsXG4gICAgZGVsdGE/OiB7eDogbnVtYmVyOyB5OiBudW1iZXJ9LFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2l0ZW1Qb3NpdGlvbnMuZmluZEluZGV4KCh7ZHJhZywgY2xpZW50UmVjdH0pID0+IHtcbiAgICAgIC8vIFNraXAgdGhlIGl0ZW0gaXRzZWxmLlxuICAgICAgaWYgKGRyYWcgPT09IGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gaXNIb3Jpem9udGFsID8gZGVsdGEueCA6IGRlbHRhLnk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgc3RpbGwgaG92ZXJpbmcgb3ZlciB0aGUgc2FtZSBpdGVtIGFzIGxhc3QgdGltZSwgdGhlaXIgY3Vyc29yIGhhc24ndCBsZWZ0XG4gICAgICAgIC8vIHRoZSBpdGVtIGFmdGVyIHdlIG1hZGUgdGhlIHN3YXAsIGFuZCB0aGV5IGRpZG4ndCBjaGFuZ2UgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGV5J3JlXG4gICAgICAgIC8vIGRyYWdnaW5nLCB3ZSBkb24ndCBjb25zaWRlciBpdCBhIGRpcmVjdGlvbiBzd2FwLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZHJhZyA9PT0gdGhpcy5fcHJldmlvdXNTd2FwLmRyYWcgJiZcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1N3YXAub3ZlcmxhcHMgJiZcbiAgICAgICAgICBkaXJlY3Rpb24gPT09IHRoaXMuX3ByZXZpb3VzU3dhcC5kZWx0YVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzSG9yaXpvbnRhbFxuICAgICAgICA/IC8vIFJvdW5kIHRoZXNlIGRvd24gc2luY2UgbW9zdCBicm93c2VycyByZXBvcnQgY2xpZW50IHJlY3RzIHdpdGhcbiAgICAgICAgICAvLyBzdWItcGl4ZWwgcHJlY2lzaW9uLCB3aGVyZWFzIHRoZSBwb2ludGVyIGNvb3JkaW5hdGVzIGFyZSByb3VuZGVkIHRvIHBpeGVscy5cbiAgICAgICAgICBwb2ludGVyWCA+PSBNYXRoLmZsb29yKGNsaWVudFJlY3QubGVmdCkgJiYgcG9pbnRlclggPCBNYXRoLmZsb29yKGNsaWVudFJlY3QucmlnaHQpXG4gICAgICAgIDogcG9pbnRlclkgPj0gTWF0aC5mbG9vcihjbGllbnRSZWN0LnRvcCkgJiYgcG9pbnRlclkgPCBNYXRoLmZsb29yKGNsaWVudFJlY3QuYm90dG9tKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbmRleCA9PT0gLTEgfHwgIXRoaXMuX3NvcnRQcmVkaWNhdGUoaW5kZXgsIGl0ZW0pID8gLTEgOiBpbmRleDtcbiAgfVxufVxuIl19
package/esm2022/index.mjs DELETED
@@ -1,9 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2RrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -1,9 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL2tleWNvZGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -1,127 +0,0 @@
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 const MAC_ENTER = 3;
9
- export const BACKSPACE = 8;
10
- export const TAB = 9;
11
- export const NUM_CENTER = 12;
12
- export const ENTER = 13;
13
- export const SHIFT = 16;
14
- export const CONTROL = 17;
15
- export const ALT = 18;
16
- export const PAUSE = 19;
17
- export const CAPS_LOCK = 20;
18
- export const ESCAPE = 27;
19
- export const SPACE = 32;
20
- export const PAGE_UP = 33;
21
- export const PAGE_DOWN = 34;
22
- export const END = 35;
23
- export const HOME = 36;
24
- export const LEFT_ARROW = 37;
25
- export const UP_ARROW = 38;
26
- export const RIGHT_ARROW = 39;
27
- export const DOWN_ARROW = 40;
28
- export const PLUS_SIGN = 43;
29
- export const PRINT_SCREEN = 44;
30
- export const INSERT = 45;
31
- export const DELETE = 46;
32
- export const ZERO = 48;
33
- export const ONE = 49;
34
- export const TWO = 50;
35
- export const THREE = 51;
36
- export const FOUR = 52;
37
- export const FIVE = 53;
38
- export const SIX = 54;
39
- export const SEVEN = 55;
40
- export const EIGHT = 56;
41
- export const NINE = 57;
42
- export const FF_SEMICOLON = 59; // Firefox (Gecko) fires this for semicolon instead of 186
43
- export const FF_EQUALS = 61; // Firefox (Gecko) fires this for equals instead of 187
44
- export const QUESTION_MARK = 63;
45
- export const AT_SIGN = 64;
46
- export const A = 65;
47
- export const B = 66;
48
- export const C = 67;
49
- export const D = 68;
50
- export const E = 69;
51
- export const F = 70;
52
- export const G = 71;
53
- export const H = 72;
54
- export const I = 73;
55
- export const J = 74;
56
- export const K = 75;
57
- export const L = 76;
58
- export const M = 77;
59
- export const N = 78;
60
- export const O = 79;
61
- export const P = 80;
62
- export const Q = 81;
63
- export const R = 82;
64
- export const S = 83;
65
- export const T = 84;
66
- export const U = 85;
67
- export const V = 86;
68
- export const W = 87;
69
- export const X = 88;
70
- export const Y = 89;
71
- export const Z = 90;
72
- export const META = 91; // WIN_KEY_LEFT
73
- export const MAC_WK_CMD_LEFT = 91;
74
- export const MAC_WK_CMD_RIGHT = 93;
75
- export const CONTEXT_MENU = 93;
76
- export const NUMPAD_ZERO = 96;
77
- export const NUMPAD_ONE = 97;
78
- export const NUMPAD_TWO = 98;
79
- export const NUMPAD_THREE = 99;
80
- export const NUMPAD_FOUR = 100;
81
- export const NUMPAD_FIVE = 101;
82
- export const NUMPAD_SIX = 102;
83
- export const NUMPAD_SEVEN = 103;
84
- export const NUMPAD_EIGHT = 104;
85
- export const NUMPAD_NINE = 105;
86
- export const NUMPAD_MULTIPLY = 106;
87
- export const NUMPAD_PLUS = 107;
88
- export const NUMPAD_MINUS = 109;
89
- export const NUMPAD_PERIOD = 110;
90
- export const NUMPAD_DIVIDE = 111;
91
- export const F1 = 112;
92
- export const F2 = 113;
93
- export const F3 = 114;
94
- export const F4 = 115;
95
- export const F5 = 116;
96
- export const F6 = 117;
97
- export const F7 = 118;
98
- export const F8 = 119;
99
- export const F9 = 120;
100
- export const F10 = 121;
101
- export const F11 = 122;
102
- export const F12 = 123;
103
- export const NUM_LOCK = 144;
104
- export const SCROLL_LOCK = 145;
105
- export const FIRST_MEDIA = 166;
106
- export const FF_MINUS = 173;
107
- export const MUTE = 173; // Firefox (Gecko) fires 181 for MUTE
108
- export const VOLUME_DOWN = 174; // Firefox (Gecko) fires 182 for VOLUME_DOWN
109
- export const VOLUME_UP = 175; // Firefox (Gecko) fires 183 for VOLUME_UP
110
- export const FF_MUTE = 181;
111
- export const FF_VOLUME_DOWN = 182;
112
- export const LAST_MEDIA = 183;
113
- export const FF_VOLUME_UP = 183;
114
- export const SEMICOLON = 186; // Firefox (Gecko) fires 59 for SEMICOLON
115
- export const EQUALS = 187; // Firefox (Gecko) fires 61 for EQUALS
116
- export const COMMA = 188;
117
- export const DASH = 189; // Firefox (Gecko) fires 173 for DASH/MINUS
118
- export const PERIOD = 190;
119
- export const SLASH = 191;
120
- export const APOSTROPHE = 192;
121
- export const TILDE = 192;
122
- export const OPEN_SQUARE_BRACKET = 219;
123
- export const BACKSLASH = 220;
124
- export const CLOSE_SQUARE_BRACKET = 221;
125
- export const SINGLE_QUOTE = 222;
126
- export const MAC_META = 224;
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL2tleWNvZGVzL2tleWNvZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDNUIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN2QixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBEQUEwRDtBQUMxRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsdURBQXVEO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLGVBQWU7QUFDdkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUNqQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN2QixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxxQ0FBcUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLDRDQUE0QztBQUM1RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsMENBQTBDO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDM0IsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLHlDQUF5QztBQUN2RSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsc0NBQXNDO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLDJDQUEyQztBQUNwRSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuZXhwb3J0IGNvbnN0IE1BQ19FTlRFUiA9IDM7XG5leHBvcnQgY29uc3QgQkFDS1NQQUNFID0gODtcbmV4cG9ydCBjb25zdCBUQUIgPSA5O1xuZXhwb3J0IGNvbnN0IE5VTV9DRU5URVIgPSAxMjtcbmV4cG9ydCBjb25zdCBFTlRFUiA9IDEzO1xuZXhwb3J0IGNvbnN0IFNISUZUID0gMTY7XG5leHBvcnQgY29uc3QgQ09OVFJPTCA9IDE3O1xuZXhwb3J0IGNvbnN0IEFMVCA9IDE4O1xuZXhwb3J0IGNvbnN0IFBBVVNFID0gMTk7XG5leHBvcnQgY29uc3QgQ0FQU19MT0NLID0gMjA7XG5leHBvcnQgY29uc3QgRVNDQVBFID0gMjc7XG5leHBvcnQgY29uc3QgU1BBQ0UgPSAzMjtcbmV4cG9ydCBjb25zdCBQQUdFX1VQID0gMzM7XG5leHBvcnQgY29uc3QgUEFHRV9ET1dOID0gMzQ7XG5leHBvcnQgY29uc3QgRU5EID0gMzU7XG5leHBvcnQgY29uc3QgSE9NRSA9IDM2O1xuZXhwb3J0IGNvbnN0IExFRlRfQVJST1cgPSAzNztcbmV4cG9ydCBjb25zdCBVUF9BUlJPVyA9IDM4O1xuZXhwb3J0IGNvbnN0IFJJR0hUX0FSUk9XID0gMzk7XG5leHBvcnQgY29uc3QgRE9XTl9BUlJPVyA9IDQwO1xuZXhwb3J0IGNvbnN0IFBMVVNfU0lHTiA9IDQzO1xuZXhwb3J0IGNvbnN0IFBSSU5UX1NDUkVFTiA9IDQ0O1xuZXhwb3J0IGNvbnN0IElOU0VSVCA9IDQ1O1xuZXhwb3J0IGNvbnN0IERFTEVURSA9IDQ2O1xuZXhwb3J0IGNvbnN0IFpFUk8gPSA0ODtcbmV4cG9ydCBjb25zdCBPTkUgPSA0OTtcbmV4cG9ydCBjb25zdCBUV08gPSA1MDtcbmV4cG9ydCBjb25zdCBUSFJFRSA9IDUxO1xuZXhwb3J0IGNvbnN0IEZPVVIgPSA1MjtcbmV4cG9ydCBjb25zdCBGSVZFID0gNTM7XG5leHBvcnQgY29uc3QgU0lYID0gNTQ7XG5leHBvcnQgY29uc3QgU0VWRU4gPSA1NTtcbmV4cG9ydCBjb25zdCBFSUdIVCA9IDU2O1xuZXhwb3J0IGNvbnN0IE5JTkUgPSA1NztcbmV4cG9ydCBjb25zdCBGRl9TRU1JQ09MT04gPSA1OTsgLy8gRmlyZWZveCAoR2Vja28pIGZpcmVzIHRoaXMgZm9yIHNlbWljb2xvbiBpbnN0ZWFkIG9mIDE4NlxuZXhwb3J0IGNvbnN0IEZGX0VRVUFMUyA9IDYxOyAvLyBGaXJlZm94IChHZWNrbykgZmlyZXMgdGhpcyBmb3IgZXF1YWxzIGluc3RlYWQgb2YgMTg3XG5leHBvcnQgY29uc3QgUVVFU1RJT05fTUFSSyA9IDYzO1xuZXhwb3J0IGNvbnN0IEFUX1NJR04gPSA2NDtcbmV4cG9ydCBjb25zdCBBID0gNjU7XG5leHBvcnQgY29uc3QgQiA9IDY2O1xuZXhwb3J0IGNvbnN0IEMgPSA2NztcbmV4cG9ydCBjb25zdCBEID0gNjg7XG5leHBvcnQgY29uc3QgRSA9IDY5O1xuZXhwb3J0IGNvbnN0IEYgPSA3MDtcbmV4cG9ydCBjb25zdCBHID0gNzE7XG5leHBvcnQgY29uc3QgSCA9IDcyO1xuZXhwb3J0IGNvbnN0IEkgPSA3MztcbmV4cG9ydCBjb25zdCBKID0gNzQ7XG5leHBvcnQgY29uc3QgSyA9IDc1O1xuZXhwb3J0IGNvbnN0IEwgPSA3NjtcbmV4cG9ydCBjb25zdCBNID0gNzc7XG5leHBvcnQgY29uc3QgTiA9IDc4O1xuZXhwb3J0IGNvbnN0IE8gPSA3OTtcbmV4cG9ydCBjb25zdCBQID0gODA7XG5leHBvcnQgY29uc3QgUSA9IDgxO1xuZXhwb3J0IGNvbnN0IFIgPSA4MjtcbmV4cG9ydCBjb25zdCBTID0gODM7XG5leHBvcnQgY29uc3QgVCA9IDg0O1xuZXhwb3J0IGNvbnN0IFUgPSA4NTtcbmV4cG9ydCBjb25zdCBWID0gODY7XG5leHBvcnQgY29uc3QgVyA9IDg3O1xuZXhwb3J0IGNvbnN0IFggPSA4ODtcbmV4cG9ydCBjb25zdCBZID0gODk7XG5leHBvcnQgY29uc3QgWiA9IDkwO1xuZXhwb3J0IGNvbnN0IE1FVEEgPSA5MTsgLy8gV0lOX0tFWV9MRUZUXG5leHBvcnQgY29uc3QgTUFDX1dLX0NNRF9MRUZUID0gOTE7XG5leHBvcnQgY29uc3QgTUFDX1dLX0NNRF9SSUdIVCA9IDkzO1xuZXhwb3J0IGNvbnN0IENPTlRFWFRfTUVOVSA9IDkzO1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9aRVJPID0gOTY7XG5leHBvcnQgY29uc3QgTlVNUEFEX09ORSA9IDk3O1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9UV08gPSA5ODtcbmV4cG9ydCBjb25zdCBOVU1QQURfVEhSRUUgPSA5OTtcbmV4cG9ydCBjb25zdCBOVU1QQURfRk9VUiA9IDEwMDtcbmV4cG9ydCBjb25zdCBOVU1QQURfRklWRSA9IDEwMTtcbmV4cG9ydCBjb25zdCBOVU1QQURfU0lYID0gMTAyO1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9TRVZFTiA9IDEwMztcbmV4cG9ydCBjb25zdCBOVU1QQURfRUlHSFQgPSAxMDQ7XG5leHBvcnQgY29uc3QgTlVNUEFEX05JTkUgPSAxMDU7XG5leHBvcnQgY29uc3QgTlVNUEFEX01VTFRJUExZID0gMTA2O1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9QTFVTID0gMTA3O1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9NSU5VUyA9IDEwOTtcbmV4cG9ydCBjb25zdCBOVU1QQURfUEVSSU9EID0gMTEwO1xuZXhwb3J0IGNvbnN0IE5VTVBBRF9ESVZJREUgPSAxMTE7XG5leHBvcnQgY29uc3QgRjEgPSAxMTI7XG5leHBvcnQgY29uc3QgRjIgPSAxMTM7XG5leHBvcnQgY29uc3QgRjMgPSAxMTQ7XG5leHBvcnQgY29uc3QgRjQgPSAxMTU7XG5leHBvcnQgY29uc3QgRjUgPSAxMTY7XG5leHBvcnQgY29uc3QgRjYgPSAxMTc7XG5leHBvcnQgY29uc3QgRjcgPSAxMTg7XG5leHBvcnQgY29uc3QgRjggPSAxMTk7XG5leHBvcnQgY29uc3QgRjkgPSAxMjA7XG5leHBvcnQgY29uc3QgRjEwID0gMTIxO1xuZXhwb3J0IGNvbnN0IEYxMSA9IDEyMjtcbmV4cG9ydCBjb25zdCBGMTIgPSAxMjM7XG5leHBvcnQgY29uc3QgTlVNX0xPQ0sgPSAxNDQ7XG5leHBvcnQgY29uc3QgU0NST0xMX0xPQ0sgPSAxNDU7XG5leHBvcnQgY29uc3QgRklSU1RfTUVESUEgPSAxNjY7XG5leHBvcnQgY29uc3QgRkZfTUlOVVMgPSAxNzM7XG5leHBvcnQgY29uc3QgTVVURSA9IDE3MzsgLy8gRmlyZWZveCAoR2Vja28pIGZpcmVzIDE4MSBmb3IgTVVURVxuZXhwb3J0IGNvbnN0IFZPTFVNRV9ET1dOID0gMTc0OyAvLyBGaXJlZm94IChHZWNrbykgZmlyZXMgMTgyIGZvciBWT0xVTUVfRE9XTlxuZXhwb3J0IGNvbnN0IFZPTFVNRV9VUCA9IDE3NTsgLy8gRmlyZWZveCAoR2Vja28pIGZpcmVzIDE4MyBmb3IgVk9MVU1FX1VQXG5leHBvcnQgY29uc3QgRkZfTVVURSA9IDE4MTtcbmV4cG9ydCBjb25zdCBGRl9WT0xVTUVfRE9XTiA9IDE4MjtcbmV4cG9ydCBjb25zdCBMQVNUX01FRElBID0gMTgzO1xuZXhwb3J0IGNvbnN0IEZGX1ZPTFVNRV9VUCA9IDE4MztcbmV4cG9ydCBjb25zdCBTRU1JQ09MT04gPSAxODY7IC8vIEZpcmVmb3ggKEdlY2tvKSBmaXJlcyA1OSBmb3IgU0VNSUNPTE9OXG5leHBvcnQgY29uc3QgRVFVQUxTID0gMTg3OyAvLyBGaXJlZm94IChHZWNrbykgZmlyZXMgNjEgZm9yIEVRVUFMU1xuZXhwb3J0IGNvbnN0IENPTU1BID0gMTg4O1xuZXhwb3J0IGNvbnN0IERBU0ggPSAxODk7IC8vIEZpcmVmb3ggKEdlY2tvKSBmaXJlcyAxNzMgZm9yIERBU0gvTUlOVVNcbmV4cG9ydCBjb25zdCBQRVJJT0QgPSAxOTA7XG5leHBvcnQgY29uc3QgU0xBU0ggPSAxOTE7XG5leHBvcnQgY29uc3QgQVBPU1RST1BIRSA9IDE5MjtcbmV4cG9ydCBjb25zdCBUSUxERSA9IDE5MjtcbmV4cG9ydCBjb25zdCBPUEVOX1NRVUFSRV9CUkFDS0VUID0gMjE5O1xuZXhwb3J0IGNvbnN0IEJBQ0tTTEFTSCA9IDIyMDtcbmV4cG9ydCBjb25zdCBDTE9TRV9TUVVBUkVfQlJBQ0tFVCA9IDIyMTtcbmV4cG9ydCBjb25zdCBTSU5HTEVfUVVPVEUgPSAyMjI7XG5leHBvcnQgY29uc3QgTUFDX01FVEEgPSAyMjQ7XG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y29kZXNfcHVibGljX2luZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay9rZXljb2Rlcy9rZXljb2Rlc19wdWJsaWNfaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -1,18 +0,0 @@
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
- /**
9
- * Checks whether a modifier key is pressed.
10
- * @param event Event to be checked.
11
- */
12
- export function hasModifierKey(event, ...modifiers) {
13
- if (modifiers.length) {
14
- return modifiers.some(modifier => event[modifier]);
15
- }
16
- return event.altKey || event.shiftKey || event.ctrlKey || event.metaKey;
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kaWZpZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay9rZXljb2Rlcy9tb2RpZmllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBSUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFvQixFQUFFLEdBQUcsU0FBd0I7SUFDOUUsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmV4cG9ydCB0eXBlIE1vZGlmaWVyS2V5ID0gJ2FsdEtleScgfCAnc2hpZnRLZXknIHwgJ2N0cmxLZXknIHwgJ21ldGFLZXknO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbW9kaWZpZXIga2V5IGlzIHByZXNzZWQuXG4gKiBAcGFyYW0gZXZlbnQgRXZlbnQgdG8gYmUgY2hlY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc01vZGlmaWVyS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCAuLi5tb2RpZmllcnM6IE1vZGlmaWVyS2V5W10pOiBib29sZWFuIHtcbiAgaWYgKG1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbW9kaWZpZXJzLnNvbWUobW9kaWZpZXIgPT4gZXZlbnRbbW9kaWZpZXJdKTtcbiAgfVxuXG4gIHJldHVybiBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5O1xufVxuIl19
@@ -1,10 +0,0 @@
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 './keycodes';
9
- export * from './modifiers';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsva2V5Y29kZXMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2tleWNvZGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kaWZpZXJzJztcbiJdfQ==