@angular/material 12.0.0-rc.2 → 12.0.2

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 (215) hide show
  1. package/_index.scss +2 -1
  2. package/_theming.scss +39 -4
  3. package/autocomplete/_autocomplete-legacy-index.scss +2 -0
  4. package/badge/_badge-legacy-index.scss +3 -0
  5. package/bottom-sheet/_bottom-sheet-legacy-index.scss +2 -0
  6. package/bottom-sheet/bottom-sheet-container.d.ts +0 -2
  7. package/bottom-sheet/index.metadata.json +1 -1
  8. package/bundles/material-bottom-sheet.umd.js +7 -15
  9. package/bundles/material-bottom-sheet.umd.js.map +1 -1
  10. package/bundles/material-checkbox.umd.js +1 -1
  11. package/bundles/material-checkbox.umd.js.map +1 -1
  12. package/bundles/material-core.umd.js +2 -2
  13. package/bundles/material-core.umd.js.map +1 -1
  14. package/bundles/material-datepicker.umd.js +33 -17
  15. package/bundles/material-datepicker.umd.js.map +1 -1
  16. package/bundles/material-dialog.umd.js +11 -19
  17. package/bundles/material-dialog.umd.js.map +1 -1
  18. package/bundles/material-input.umd.js +7 -1
  19. package/bundles/material-input.umd.js.map +1 -1
  20. package/bundles/material-slide-toggle.umd.js +4 -4
  21. package/bundles/material-slide-toggle.umd.js.map +1 -1
  22. package/bundles/material-sort.umd.js +7 -1
  23. package/bundles/material-sort.umd.js.map +1 -1
  24. package/bundles/material-stepper.umd.js +2 -2
  25. package/bundles/material-stepper.umd.js.map +1 -1
  26. package/bundles/material-table-testing.umd.js +103 -143
  27. package/bundles/material-table-testing.umd.js.map +1 -1
  28. package/bundles/material-table.umd.js.map +1 -1
  29. package/bundles/material-tabs.umd.js +4 -2
  30. package/bundles/material-tabs.umd.js.map +1 -1
  31. package/bundles/material-tooltip.umd.js +19 -15
  32. package/bundles/material-tooltip.umd.js.map +1 -1
  33. package/button/_button-legacy-index.scss +19 -0
  34. package/button-toggle/_button-toggle-legacy-index.scss +2 -0
  35. package/card/_card-legacy-index.scss +2 -0
  36. package/checkbox/_checkbox-legacy-index.scss +2 -0
  37. package/checkbox/index.metadata.json +1 -1
  38. package/chips/_chips-legacy-index.scss +6 -0
  39. package/core/_core-legacy-index.scss +17 -0
  40. package/core/color/_color-legacy-index.scss +1 -0
  41. package/core/density/private/_density-legacy-index.scss +5 -0
  42. package/core/focus-indicators/_focus-indicators-legacy-index.scss +5 -0
  43. package/core/focus-indicators/_focus-indicators.import.scss +1 -1
  44. package/core/focus-indicators/_focus-indicators.scss +4 -0
  45. package/core/index.metadata.json +1 -1
  46. package/core/option/_option-legacy-index.scss +5 -0
  47. package/core/ripple/_ripple-legacy-index.scss +3 -0
  48. package/core/ripple/ripple.d.ts +3 -3
  49. package/core/selection/pseudo-checkbox/_pseudo-checkbox-legacy-index.scss +2 -0
  50. package/core/style/_style-legacy-index.scss +24 -0
  51. package/core/theming/_theming-legacy-index.scss +22 -0
  52. package/core/typography/_typography-legacy-index.scss +18 -0
  53. package/datepicker/_datepicker-legacy-index.scss +9 -0
  54. package/datepicker/date-range-input.d.ts +2 -0
  55. package/datepicker/datepicker-base.d.ts +7 -2
  56. package/datepicker/datepicker-input.d.ts +4 -2
  57. package/datepicker/index.metadata.json +1 -1
  58. package/dialog/_dialog-legacy-index.scss +2 -0
  59. package/dialog/dialog-container.d.ts +0 -2
  60. package/dialog/index.metadata.json +1 -1
  61. package/divider/_divider-legacy-index.scss +3 -0
  62. package/esm2015/bottom-sheet/bottom-sheet-container.js +5 -12
  63. package/esm2015/checkbox/checkbox.js +2 -2
  64. package/esm2015/core/common-behaviors/common-module.js +1 -1
  65. package/esm2015/core/ripple/ripple.js +1 -1
  66. package/esm2015/core/version.js +1 -1
  67. package/esm2015/datepicker/date-range-input-parts.js +3 -2
  68. package/esm2015/datepicker/date-range-input.js +5 -1
  69. package/esm2015/datepicker/datepicker-base.js +16 -11
  70. package/esm2015/datepicker/datepicker-input.js +8 -1
  71. package/esm2015/datepicker/datepicker-intl.js +3 -3
  72. package/esm2015/dialog/dialog-container.js +5 -12
  73. package/esm2015/input/input.js +9 -3
  74. package/esm2015/slide-toggle/slide-toggle.js +5 -5
  75. package/esm2015/sort/sort-header.js +8 -2
  76. package/esm2015/stepper/step-header.js +3 -3
  77. package/esm2015/table/table-data-source.js +1 -1
  78. package/esm2015/table/testing/cell-harness.js +9 -9
  79. package/esm2015/table/testing/row-harness.js +38 -70
  80. package/esm2015/table/testing/table-harness.js +23 -15
  81. package/esm2015/tabs/tab-group.js +4 -2
  82. package/esm2015/tabs/tab.js +3 -3
  83. package/esm2015/tooltip/tooltip.js +12 -8
  84. package/expansion/_expansion-legacy-index.scss +3 -0
  85. package/fesm2015/bottom-sheet.js +4 -11
  86. package/fesm2015/bottom-sheet.js.map +1 -1
  87. package/fesm2015/checkbox.js +1 -1
  88. package/fesm2015/checkbox.js.map +1 -1
  89. package/fesm2015/core.js +2 -2
  90. package/fesm2015/core.js.map +1 -1
  91. package/fesm2015/datepicker.js +30 -13
  92. package/fesm2015/datepicker.js.map +1 -1
  93. package/fesm2015/dialog.js +4 -11
  94. package/fesm2015/dialog.js.map +1 -1
  95. package/fesm2015/input.js +8 -2
  96. package/fesm2015/input.js.map +1 -1
  97. package/fesm2015/slide-toggle.js +4 -4
  98. package/fesm2015/slide-toggle.js.map +1 -1
  99. package/fesm2015/sort.js +7 -1
  100. package/fesm2015/sort.js.map +1 -1
  101. package/fesm2015/stepper.js +2 -2
  102. package/fesm2015/stepper.js.map +1 -1
  103. package/fesm2015/table/testing.js +66 -90
  104. package/fesm2015/table/testing.js.map +1 -1
  105. package/fesm2015/table.js.map +1 -1
  106. package/fesm2015/tabs.js +4 -2
  107. package/fesm2015/tabs.js.map +1 -1
  108. package/fesm2015/tooltip.js +11 -7
  109. package/fesm2015/tooltip.js.map +1 -1
  110. package/form-field/_form-field-legacy-index.scss +24 -0
  111. package/grid-list/_grid-list-legacy-index.scss +2 -0
  112. package/icon/_icon-legacy-index.scss +2 -0
  113. package/input/_input-legacy-index.scss +2 -0
  114. package/input/index.metadata.json +1 -1
  115. package/list/_list-legacy-index.scss +2 -0
  116. package/menu/_menu-legacy-index.scss +2 -0
  117. package/package.json +6 -6
  118. package/paginator/_paginator-legacy-index.scss +2 -0
  119. package/prebuilt-themes/deeppurple-amber.css +1 -1
  120. package/prebuilt-themes/indigo-pink.css +1 -1
  121. package/prebuilt-themes/pink-bluegrey.css +1 -1
  122. package/prebuilt-themes/purple-green.css +1 -1
  123. package/progress-bar/_progress-bar-legacy-index.scss +2 -0
  124. package/progress-spinner/_progress-spinner-legacy-index.scss +2 -0
  125. package/radio/_radio-legacy-index.scss +2 -0
  126. package/schematics/collection.json +0 -6
  127. package/schematics/ng-add/fonts/material-fonts.mjs +46 -0
  128. package/schematics/ng-add/index.js +2 -2
  129. package/schematics/ng-add/index.mjs +55 -0
  130. package/schematics/ng-add/package-config.mjs +47 -0
  131. package/schematics/ng-add/schema.mjs +10 -0
  132. package/schematics/ng-add/setup-project.mjs +121 -0
  133. package/schematics/ng-add/theming/create-custom-theme.mjs +51 -0
  134. package/schematics/ng-add/theming/theming.mjs +165 -0
  135. package/schematics/ng-generate/address-form/index.mjs +49 -0
  136. package/schematics/ng-generate/address-form/schema.mjs +10 -0
  137. package/schematics/ng-generate/dashboard/index.mjs +49 -0
  138. package/schematics/ng-generate/dashboard/schema.mjs +10 -0
  139. package/schematics/ng-generate/navigation/index.mjs +49 -0
  140. package/schematics/ng-generate/navigation/schema.mjs +10 -0
  141. package/schematics/ng-generate/table/index.mjs +46 -0
  142. package/schematics/ng-generate/table/schema.mjs +10 -0
  143. package/schematics/ng-generate/tree/index.mjs +46 -0
  144. package/schematics/ng-generate/tree/schema.mjs +10 -0
  145. package/schematics/ng-update/data/attribute-selectors.mjs +12 -0
  146. package/schematics/ng-update/data/class-names.mjs +32 -0
  147. package/schematics/ng-update/data/constructor-checks.mjs +143 -0
  148. package/schematics/ng-update/data/css-selectors.mjs +46 -0
  149. package/schematics/ng-update/data/element-selectors.mjs +18 -0
  150. package/schematics/ng-update/data/index.mjs +29 -0
  151. package/schematics/ng-update/data/input-names.mjs +76 -0
  152. package/schematics/ng-update/data/method-call-checks.mjs +22 -0
  153. package/schematics/ng-update/data/output-names.mjs +101 -0
  154. package/schematics/ng-update/data/property-names.mjs +173 -0
  155. package/schematics/ng-update/index.js +3 -1
  156. package/schematics/ng-update/index.mjs +78 -0
  157. package/schematics/ng-update/migrations/hammer-gestures-v9/find-hammer-script-tags.mjs +42 -0
  158. package/schematics/ng-update/migrations/hammer-gestures-v9/find-main-module.mjs +32 -0
  159. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.mjs +778 -0
  160. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-template-check.mjs +56 -0
  161. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.mjs +370 -0
  162. package/schematics/ng-update/migrations/hammer-gestures-v9/remove-array-element.mjs +66 -0
  163. package/schematics/ng-update/migrations/hammer-gestures-v9/remove-element-from-html.mjs +28 -0
  164. package/schematics/ng-update/migrations/misc-checks/misc-class-inheritance.mjs +48 -0
  165. package/schematics/ng-update/migrations/misc-checks/misc-class-names.mjs +43 -0
  166. package/schematics/ng-update/migrations/misc-checks/misc-imports.mjs +54 -0
  167. package/schematics/ng-update/migrations/misc-checks/misc-property-names.mjs +47 -0
  168. package/schematics/ng-update/migrations/misc-checks/misc-template.mjs +60 -0
  169. package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor-migration.mjs +138 -0
  170. package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor.mjs +30 -0
  171. package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.mjs +169 -0
  172. package/schematics/{ng-generate/theming-api → ng-update/migrations/theming-api-v12}/config.d.ts +6 -0
  173. package/schematics/ng-update/migrations/theming-api-v12/config.js +206 -0
  174. package/schematics/ng-update/migrations/theming-api-v12/config.mjs +206 -0
  175. package/schematics/{ng-generate/theming-api → ng-update/migrations/theming-api-v12}/migration.d.ts +0 -0
  176. package/schematics/ng-update/migrations/theming-api-v12/migration.js +234 -0
  177. package/schematics/ng-update/migrations/theming-api-v12/migration.mjs +234 -0
  178. package/schematics/ng-update/migrations/theming-api-v12/theming-api-migration.d.ts +18 -0
  179. package/schematics/ng-update/migrations/theming-api-v12/theming-api-migration.js +45 -0
  180. package/schematics/ng-update/migrations/theming-api-v12/theming-api-migration.mjs +45 -0
  181. package/schematics/ng-update/typescript/module-specifiers.mjs +35 -0
  182. package/schematics/ng-update/upgrade-data.mjs +24 -0
  183. package/schematics/paths.mjs +16 -0
  184. package/schematics/schematics.externs.js +0 -0
  185. package/select/_select-legacy-index.scss +2 -0
  186. package/sidenav/_sidenav-legacy-index.scss +2 -0
  187. package/slide-toggle/_slide-toggle-legacy-index.scss +3 -0
  188. package/slide-toggle/index.metadata.json +1 -1
  189. package/slide-toggle/slide-toggle.d.ts +3 -2
  190. package/slider/_slider-legacy-index.scss +2 -0
  191. package/snack-bar/_snack-bar-legacy-index.scss +2 -0
  192. package/sort/_sort-legacy-index.scss +2 -0
  193. package/sort/sort-header.d.ts +1 -1
  194. package/stepper/_stepper-legacy-index.scss +7 -0
  195. package/stepper/index.metadata.json +1 -1
  196. package/table/_table-legacy-index.scss +3 -0
  197. package/table/index.metadata.json +1 -1
  198. package/table/table-data-source.d.ts +17 -5
  199. package/table/testing/cell-harness.d.ts +2 -1
  200. package/table/testing/row-harness.d.ts +21 -22
  201. package/table/testing/table-harness.d.ts +32 -13
  202. package/tabs/_tabs-legacy-index.scss +6 -0
  203. package/tabs/_tabs-theme.scss +5 -2
  204. package/tabs/index.metadata.json +1 -1
  205. package/toolbar/_toolbar-legacy-index.scss +4 -0
  206. package/tooltip/_tooltip-legacy-index.scss +3 -0
  207. package/tooltip/index.metadata.json +1 -1
  208. package/tree/_tree-legacy-index.scss +2 -0
  209. package/schematics/ng-generate/theming-api/config.js +0 -183
  210. package/schematics/ng-generate/theming-api/index.d.ts +0 -10
  211. package/schematics/ng-generate/theming-api/index.js +0 -26
  212. package/schematics/ng-generate/theming-api/migration.js +0 -226
  213. package/schematics/ng-generate/theming-api/schema.d.ts +0 -9
  214. package/schematics/ng-generate/theming-api/schema.js +0 -10
  215. package/schematics/ng-generate/theming-api/schema.json +0 -7
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.unprefixedRemovedVariables = exports.removedMaterialVariables = exports.cdkMixins = exports.cdkVariables = exports.materialVariables = exports.materialFunctions = exports.materialMixins = void 0;
11
+ /** Mapping of Material mixins that should be renamed. */
12
+ exports.materialMixins = {
13
+ 'mat-core': 'core',
14
+ 'mat-core-color': 'core-color',
15
+ 'mat-core-theme': 'core-theme',
16
+ 'angular-material-theme': 'all-component-themes',
17
+ 'angular-material-typography': 'all-component-typographies',
18
+ 'angular-material-color': 'all-component-colors',
19
+ 'mat-base-typography': 'typography-hierarchy',
20
+ 'mat-typography-level-to-styles': 'typography-level',
21
+ 'mat-elevation': 'elevation',
22
+ 'mat-overridable-elevation': 'overridable-elevation',
23
+ 'mat-elevation-transition': 'elevation-transition',
24
+ 'mat-ripple': 'ripple',
25
+ 'mat-ripple-color': 'ripple-color',
26
+ 'mat-ripple-theme': 'ripple-theme',
27
+ 'mat-strong-focus-indicators': 'strong-focus-indicators',
28
+ 'mat-strong-focus-indicators-color': 'strong-focus-indicators-color',
29
+ 'mat-strong-focus-indicators-theme': 'strong-focus-indicators-theme',
30
+ 'mat-font-shorthand': 'font-shorthand',
31
+ // The expansion panel is a special case, because the package is called `expansion`, but the
32
+ // mixins were prefixed with `expansion-panel`. This was corrected by the Sass module migration.
33
+ 'mat-expansion-panel-theme': 'expansion-theme',
34
+ 'mat-expansion-panel-color': 'expansion-color',
35
+ 'mat-expansion-panel-typography': 'expansion-typography',
36
+ };
37
+ // The component themes all follow the same pattern so we can spare ourselves some typing.
38
+ [
39
+ 'option', 'optgroup', 'pseudo-checkbox', 'autocomplete', 'badge', 'bottom-sheet', 'button',
40
+ 'button-toggle', 'card', 'checkbox', 'chips', 'divider', 'table', 'datepicker', 'dialog',
41
+ 'grid-list', 'icon', 'input', 'list', 'menu', 'paginator', 'progress-bar', 'progress-spinner',
42
+ 'radio', 'select', 'sidenav', 'slide-toggle', 'slider', 'stepper', 'sort', 'tabs', 'toolbar',
43
+ 'tooltip', 'snack-bar', 'form-field', 'tree'
44
+ ].forEach(name => {
45
+ exports.materialMixins[`mat-${name}-theme`] = `${name}-theme`;
46
+ exports.materialMixins[`mat-${name}-color`] = `${name}-color`;
47
+ exports.materialMixins[`mat-${name}-typography`] = `${name}-typography`;
48
+ });
49
+ /** Mapping of Material functions that should be renamed. */
50
+ exports.materialFunctions = {
51
+ 'mat-color': 'get-color-from-palette',
52
+ 'mat-contrast': 'get-contrast-color-from-palette',
53
+ 'mat-palette': 'define-palette',
54
+ 'mat-dark-theme': 'define-dark-theme',
55
+ 'mat-light-theme': 'define-light-theme',
56
+ 'mat-typography-level': 'define-typography-level',
57
+ 'mat-typography-config': 'define-typography-config',
58
+ 'mat-font-size': 'font-size',
59
+ 'mat-line-height': 'line-height',
60
+ 'mat-font-weight': 'font-weight',
61
+ 'mat-letter-spacing': 'letter-spacing',
62
+ 'mat-font-family': 'font-family',
63
+ };
64
+ /** Mapping of Material variables that should be renamed. */
65
+ exports.materialVariables = {
66
+ 'mat-light-theme-background': 'light-theme-background-palette',
67
+ 'mat-dark-theme-background': 'dark-theme-background-palette',
68
+ 'mat-light-theme-foreground': 'light-theme-foreground-palette',
69
+ 'mat-dark-theme-foreground': 'dark-theme-foreground-palette',
70
+ };
71
+ // The palettes all follow the same pattern.
72
+ [
73
+ 'red', 'pink', 'indigo', 'purple', 'deep-purple', 'blue', 'light-blue', 'cyan', 'teal', 'green',
74
+ 'light-green', 'lime', 'yellow', 'amber', 'orange', 'deep-orange', 'brown', 'grey', 'gray',
75
+ 'blue-grey', 'blue-gray'
76
+ ].forEach(name => exports.materialVariables[`mat-${name}`] = `${name}-palette`);
77
+ /** Mapping of CDK variables that should be renamed. */
78
+ exports.cdkVariables = {
79
+ 'cdk-z-index-overlay-container': 'overlay-container-z-index',
80
+ 'cdk-z-index-overlay': 'overlay-z-index',
81
+ 'cdk-z-index-overlay-backdrop': 'overlay-backdrop-z-index',
82
+ 'cdk-overlay-dark-backdrop-background': 'overlay-backdrop-color',
83
+ };
84
+ /** Mapping of CDK mixins that should be renamed. */
85
+ exports.cdkMixins = {
86
+ 'cdk-overlay': 'overlay',
87
+ 'cdk-a11y': 'a11y-visually-hidden',
88
+ 'cdk-high-contrast': 'high-contrast',
89
+ 'cdk-text-field-autofill-color': 'text-field-autofill-color',
90
+ // This one was split up into two mixins which is trickier to
91
+ // migrate so for now we forward to the deprecated variant.
92
+ 'cdk-text-field': 'text-field',
93
+ };
94
+ /**
95
+ * Material variables that have been removed from the public API
96
+ * and which should be replaced with their values.
97
+ */
98
+ exports.removedMaterialVariables = {
99
+ // Note: there's also a usage of a variable called `$pi`, but the name is short enough that
100
+ // it matches things like `$mat-pink`. Don't migrate it since it's unlikely to be used.
101
+ 'mat-xsmall': 'max-width: 599px',
102
+ 'mat-small': 'max-width: 959px',
103
+ 'mat-toggle-padding': '8px',
104
+ 'mat-toggle-size': '20px',
105
+ 'mat-linear-out-slow-in-timing-function': 'cubic-bezier(0, 0, 0.2, 0.1)',
106
+ 'mat-fast-out-slow-in-timing-function': 'cubic-bezier(0.4, 0, 0.2, 1)',
107
+ 'mat-fast-out-linear-in-timing-function': 'cubic-bezier(0.4, 0, 1, 1)',
108
+ 'mat-elevation-transition-duration': '280ms',
109
+ 'mat-elevation-transition-timing-function': 'cubic-bezier(0.4, 0, 0.2, 1)',
110
+ 'mat-elevation-color': '#000',
111
+ 'mat-elevation-opacity': '1',
112
+ 'mat-elevation-prefix': `'mat-elevation-z'`,
113
+ 'mat-ripple-color-opacity': '0.1',
114
+ 'mat-badge-font-size': '12px',
115
+ 'mat-badge-font-weight': '600',
116
+ 'mat-badge-default-size': '22px',
117
+ 'mat-badge-small-size': '16px',
118
+ 'mat-badge-large-size': '28px',
119
+ 'mat-button-toggle-standard-height': '48px',
120
+ 'mat-button-toggle-standard-minimum-height': '24px',
121
+ 'mat-button-toggle-standard-maximum-height': '48px',
122
+ 'mat-chip-remove-font-size': '18px',
123
+ 'mat-datepicker-selected-today-box-shadow-width': '1px',
124
+ 'mat-datepicker-selected-fade-amount': '0.6',
125
+ 'mat-datepicker-range-fade-amount': '0.2',
126
+ 'mat-datepicker-today-fade-amount': '0.2',
127
+ 'mat-calendar-body-font-size': '13px',
128
+ 'mat-calendar-weekday-table-font-size': '11px',
129
+ 'mat-expansion-panel-header-collapsed-height': '48px',
130
+ 'mat-expansion-panel-header-collapsed-minimum-height': '36px',
131
+ 'mat-expansion-panel-header-collapsed-maximum-height': '48px',
132
+ 'mat-expansion-panel-header-expanded-height': '64px',
133
+ 'mat-expansion-panel-header-expanded-minimum-height': '48px',
134
+ 'mat-expansion-panel-header-expanded-maximum-height': '64px',
135
+ 'mat-expansion-panel-header-transition': '225ms cubic-bezier(0.4, 0, 0.2, 1)',
136
+ 'mat-paginator-height': '56px',
137
+ 'mat-paginator-minimum-height': '40px',
138
+ 'mat-paginator-maximum-height': '56px',
139
+ 'mat-stepper-header-height': '72px',
140
+ 'mat-stepper-header-minimum-height': '42px',
141
+ 'mat-stepper-header-maximum-height': '72px',
142
+ 'mat-stepper-label-header-height': '24px',
143
+ 'mat-stepper-label-position-bottom-top-gap': '16px',
144
+ 'mat-stepper-label-min-width': '50px',
145
+ 'mat-vertical-stepper-content-margin': '36px',
146
+ 'mat-stepper-side-gap': '24px',
147
+ 'mat-stepper-line-width': '1px',
148
+ 'mat-stepper-line-gap': '8px',
149
+ 'mat-step-sub-label-font-size': '12px',
150
+ 'mat-step-header-icon-size': '16px',
151
+ 'mat-toolbar-minimum-height': '44px',
152
+ 'mat-toolbar-height-desktop': '64px',
153
+ 'mat-toolbar-maximum-height-desktop': '64px',
154
+ 'mat-toolbar-minimum-height-desktop': '44px',
155
+ 'mat-toolbar-height-mobile': '56px',
156
+ 'mat-toolbar-maximum-height-mobile': '56px',
157
+ 'mat-toolbar-minimum-height-mobile': '44px',
158
+ 'mat-tooltip-target-height': '22px',
159
+ 'mat-tooltip-font-size': '10px',
160
+ 'mat-tooltip-vertical-padding': '6px',
161
+ 'mat-tooltip-handset-target-height': '30px',
162
+ 'mat-tooltip-handset-font-size': '14px',
163
+ 'mat-tooltip-handset-vertical-padding': '8px',
164
+ 'mat-tree-node-height': '48px',
165
+ 'mat-tree-node-minimum-height': '24px',
166
+ 'mat-tree-node-maximum-height': '48px',
167
+ };
168
+ /**
169
+ * Material variables **without a `mat-` prefix** that have been removed from the public API
170
+ * and which should be replaced with their values. These should be migrated only when there's a
171
+ * Material import, because their names could conflict with other variables in the user's app.
172
+ */
173
+ exports.unprefixedRemovedVariables = {
174
+ 'z-index-fab': '20',
175
+ 'z-index-drawer': '100',
176
+ 'ease-in-out-curve-function': 'cubic-bezier(0.35, 0, 0.25, 1)',
177
+ 'swift-ease-out-duration': '400ms',
178
+ 'swift-ease-out-timing-function': 'cubic-bezier(0.25, 0.8, 0.25, 1)',
179
+ 'swift-ease-out': 'all 400ms cubic-bezier(0.25, 0.8, 0.25, 1)',
180
+ 'swift-ease-in-duration': '300ms',
181
+ 'swift-ease-in-timing-function': 'cubic-bezier(0.55, 0, 0.55, 0.2)',
182
+ 'swift-ease-in': 'all 300ms cubic-bezier(0.55, 0, 0.55, 0.2)',
183
+ 'swift-ease-in-out-duration': '500ms',
184
+ 'swift-ease-in-out-timing-function': 'cubic-bezier(0.35, 0, 0.25, 1)',
185
+ 'swift-ease-in-out': 'all 500ms cubic-bezier(0.35, 0, 0.25, 1)',
186
+ 'swift-linear-duration': '80ms',
187
+ 'swift-linear-timing-function': 'linear',
188
+ 'swift-linear': 'all 80ms linear',
189
+ 'black-87-opacity': 'rgba(black, 0.87)',
190
+ 'white-87-opacity': 'rgba(white, 0.87)',
191
+ 'black-12-opacity': 'rgba(black, 0.12)',
192
+ 'white-12-opacity': 'rgba(white, 0.12)',
193
+ 'black-6-opacity': 'rgba(black, 0.06)',
194
+ 'white-6-opacity': 'rgba(white, 0.06)',
195
+ 'dark-primary-text': 'rgba(black, 0.87)',
196
+ 'dark-secondary-text': 'rgba(black, 0.54)',
197
+ 'dark-disabled-text': 'rgba(black, 0.38)',
198
+ 'dark-dividers': 'rgba(black, 0.12)',
199
+ 'dark-focused': 'rgba(black, 0.12)',
200
+ 'light-primary-text': 'white',
201
+ 'light-secondary-text': 'rgba(white, 0.7)',
202
+ 'light-disabled-text': 'rgba(white, 0.5)',
203
+ 'light-dividers': 'rgba(white, 0.12)',
204
+ 'light-focused': 'rgba(white, 0.12)',
205
+ };
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NjaGVtYXRpY3MvbmctdXBkYXRlL21pZ3JhdGlvbnMvdGhlbWluZy1hcGktdjEyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFFSCx5REFBeUQ7QUFDNUMsUUFBQSxjQUFjLEdBQTJCO0lBQ3BELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGdCQUFnQixFQUFFLFlBQVk7SUFDOUIsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5Qix3QkFBd0IsRUFBRSxzQkFBc0I7SUFDaEQsNkJBQTZCLEVBQUUsNEJBQTRCO0lBQzNELHdCQUF3QixFQUFFLHNCQUFzQjtJQUNoRCxxQkFBcUIsRUFBRSxzQkFBc0I7SUFDN0MsZ0NBQWdDLEVBQUUsa0JBQWtCO0lBQ3BELGVBQWUsRUFBRSxXQUFXO0lBQzVCLDJCQUEyQixFQUFFLHVCQUF1QjtJQUNwRCwwQkFBMEIsRUFBRSxzQkFBc0I7SUFDbEQsWUFBWSxFQUFFLFFBQVE7SUFDdEIsa0JBQWtCLEVBQUUsY0FBYztJQUNsQyxrQkFBa0IsRUFBRSxjQUFjO0lBQ2xDLDZCQUE2QixFQUFFLHlCQUF5QjtJQUN4RCxtQ0FBbUMsRUFBRSwrQkFBK0I7SUFDcEUsbUNBQW1DLEVBQUUsK0JBQStCO0lBQ3BFLG9CQUFvQixFQUFFLGdCQUFnQjtJQUN0Qyw0RkFBNEY7SUFDNUYsZ0dBQWdHO0lBQ2hHLDJCQUEyQixFQUFFLGlCQUFpQjtJQUM5QywyQkFBMkIsRUFBRSxpQkFBaUI7SUFDOUMsZ0NBQWdDLEVBQUUsc0JBQXNCO0NBQ3pELENBQUM7QUFFRiwwRkFBMEY7QUFDMUY7SUFDRSxRQUFRLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVE7SUFDMUYsZUFBZSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVB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LDhCQUE4QixFQUFFLFFBQVE7SUFDeEMsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxrQkFBa0IsRUFBRSxtQkFBbUI7SUFDdkMsa0JBQWtCLEVBQUUsbUJBQW1CO0lBQ3ZDLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxrQkFBa0IsRUFBRSxtQkFBbUI7SUFDdkMsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxtQkFBbUIsRUFBRSxtQkFBbUI7SUFDeEMscUJBQXFCLEVBQUUsbUJBQW1CO0lBQzFDLG9CQUFvQixFQUFFLG1CQUFtQjtJQUN6QyxlQUFlLEVBQUUsbUJBQW1CO0lBQ3BDLGNBQWMsRUFBRSxtQkFBbUI7SUFDbkMsb0JBQW9CLEVBQUUsT0FBTztJQUM3QixzQkFBc0IsRUFBRSxrQkFBa0I7SUFDMUMscUJBQXFCLEVBQUUsa0JBQWtCO0lBQ3pDLGdCQUFnQixFQUFFLG1CQUFtQjtJQUNyQyxlQUFlLEVBQUUsbUJBQW1CO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqIE1hcHBpbmcgb2YgTWF0ZXJpYWwgbWl4aW5zIHRoYXQgc2hvdWxkIGJlIHJlbmFtZWQuICovXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxNaXhpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdtYXQtY29yZSc6ICdjb3JlJyxcbiAgJ21hdC1jb3JlLWNvbG9yJzogJ2NvcmUtY29sb3InLFxuICAnbWF0LWNvcmUtdGhlbWUnOiAnY29yZS10aGVtZScsXG4gICdhbmd1bGFyLW1hdGVyaWFsLXRoZW1lJzogJ2FsbC1jb21wb25lbnQtdGhlbWVzJyxcbiAgJ2FuZ3VsYXItbWF0ZXJpYWwtdHlwb2dyYXBoeSc6ICdhbGwtY29tcG9uZW50LXR5cG9ncmFwaGllcycsXG4gICdhbmd1bGFyLW1hdGVyaWFsLWNvbG9yJzogJ2FsbC1jb21wb25lbnQtY29sb3JzJyxcbiAgJ21hdC1iYXNlLXR5cG9ncmFwaHknOiAndHlwb2dyYXBoeS1oaWVyYXJjaHknLFxuICAnbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzJzogJ3R5cG9ncmFwaHktbGV2ZWwnLFxuICAnbWF0LWVsZXZhdGlvbic6ICdlbGV2YXRpb24nLFxuICAnbWF0LW92ZXJyaWRhYmxlLWVsZXZhdGlvbic6ICdvdmVycmlkYWJsZS1lbGV2YXRpb24nLFxuICAnbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uJzogJ2VsZXZhdGlvbi10cmFuc2l0aW9uJyxcbiAgJ21hdC1yaXBwbGUnOiAncmlwcGxlJyxcbiAgJ21hdC1yaXBwbGUtY29sb3InOiAncmlwcGxlLWNvbG9yJyxcbiAgJ21hdC1yaXBwbGUtdGhlbWUnOiAncmlwcGxlLXRoZW1lJyxcbiAgJ21hdC1zdHJvbmctZm9jdXMtaW5kaWNhdG9ycyc6ICdzdHJvbmctZm9jdXMtaW5kaWNhdG9ycycsXG4gICdtYXQtc3Ryb25nLWZvY3VzLWluZGljYXRvcnMtY29sb3InOiAnc3Ryb25nLWZvY3VzLWluZGljYXRvcnMtY29sb3InLFxuICAnbWF0LXN0cm9uZy1mb2N1cy1pbmRpY2F0b3JzLXRoZW1lJzogJ3N0cm9uZy1mb2N1cy1pbmRpY2F0b3JzLXRoZW1lJyxcbiAgJ21hdC1mb250LXNob3J0aGFuZCc6ICdmb250LXNob3J0aGFuZCcsXG4gIC8vIFRoZSBleHBhbnNpb24gcGFuZWwgaXMgYSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UgdGhlIHBhY2thZ2UgaXMgY2FsbGVkIGBleHBhbnNpb25gLCBidXQgdGhlXG4gIC8vIG1peGlucyB3ZXJlIHByZWZpeGVkIHdpdGggYGV4cGFuc2lvbi1wYW5lbGAuIFRoaXMgd2FzIGNvcnJlY3RlZCBieSB0aGUgU2FzcyBtb2R1bGUgbWlncmF0aW9uLlxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC10aGVtZSc6ICdleHBhbnNpb24tdGhlbWUnLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC1jb2xvcic6ICdleHBhbnNpb24tY29sb3InLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC10eXBvZ3JhcGh5JzogJ2V4cGFuc2lvbi10eXBvZ3JhcGh5Jyxcbn07XG5cbi8vIFRoZSBjb21wb25lbnQgdGhlbWVzIGFsbCBmb2xsb3cgdGhlIHNhbWUgcGF0dGVybiBzbyB3ZSBjYW4gc3BhcmUgb3Vyc2VsdmVzIHNvbWUgdHlwaW5nLlxuW1xuICAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3BzZXVkby1jaGVja2JveCcsICdhdXRvY29tcGxldGUnLCAnYmFkZ2UnLCAnYm90dG9tLXNoZWV0JywgJ2J1dHRvbicsXG4gICdidXR0b24tdG9nZ2xlJywgJ2NhcmQnLCAnY2hlY2tib3gnLCAnY2hpcHMnLCAnZGl2aWRlcicsICd0YWJsZScsICdkYXRlcGlja2VyJywgJ2RpYWxvZycsXG4gICdncmlkLWxpc3QnLCAnaWNvbicsICdpbnB1dCcsICdsaXN0JywgJ21lbnUnLCAncGFnaW5hdG9yJywgJ3Byb2dyZXNzLWJhcicsICdwcm9ncmVzcy1zcGlubmVyJyxcbiAgJ3JhZGlvJywgJ3NlbGVjdCcsICdzaWRlbmF2JywgJ3NsaWRlLXRvZ2dsZScsICdzbGlkZXInLCAnc3RlcHBlcicsICdzb3J0JywgJ3RhYnMnLCAndG9vbGJhcicsXG4gICd0b29sdGlwJywgJ3NuYWNrLWJhcicsICdmb3JtLWZpZWxkJywgJ3RyZWUnXG5dLmZvckVhY2gobmFtZSA9PiB7XG4gIG1hdGVyaWFsTWl4aW5zW2BtYXQtJHtuYW1lfS10aGVtZWBdID0gYCR7bmFtZX0tdGhlbWVgO1xuICBtYXRlcmlhbE1peGluc1tgbWF0LSR7bmFtZX0tY29sb3JgXSA9IGAke25hbWV9LWNvbG9yYDtcbiAgbWF0ZXJpYWxNaXhpbnNbYG1hdC0ke25hbWV9LXR5cG9ncmFwaHlgXSA9IGAke25hbWV9LXR5cG9ncmFwaHlgO1xufSk7XG5cbi8qKiBNYXBwaW5nIG9mIE1hdGVyaWFsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSByZW5hbWVkLiAqL1xuZXhwb3J0IGNvbnN0IG1hdGVyaWFsRnVuY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnbWF0LWNvbG9yJzogJ2dldC1jb2xvci1mcm9tLXBhbGV0dGUnLFxuICAnbWF0LWNvbnRyYXN0JzogJ2dldC1jb250cmFzdC1jb2xvci1mcm9tLXBhbGV0dGUnLFxuICAnbWF0LXBhbGV0dGUnOiAnZGVmaW5lLXBhbGV0dGUnLFxuICAnbWF0LWRhcmstdGhlbWUnOiAnZGVmaW5lLWRhcmstdGhlbWUnLFxuICAnbWF0LWxpZ2h0LXRoZW1lJzogJ2RlZmluZS1saWdodC10aGVtZScsXG4gICdtYXQtdHlwb2dyYXBoeS1sZXZlbCc6ICdkZWZpbmUtdHlwb2dyYXBoeS1sZXZlbCcsXG4gICdtYXQtdHlwb2dyYXBoeS1jb25maWcnOiAnZGVmaW5lLXR5cG9ncmFwaHktY29uZmlnJyxcbiAgJ21hdC1mb250LXNpemUnOiAnZm9udC1zaXplJyxcbiAgJ21hdC1saW5lLWhlaWdodCc6ICdsaW5lLWhlaWdodCcsXG4gICdtYXQtZm9udC13ZWlnaHQnOiAnZm9udC13ZWlnaHQnLFxuICAnbWF0LWxldHRlci1zcGFjaW5nJzogJ2xldHRlci1zcGFjaW5nJyxcbiAgJ21hdC1mb250LWZhbWlseSc6ICdmb250LWZhbWlseScsXG59O1xuXG4vKiogTWFwcGluZyBvZiBNYXRlcmlhbCB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgcmVuYW1lZC4gKi9cbmV4cG9ydCBjb25zdCBtYXRlcmlhbFZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ21hdC1saWdodC10aGVtZS1iYWNrZ3JvdW5kJzogJ2xpZ2h0LXRoZW1lLWJhY2tncm91bmQtcGFsZXR0ZScsXG4gICdtYXQtZGFyay10aGVtZS1iYWNrZ3JvdW5kJzogJ2RhcmstdGhlbWUtYmFja2dyb3VuZC1wYWxldHRlJyxcbiAgJ21hdC1saWdodC10aGVtZS1mb3JlZ3JvdW5kJzogJ2xpZ2h0LXRoZW1lLWZvcmVncm91bmQtcGFsZXR0ZScsXG4gICdtYXQtZGFyay10aGVtZS1mb3JlZ3JvdW5kJzogJ2RhcmstdGhlbWUtZm9yZWdyb3VuZC1wYWxldHRlJyxcbn07XG5cbi8vIFRoZSBwYWxldHRlcyBhbGwgZm9sbG93IHRoZSBzYW1lIHBhdHRlcm4uXG5bXG4gICdyZWQnLCAncGluaycsICdpbmRpZ28nLCAncHVycGxlJywgJ2RlZXAtcHVycGxlJywgJ2JsdWUnLCAnbGlnaHQtYmx1ZScsICdjeWFuJywgJ3RlYWwnLCAnZ3JlZW4nLFxuICAnbGlnaHQtZ3JlZW4nLCAnbGltZScsICd5ZWxsb3cnLCAnYW1iZXInLCAnb3JhbmdlJywgJ2RlZXAtb3JhbmdlJywgJ2Jyb3duJywgJ2dyZXknLCAnZ3JheScsXG4gICdibHVlLWdyZXknLCAnYmx1ZS1ncmF5J1xuXS5mb3JFYWNoKG5hbWUgPT4gbWF0ZXJpYWxWYXJpYWJsZXNbYG1hdC0ke25hbWV9YF0gPSBgJHtuYW1lfS1wYWxldHRlYCk7XG5cbi8qKiBNYXBwaW5nIG9mIENESyB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgcmVuYW1lZC4gKi9cbmV4cG9ydCBjb25zdCBjZGtWYXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcic6ICdvdmVybGF5LWNvbnRhaW5lci16LWluZGV4JyxcbiAgJ2Nkay16LWluZGV4LW92ZXJsYXknOiAnb3ZlcmxheS16LWluZGV4JyxcbiAgJ2Nkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3AnOiAnb3ZlcmxheS1iYWNrZHJvcC16LWluZGV4JyxcbiAgJ2Nkay1vdmVybGF5LWRhcmstYmFja2Ryb3AtYmFja2dyb3VuZCc6ICdvdmVybGF5LWJhY2tkcm9wLWNvbG9yJyxcbn07XG5cbi8qKiBNYXBwaW5nIG9mIENESyBtaXhpbnMgdGhhdCBzaG91bGQgYmUgcmVuYW1lZC4gKi9cbmV4cG9ydCBjb25zdCBjZGtNaXhpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdjZGstb3ZlcmxheSc6ICdvdmVybGF5JyxcbiAgJ2Nkay1hMTF5JzogJ2ExMXktdmlzdWFsbHktaGlkZGVuJyxcbiAgJ2Nkay1oaWdoLWNvbnRyYXN0JzogJ2hpZ2gtY29udHJhc3QnLFxuICAnY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3InOiAndGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvcicsXG4gIC8vIFRoaXMgb25lIHdhcyBzcGxpdCB1cCBpbnRvIHR3byBtaXhpbnMgd2hpY2ggaXMgdHJpY2tpZXIgdG9cbiAgLy8gbWlncmF0ZSBzbyBmb3Igbm93IHdlIGZvcndhcmQgdG8gdGhlIGRlcHJlY2F0ZWQgdmFyaWFudC5cbiAgJ2Nkay10ZXh0LWZpZWxkJzogJ3RleHQtZmllbGQnLFxufTtcblxuLyoqXG4gKiBNYXRlcmlhbCB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKiBhbmQgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlaXIgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlZE1hdGVyaWFsVmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAvLyBOb3RlOiB0aGVyZSdzIGFsc28gYSB1c2FnZSBvZiBhIHZhcmlhYmxlIGNhbGxlZCBgJHBpYCwgYnV0IHRoZSBuYW1lIGlzIHNob3J0IGVub3VnaCB0aGF0XG4gIC8vIGl0IG1hdGNoZXMgdGhpbmdzIGxpa2UgYCRtYXQtcGlua2AuIERvbid0IG1pZ3JhdGUgaXQgc2luY2UgaXQncyB1bmxpa2VseSB0byBiZSB1c2VkLlxuICAnbWF0LXhzbWFsbCc6ICdtYXgtd2lkdGg6IDU5OXB4JyxcbiAgJ21hdC1zbWFsbCc6ICdtYXgtd2lkdGg6IDk1OXB4JyxcbiAgJ21hdC10b2dnbGUtcGFkZGluZyc6ICc4cHgnLFxuICAnbWF0LXRvZ2dsZS1zaXplJzogJzIwcHgnLFxuICAnbWF0LWxpbmVhci1vdXQtc2xvdy1pbi10aW1pbmctZnVuY3Rpb24nOiAnY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKScsXG4gICdtYXQtZmFzdC1vdXQtc2xvdy1pbi10aW1pbmctZnVuY3Rpb24nOiAnY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsXG4gICdtYXQtZmFzdC1vdXQtbGluZWFyLWluLXRpbWluZy1mdW5jdGlvbic6ICdjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKScsXG4gICdtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb24nOiAnMjgwbXMnLFxuICAnbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic6ICdjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJyxcbiAgJ21hdC1lbGV2YXRpb24tY29sb3InOiAnIzAwMCcsXG4gICdtYXQtZWxldmF0aW9uLW9wYWNpdHknOiAnMScsXG4gICdtYXQtZWxldmF0aW9uLXByZWZpeCc6IGAnbWF0LWVsZXZhdGlvbi16J2AsXG4gICdtYXQtcmlwcGxlLWNvbG9yLW9wYWNpdHknOiAnMC4xJyxcbiAgJ21hdC1iYWRnZS1mb250LXNpemUnOiAnMTJweCcsXG4gICdtYXQtYmFkZ2UtZm9udC13ZWlnaHQnOiAnNjAwJyxcbiAgJ21hdC1iYWRnZS1kZWZhdWx0LXNpemUnOiAnMjJweCcsXG4gICdtYXQtYmFkZ2Utc21hbGwtc2l6ZSc6ICcxNnB4JyxcbiAgJ21hdC1iYWRnZS1sYXJnZS1zaXplJzogJzI4cHgnLFxuICAnbWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhcmQtaGVpZ2h0JzogJzQ4cHgnLFxuICAnbWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhcmQtbWluaW11bS1oZWlnaHQnOiAnMjRweCcsXG4gICdtYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFyZC1tYXhpbXVtLWhlaWdodCc6ICc0OHB4JyxcbiAgJ21hdC1jaGlwLXJlbW92ZS1mb250LXNpemUnOiAnMThweCcsXG4gICdtYXQtZGF0ZXBpY2tlci1zZWxlY3RlZC10b2RheS1ib3gtc2hhZG93LXdpZHRoJzogJzFweCcsXG4gICdtYXQtZGF0ZXBpY2tlci1zZWxlY3RlZC1mYWRlLWFtb3VudCc6ICcwLjYnLFxuICAnbWF0LWRhdGVwaWNrZXItcmFuZ2UtZmFkZS1hbW91bnQnOiAnMC4yJyxcbiAgJ21hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50JzogJzAuMicsXG4gICdtYXQtY2FsZW5kYXItYm9keS1mb250LXNpemUnOiAnMTNweCcsXG4gICdtYXQtY2FsZW5kYXItd2Vla2RheS10YWJsZS1mb250LXNpemUnOiAnMTFweCcsXG4gICdtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1jb2xsYXBzZWQtaGVpZ2h0JzogJzQ4cHgnLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItY29sbGFwc2VkLW1pbmltdW0taGVpZ2h0JzogJzM2cHgnLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItY29sbGFwc2VkLW1heGltdW0taGVpZ2h0JzogJzQ4cHgnLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZXhwYW5kZWQtaGVpZ2h0JzogJzY0cHgnLFxuICAnbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZXhwYW5kZWQtbWluaW11bS1oZWlnaHQnOiAnNDhweCcsXG4gICdtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1leHBhbmRlZC1tYXhpbXVtLWhlaWdodCc6ICc2NHB4JyxcbiAgJ21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRyYW5zaXRpb24nOiAnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsXG4gICdtYXQtcGFnaW5hdG9yLWhlaWdodCc6ICc1NnB4JyxcbiAgJ21hdC1wYWdpbmF0b3ItbWluaW11bS1oZWlnaHQnOiAnNDBweCcsXG4gICdtYXQtcGFnaW5hdG9yLW1heGltdW0taGVpZ2h0JzogJzU2cHgnLFxuICAnbWF0LXN0ZXBwZXItaGVhZGVyLWhlaWdodCc6ICc3MnB4JyxcbiAgJ21hdC1zdGVwcGVyLWhlYWRlci1taW5pbXVtLWhlaWdodCc6ICc0MnB4JyxcbiAgJ21hdC1zdGVwcGVyLWhlYWRlci1tYXhpbXVtLWhlaWdodCc6ICc3MnB4JyxcbiAgJ21hdC1zdGVwcGVyLWxhYmVsLWhlYWRlci1oZWlnaHQnOiAnMjRweCcsXG4gICdtYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20tdG9wLWdhcCc6ICcxNnB4JyxcbiAgJ21hdC1zdGVwcGVyLWxhYmVsLW1pbi13aWR0aCc6ICc1MHB4JyxcbiAgJ21hdC12ZXJ0aWNhbC1zdGVwcGVyLWNvbnRlbnQtbWFyZ2luJzogJzM2cHgnLFxuICAnbWF0LXN0ZXBwZXItc2lkZS1nYXAnOiAnMjRweCcsXG4gICdtYXQtc3RlcHBlci1saW5lLXdpZHRoJzogJzFweCcsXG4gICdtYXQtc3RlcHBlci1saW5lLWdhcCc6ICc4cHgnLFxuICAnbWF0LXN0ZXAtc3ViLWxhYmVsLWZvbnQtc2l6ZSc6ICcxMnB4JyxcbiAgJ21hdC1zdGVwLWhlYWRlci1pY29uLXNpemUnOiAnMTZweCcsXG4gICdtYXQtdG9vbGJhci1taW5pbXVtLWhlaWdodCc6ICc0NHB4JyxcbiAgJ21hdC10b29sYmFyLWhlaWdodC1kZXNrdG9wJzogJzY0cHgnLFxuICAnbWF0LXRvb2xiYXItbWF4aW11bS1oZWlnaHQtZGVza3RvcCc6ICc2NHB4JyxcbiAgJ21hdC10b29sYmFyLW1pbmltdW0taGVpZ2h0LWRlc2t0b3AnOiAnNDRweCcsXG4gICdtYXQtdG9vbGJhci1oZWlnaHQtbW9iaWxlJzogJzU2cHgnLFxuICAnbWF0LXRvb2xiYXItbWF4aW11bS1oZWlnaHQtbW9iaWxlJzogJzU2cHgnLFxuICAnbWF0LXRvb2xiYXItbWluaW11bS1oZWlnaHQtbW9iaWxlJzogJzQ0cHgnLFxuICAnbWF0LXRvb2x0aXAtdGFyZ2V0LWhlaWdodCc6ICcyMnB4JyxcbiAgJ21hdC10b29sdGlwLWZvbnQtc2l6ZSc6ICcxMHB4JyxcbiAgJ21hdC10b29sdGlwLXZlcnRpY2FsLXBhZGRpbmcnOiAnNnB4JyxcbiAgJ21hdC10b29sdGlwLWhhbmRzZXQtdGFyZ2V0LWhlaWdodCc6ICczMHB4JyxcbiAgJ21hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplJzogJzE0cHgnLFxuICAnbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nJzogJzhweCcsXG4gICdtYXQtdHJlZS1ub2RlLWhlaWdodCc6ICc0OHB4JyxcbiAgJ21hdC10cmVlLW5vZGUtbWluaW11bS1oZWlnaHQnOiAnMjRweCcsXG4gICdtYXQtdHJlZS1ub2RlLW1heGltdW0taGVpZ2h0JzogJzQ4cHgnLFxufTtcblxuLyoqXG4gKiBNYXRlcmlhbCB2YXJpYWJsZXMgKip3aXRob3V0IGEgYG1hdC1gIHByZWZpeCoqIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICogYW5kIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZWlyIHZhbHVlcy4gVGhlc2Ugc2hvdWxkIGJlIG1pZ3JhdGVkIG9ubHkgd2hlbiB0aGVyZSdzIGFcbiAqIE1hdGVyaWFsIGltcG9ydCwgYmVjYXVzZSB0aGVpciBuYW1lcyBjb3VsZCBjb25mbGljdCB3aXRoIG90aGVyIHZhcmlhYmxlcyBpbiB0aGUgdXNlcidzIGFwcC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVucHJlZml4ZWRSZW1vdmVkVmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnei1pbmRleC1mYWInOiAnMjAnLFxuICAnei1pbmRleC1kcmF3ZXInOiAnMTAwJyxcbiAgJ2Vhc2UtaW4tb3V0LWN1cnZlLWZ1bmN0aW9uJzogJ2N1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKScsXG4gICdzd2lmdC1lYXNlLW91dC1kdXJhdGlvbic6ICc0MDBtcycsXG4gICdzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb24nOiAnY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSknLFxuICAnc3dpZnQtZWFzZS1vdXQnOiAnYWxsIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpJyxcbiAgJ3N3aWZ0LWVhc2UtaW4tZHVyYXRpb24nOiAnMzAwbXMnLFxuICAnc3dpZnQtZWFzZS1pbi10aW1pbmctZnVuY3Rpb24nOiAnY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMiknLFxuICAnc3dpZnQtZWFzZS1pbic6ICdhbGwgMzAwbXMgY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMiknLFxuICAnc3dpZnQtZWFzZS1pbi1vdXQtZHVyYXRpb24nOiAnNTAwbXMnLFxuICAnc3dpZnQtZWFzZS1pbi1vdXQtdGltaW5nLWZ1bmN0aW9uJzogJ2N1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKScsXG4gICdzd2lmdC1lYXNlLWluLW91dCc6ICdhbGwgNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJyxcbiAgJ3N3aWZ0LWxpbmVhci1kdXJhdGlvbic6ICc4MG1zJyxcbiAgJ3N3aWZ0LWxpbmVhci10aW1pbmctZnVuY3Rpb24nOiAnbGluZWFyJyxcbiAgJ3N3aWZ0LWxpbmVhcic6ICdhbGwgODBtcyBsaW5lYXInLFxuICAnYmxhY2stODctb3BhY2l0eSc6ICdyZ2JhKGJsYWNrLCAwLjg3KScsXG4gICd3aGl0ZS04Ny1vcGFjaXR5JzogJ3JnYmEod2hpdGUsIDAuODcpJyxcbiAgJ2JsYWNrLTEyLW9wYWNpdHknOiAncmdiYShibGFjaywgMC4xMiknLFxuICAnd2hpdGUtMTItb3BhY2l0eSc6ICdyZ2JhKHdoaXRlLCAwLjEyKScsXG4gICdibGFjay02LW9wYWNpdHknOiAncmdiYShibGFjaywgMC4wNiknLFxuICAnd2hpdGUtNi1vcGFjaXR5JzogJ3JnYmEod2hpdGUsIDAuMDYpJyxcbiAgJ2RhcmstcHJpbWFyeS10ZXh0JzogJ3JnYmEoYmxhY2ssIDAuODcpJyxcbiAgJ2Rhcmstc2Vjb25kYXJ5LXRleHQnOiAncmdiYShibGFjaywgMC41NCknLFxuICAnZGFyay1kaXNhYmxlZC10ZXh0JzogJ3JnYmEoYmxhY2ssIDAuMzgpJyxcbiAgJ2RhcmstZGl2aWRlcnMnOiAncmdiYShibGFjaywgMC4xMiknLFxuICAnZGFyay1mb2N1c2VkJzogJ3JnYmEoYmxhY2ssIDAuMTIpJyxcbiAgJ2xpZ2h0LXByaW1hcnktdGV4dCc6ICd3aGl0ZScsXG4gICdsaWdodC1zZWNvbmRhcnktdGV4dCc6ICdyZ2JhKHdoaXRlLCAwLjcpJyxcbiAgJ2xpZ2h0LWRpc2FibGVkLXRleHQnOiAncmdiYSh3aGl0ZSwgMC41KScsXG4gICdsaWdodC1kaXZpZGVycyc6ICdyZ2JhKHdoaXRlLCAwLjEyKScsXG4gICdsaWdodC1mb2N1c2VkJzogJ3JnYmEod2hpdGUsIDAuMTIpJyxcbn07XG4iXX0=
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.migrateFileContent = void 0;
11
+ const config_1 = require("./config");
12
+ /**
13
+ * Migrates the content of a file to the new theming API. Note that this migration is using plain
14
+ * string manipulation, rather than the AST from PostCSS and the schematics string manipulation
15
+ * APIs, because it allows us to run it inside g3 and to avoid introducing new dependencies.
16
+ * @param content Content of the file.
17
+ * @param oldMaterialPrefix Prefix with which the old Material imports should start.
18
+ * Has to end with a slash. E.g. if `@import '~@angular/material/theming'` should be
19
+ * matched, the prefix would be `~@angular/material/`.
20
+ * @param oldCdkPrefix Prefix with which the old CDK imports should start.
21
+ * Has to end with a slash. E.g. if `@import '~@angular/cdk/overlay'` should be
22
+ * matched, the prefix would be `~@angular/cdk/`.
23
+ * @param newMaterialImportPath New import to the Material theming API (e.g. `~@angular/material`).
24
+ * @param newCdkImportPath New import to the CDK Sass APIs (e.g. `~@angular/cdk`).
25
+ */
26
+ function migrateFileContent(content, oldMaterialPrefix, oldCdkPrefix, newMaterialImportPath, newCdkImportPath) {
27
+ const materialResults = detectImports(content, oldMaterialPrefix);
28
+ const cdkResults = detectImports(content, oldCdkPrefix);
29
+ // Try to migrate the symbols even if there are no imports. This is used
30
+ // to cover the case where the Components symbols were used transitively.
31
+ content = migrateMaterialSymbols(content, newMaterialImportPath, materialResults);
32
+ content = migrateCdkSymbols(content, newCdkImportPath, cdkResults);
33
+ content = replaceRemovedVariables(content, config_1.removedMaterialVariables);
34
+ // We can assume that the migration has taken care of any Components symbols that were
35
+ // imported transitively so we can always drop the old imports. We also assume that imports
36
+ // to the new entry points have been added already.
37
+ if (materialResults.imports.length) {
38
+ content = replaceRemovedVariables(content, config_1.unprefixedRemovedVariables);
39
+ content = removeStrings(content, materialResults.imports);
40
+ }
41
+ if (cdkResults.imports.length) {
42
+ content = removeStrings(content, cdkResults.imports);
43
+ }
44
+ return content;
45
+ }
46
+ exports.migrateFileContent = migrateFileContent;
47
+ /**
48
+ * Counts the number of imports with a specific prefix and extracts their namespaces.
49
+ * @param content File content in which to look for imports.
50
+ * @param prefix Prefix that the imports should start with.
51
+ */
52
+ function detectImports(content, prefix) {
53
+ if (prefix[prefix.length - 1] !== '/') {
54
+ // Some of the logic further down makes assumptions about the import depth.
55
+ throw Error(`Prefix "${prefix}" has to end in a slash.`);
56
+ }
57
+ // List of `@use` namespaces from which Angular CDK/Material APIs may be referenced.
58
+ // Since we know that the library doesn't have any name collisions, we can treat all of these
59
+ // namespaces as equivalent.
60
+ const namespaces = [];
61
+ const imports = [];
62
+ const pattern = new RegExp(`@(import|use) +['"]${escapeRegExp(prefix)}.*['"].*;?\n`, 'g');
63
+ let match = null;
64
+ while (match = pattern.exec(content)) {
65
+ const [fullImport, type] = match;
66
+ if (type === 'use') {
67
+ const namespace = extractNamespaceFromUseStatement(fullImport);
68
+ if (namespaces.indexOf(namespace) === -1) {
69
+ namespaces.push(namespace);
70
+ }
71
+ }
72
+ imports.push(fullImport);
73
+ }
74
+ return { imports, namespaces };
75
+ }
76
+ /** Migrates the Material symbols in a file. */
77
+ function migrateMaterialSymbols(content, importPath, detectedImports) {
78
+ const initialContent = content;
79
+ const namespace = 'mat';
80
+ // Migrate the mixins.
81
+ content = renameSymbols(content, config_1.materialMixins, detectedImports.namespaces, mixinKeyFormatter, getMixinValueFormatter(namespace));
82
+ // Migrate the functions.
83
+ content = renameSymbols(content, config_1.materialFunctions, detectedImports.namespaces, functionKeyFormatter, getFunctionValueFormatter(namespace));
84
+ // Migrate the variables.
85
+ content = renameSymbols(content, config_1.materialVariables, detectedImports.namespaces, variableKeyFormatter, getVariableValueFormatter(namespace));
86
+ if (content !== initialContent) {
87
+ // Add an import to the new API only if any of the APIs were being used.
88
+ content = insertUseStatement(content, importPath, detectedImports.imports, namespace);
89
+ }
90
+ return content;
91
+ }
92
+ /** Migrates the CDK symbols in a file. */
93
+ function migrateCdkSymbols(content, importPath, detectedImports) {
94
+ const initialContent = content;
95
+ const namespace = 'cdk';
96
+ // Migrate the mixins.
97
+ content = renameSymbols(content, config_1.cdkMixins, detectedImports.namespaces, mixinKeyFormatter, getMixinValueFormatter(namespace));
98
+ // Migrate the variables.
99
+ content = renameSymbols(content, config_1.cdkVariables, detectedImports.namespaces, variableKeyFormatter, getVariableValueFormatter(namespace));
100
+ // Previously the CDK symbols were exposed through `material/theming`, but now we have a
101
+ // dedicated entrypoint for the CDK. Only add an import for it if any of the symbols are used.
102
+ if (content !== initialContent) {
103
+ content = insertUseStatement(content, importPath, detectedImports.imports, namespace);
104
+ }
105
+ return content;
106
+ }
107
+ /**
108
+ * Renames all Sass symbols in a file based on a pre-defined mapping.
109
+ * @param content Content of a file to be migrated.
110
+ * @param mapping Mapping between symbol names and their replacements.
111
+ * @param namespaces Names to iterate over and pass to getKeyPattern.
112
+ * @param getKeyPattern Function used to turn each of the keys into a regex.
113
+ * @param formatValue Formats the value that will replace any matches of the pattern returned by
114
+ * `getKeyPattern`.
115
+ */
116
+ function renameSymbols(content, mapping, namespaces, getKeyPattern, formatValue) {
117
+ // The null at the end is so that we make one last pass to cover non-namespaced symbols.
118
+ [...namespaces.slice().sort(sortLengthDescending), null].forEach(namespace => {
119
+ // Migrate the longest keys first so that our regex-based replacements don't accidentally
120
+ // capture keys that contain other keys. E.g. `$mat-blue` is contained within `$mat-blue-grey`.
121
+ Object.keys(mapping).sort(sortLengthDescending).forEach(key => {
122
+ const pattern = getKeyPattern(namespace, key);
123
+ // Sanity check since non-global regexes will only replace the first match.
124
+ if (pattern.flags.indexOf('g') === -1) {
125
+ throw Error('Replacement pattern must be global.');
126
+ }
127
+ content = content.replace(pattern, formatValue(mapping[key]));
128
+ });
129
+ });
130
+ return content;
131
+ }
132
+ /** Inserts an `@use` statement in a string. */
133
+ function insertUseStatement(content, importPath, importsToIgnore, namespace) {
134
+ // We want to find the first import that isn't in the list of ignored imports or find nothing,
135
+ // because the imports being replaced might be the only ones in the file and they can be further
136
+ // down. An easy way to do this is to replace the imports with a random character and run
137
+ // `indexOf` on the result. This isn't the most efficient way of doing it, but it's more compact
138
+ // and it allows us to easily deal with things like comment nodes.
139
+ const contentToSearch = importsToIgnore.reduce((accumulator, current) => accumulator.replace(current, '◬'.repeat(current.length)), content);
140
+ // Sass has a limitation that all `@use` declarations have to come before `@import` so we have
141
+ // to find the first import and insert before it. Technically we can get away with always
142
+ // inserting at 0, but the file may start with something like a license header.
143
+ const newImportIndex = Math.max(0, contentToSearch.indexOf('@import '));
144
+ return content.slice(0, newImportIndex) + `@use '${importPath}' as ${namespace};\n` +
145
+ content.slice(newImportIndex);
146
+ }
147
+ /** Formats a migration key as a Sass mixin invocation. */
148
+ function mixinKeyFormatter(namespace, name) {
149
+ // Note that adding a `(` at the end of the pattern would be more accurate, but mixin
150
+ // invocations don't necessarily have to include the parentheses. We could add `[(;]`,
151
+ // but then we won't know which character to include in the replacement string.
152
+ return new RegExp(`@include +${escapeRegExp((namespace ? namespace + '.' : '') + name)}`, 'g');
153
+ }
154
+ /** Returns a function that can be used to format a Sass mixin replacement. */
155
+ function getMixinValueFormatter(namespace) {
156
+ // Note that adding a `(` at the end of the pattern would be more accurate,
157
+ // but mixin invocations don't necessarily have to include the parentheses.
158
+ return name => `@include ${namespace}.${name}`;
159
+ }
160
+ /** Formats a migration key as a Sass function invocation. */
161
+ function functionKeyFormatter(namespace, name) {
162
+ return new RegExp(escapeRegExp(`${namespace ? namespace + '.' : ''}${name}(`), 'g');
163
+ }
164
+ /** Returns a function that can be used to format a Sass function replacement. */
165
+ function getFunctionValueFormatter(namespace) {
166
+ return name => `${namespace}.${name}(`;
167
+ }
168
+ /** Formats a migration key as a Sass variable. */
169
+ function variableKeyFormatter(namespace, name) {
170
+ return new RegExp(escapeRegExp(`${namespace ? namespace + '.' : ''}$${name}`), 'g');
171
+ }
172
+ /** Returns a function that can be used to format a Sass variable replacement. */
173
+ function getVariableValueFormatter(namespace) {
174
+ return name => `${namespace}.$${name}`;
175
+ }
176
+ /** Escapes special regex characters in a string. */
177
+ function escapeRegExp(str) {
178
+ return str.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
179
+ }
180
+ /** Used with `Array.prototype.sort` to order strings in descending length. */
181
+ function sortLengthDescending(a, b) {
182
+ return b.length - a.length;
183
+ }
184
+ /** Removes all strings from another string. */
185
+ function removeStrings(content, toRemove) {
186
+ return toRemove
187
+ .reduce((accumulator, current) => accumulator.replace(current, ''), content)
188
+ .replace(/^\s+/, '');
189
+ }
190
+ /** Parses out the namespace from a Sass `@use` statement. */
191
+ function extractNamespaceFromUseStatement(fullImport) {
192
+ const closeQuoteIndex = Math.max(fullImport.lastIndexOf(`"`), fullImport.lastIndexOf(`'`));
193
+ if (closeQuoteIndex > -1) {
194
+ const asExpression = 'as ';
195
+ const asIndex = fullImport.indexOf(asExpression, closeQuoteIndex);
196
+ // If we found an ` as ` expression, we consider the rest of the text as the namespace.
197
+ if (asIndex > -1) {
198
+ return fullImport.slice(asIndex + asExpression.length).split(';')[0].trim();
199
+ }
200
+ // Otherwise the namespace is the name of the file that is being imported.
201
+ const lastSlashIndex = fullImport.lastIndexOf('/', closeQuoteIndex);
202
+ if (lastSlashIndex > -1) {
203
+ const fileName = fullImport.slice(lastSlashIndex + 1, closeQuoteIndex)
204
+ // Sass allows for leading underscores to be omitted and it technically supports .scss.
205
+ .replace(/^_|(\.import)?\.scss$|\.import$/g, '');
206
+ // Sass ignores `/index` and infers the namespace as the next segment in the path.
207
+ if (fileName === 'index') {
208
+ const nextSlashIndex = fullImport.lastIndexOf('/', lastSlashIndex - 1);
209
+ if (nextSlashIndex > -1) {
210
+ return fullImport.slice(nextSlashIndex + 1, lastSlashIndex);
211
+ }
212
+ }
213
+ else {
214
+ return fileName;
215
+ }
216
+ }
217
+ }
218
+ throw Error(`Could not extract namespace from import "${fullImport}".`);
219
+ }
220
+ /**
221
+ * Replaces variables that have been removed with their values.
222
+ * @param content Content of the file to be migrated.
223
+ * @param variables Mapping between variable names and their values.
224
+ */
225
+ function replaceRemovedVariables(content, variables) {
226
+ Object.keys(variables).sort(sortLengthDescending).forEach(variableName => {
227
+ // Note that the pattern uses a negative lookahead to exclude
228
+ // variable assignments, because they can't be migrated.
229
+ const regex = new RegExp(`\\$${escapeRegExp(variableName)}(?!\\s+:|:)`, 'g');
230
+ content = content.replace(regex, variables[variableName]);
231
+ });
232
+ return content;
233
+ }
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NjaGVtYXRpY3MvbmctdXBkYXRlL21pZ3JhdGlvbnMvdGhlbWluZy1hcGktdjEyL21pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFFSCxxQ0FRa0I7QUFRbEI7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE9BQWUsRUFDZixpQkFBeUIsRUFDekIsWUFBb0IsRUFDcEIscUJBQTZCLEVBQzdCLGdCQUF3QjtJQUN6RCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV4RCx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEYsT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxFQUFFLGlDQUF3QixDQUFDLENBQUM7SUFFckUsc0ZBQXNGO0lBQ3RGLDJGQUEyRjtJQUMzRixtREFBbUQ7SUFDbkQsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNsQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxFQUFFLG1DQUEwQixDQUFDLENBQUM7UUFDdkUsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzNEO0lBRUQsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUM3QixPQUFPLEdB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ZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIG1hdGVyaWFsTWl4aW5zLFxuICBtYXRlcmlhbEZ1bmN0aW9ucyxcbiAgbWF0ZXJpYWxWYXJpYWJsZXMsXG4gIGNka01peGlucyxcbiAgY2RrVmFyaWFibGVzLFxuICByZW1vdmVkTWF0ZXJpYWxWYXJpYWJsZXMsXG4gIHVucHJlZml4ZWRSZW1vdmVkVmFyaWFibGVzXG59IGZyb20gJy4vY29uZmlnJztcblxuLyoqIFRoZSByZXN1bHQgb2YgYSBzZWFyY2ggZm9yIGltcG9ydHMgYW5kIG5hbWVzcGFjZXMgaW4gYSBmaWxlLiAqL1xuaW50ZXJmYWNlIERldGVjdEltcG9ydFJlc3VsdCB7XG4gIGltcG9ydHM6IHN0cmluZ1tdO1xuICBuYW1lc3BhY2VzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNaWdyYXRlcyB0aGUgY29udGVudCBvZiBhIGZpbGUgdG8gdGhlIG5ldyB0aGVtaW5nIEFQSS4gTm90ZSB0aGF0IHRoaXMgbWlncmF0aW9uIGlzIHVzaW5nIHBsYWluXG4gKiBzdHJpbmcgbWFuaXB1bGF0aW9uLCByYXRoZXIgdGhhbiB0aGUgQVNUIGZyb20gUG9zdENTUyBhbmQgdGhlIHNjaGVtYXRpY3Mgc3RyaW5nIG1hbmlwdWxhdGlvblxuICogQVBJcywgYmVjYXVzZSBpdCBhbGxvd3MgdXMgdG8gcnVuIGl0IGluc2lkZSBnMyBhbmQgdG8gYXZvaWQgaW50cm9kdWNpbmcgbmV3IGRlcGVuZGVuY2llcy5cbiAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgb2YgdGhlIGZpbGUuXG4gKiBAcGFyYW0gb2xkTWF0ZXJpYWxQcmVmaXggUHJlZml4IHdpdGggd2hpY2ggdGhlIG9sZCBNYXRlcmlhbCBpbXBvcnRzIHNob3VsZCBzdGFydC5cbiAqICAgSGFzIHRvIGVuZCB3aXRoIGEgc2xhc2guIEUuZy4gaWYgYEBpbXBvcnQgJ35AYW5ndWxhci9tYXRlcmlhbC90aGVtaW5nJ2Agc2hvdWxkIGJlXG4gKiAgIG1hdGNoZWQsIHRoZSBwcmVmaXggd291bGQgYmUgYH5AYW5ndWxhci9tYXRlcmlhbC9gLlxuICogQHBhcmFtIG9sZENka1ByZWZpeCBQcmVmaXggd2l0aCB3aGljaCB0aGUgb2xkIENESyBpbXBvcnRzIHNob3VsZCBzdGFydC5cbiAqICAgSGFzIHRvIGVuZCB3aXRoIGEgc2xhc2guIEUuZy4gaWYgYEBpbXBvcnQgJ35AYW5ndWxhci9jZGsvb3ZlcmxheSdgIHNob3VsZCBiZVxuICogICBtYXRjaGVkLCB0aGUgcHJlZml4IHdvdWxkIGJlIGB+QGFuZ3VsYXIvY2RrL2AuXG4gKiBAcGFyYW0gbmV3TWF0ZXJpYWxJbXBvcnRQYXRoIE5ldyBpbXBvcnQgdG8gdGhlIE1hdGVyaWFsIHRoZW1pbmcgQVBJIChlLmcuIGB+QGFuZ3VsYXIvbWF0ZXJpYWxgKS5cbiAqIEBwYXJhbSBuZXdDZGtJbXBvcnRQYXRoIE5ldyBpbXBvcnQgdG8gdGhlIENESyBTYXNzIEFQSXMgKGUuZy4gYH5AYW5ndWxhci9jZGtgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGVGaWxlQ29udGVudChjb250ZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE1hdGVyaWFsUHJlZml4OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENka1ByZWZpeDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXRlcmlhbEltcG9ydFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2RrSW1wb3J0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0ZXJpYWxSZXN1bHRzID0gZGV0ZWN0SW1wb3J0cyhjb250ZW50LCBvbGRNYXRlcmlhbFByZWZpeCk7XG4gIGNvbnN0IGNka1Jlc3VsdHMgPSBkZXRlY3RJbXBvcnRzKGNvbnRlbnQsIG9sZENka1ByZWZpeCk7XG5cbiAgLy8gVHJ5IHRvIG1pZ3JhdGUgdGhlIHN5bWJvbHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8gaW1wb3J0cy4gVGhpcyBpcyB1c2VkXG4gIC8vIHRvIGNvdmVyIHRoZSBjYXNlIHdoZXJlIHRoZSBDb21wb25lbnRzIHN5bWJvbHMgd2VyZSB1c2VkIHRyYW5zaXRpdmVseS5cbiAgY29udGVudCA9IG1pZ3JhdGVNYXRlcmlhbFN5bWJvbHMoY29udGVudCwgbmV3TWF0ZXJpYWxJbXBvcnRQYXRoLCBtYXRlcmlhbFJlc3VsdHMpO1xuICBjb250ZW50ID0gbWlncmF0ZUNka1N5bWJvbHMoY29udGVudCwgbmV3Q2RrSW1wb3J0UGF0aCwgY2RrUmVzdWx0cyk7XG4gIGNvbnRlbnQgPSByZXBsYWNlUmVtb3ZlZFZhcmlhYmxlcyhjb250ZW50LCByZW1vdmVkTWF0ZXJpYWxWYXJpYWJsZXMpO1xuXG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgbWlncmF0aW9uIGhhcyB0YWtlbiBjYXJlIG9mIGFueSBDb21wb25lbnRzIHN5bWJvbHMgdGhhdCB3ZXJlXG4gIC8vIGltcG9ydGVkIHRyYW5zaXRpdmVseSBzbyB3ZSBjYW4gYWx3YXlzIGRyb3AgdGhlIG9sZCBpbXBvcnRzLiBXZSBhbHNvIGFzc3VtZSB0aGF0IGltcG9ydHNcbiAgLy8gdG8gdGhlIG5ldyBlbnRyeSBwb2ludHMgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkuXG4gIGlmIChtYXRlcmlhbFJlc3VsdHMuaW1wb3J0cy5sZW5ndGgpIHtcbiAgICBjb250ZW50ID0gcmVwbGFjZVJlbW92ZWRWYXJpYWJsZXMoY29udGVudCwgdW5wcmVmaXhlZFJlbW92ZWRWYXJpYWJsZXMpO1xuICAgIGNvbnRlbnQgPSByZW1vdmVTdHJpbmdzKGNvbnRlbnQsIG1hdGVyaWFsUmVzdWx0cy5pbXBvcnRzKTtcbiAgfVxuXG4gIGlmIChjZGtSZXN1bHRzLmltcG9ydHMubGVuZ3RoKSB7XG4gICAgY29udGVudCA9IHJlbW92ZVN0cmluZ3MoY29udGVudCwgY2RrUmVzdWx0cy5pbXBvcnRzKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGltcG9ydHMgd2l0aCBhIHNwZWNpZmljIHByZWZpeCBhbmQgZXh0cmFjdHMgdGhlaXIgbmFtZXNwYWNlcy5cbiAqIEBwYXJhbSBjb250ZW50IEZpbGUgY29udGVudCBpbiB3aGljaCB0byBsb29rIGZvciBpbXBvcnRzLlxuICogQHBhcmFtIHByZWZpeCBQcmVmaXggdGhhdCB0aGUgaW1wb3J0cyBzaG91bGQgc3RhcnQgd2l0aC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SW1wb3J0cyhjb250ZW50OiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogRGV0ZWN0SW1wb3J0UmVzdWx0IHtcbiAgaWYgKHByZWZpeFtwcmVmaXgubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgIC8vIFNvbWUgb2YgdGhlIGxvZ2ljIGZ1cnRoZXIgZG93biBtYWtlcyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgaW1wb3J0IGRlcHRoLlxuICAgIHRocm93IEVycm9yKGBQcmVmaXggXCIke3ByZWZpeH1cIiBoYXMgdG8gZW5kIGluIGEgc2xhc2guYCk7XG4gIH1cblxuICAvLyBMaXN0IG9mIGBAdXNlYCBuYW1lc3BhY2VzIGZyb20gd2hpY2ggQW5ndWxhciBDREsvTWF0ZXJpYWwgQVBJcyBtYXkgYmUgcmVmZXJlbmNlZC5cbiAgLy8gU2luY2Ugd2Uga25vdyB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgaGF2ZSBhbnkgbmFtZSBjb2xsaXNpb25zLCB3ZSBjYW4gdHJlYXQgYWxsIG9mIHRoZXNlXG4gIC8vIG5hbWVzcGFjZXMgYXMgZXF1aXZhbGVudC5cbiAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYEAoaW1wb3J0fHVzZSkgK1snXCJdJHtlc2NhcGVSZWdFeHAocHJlZml4KX0uKlsnXCJdLio7P1xcbmAsICdnJyk7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IG51bGw7XG5cbiAgd2hpbGUgKG1hdGNoID0gcGF0dGVybi5leGVjKGNvbnRlbnQpKSB7XG4gICAgY29uc3QgW2Z1bGxJbXBvcnQsIHR5cGVdID0gbWF0Y2g7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3VzZScpIHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGV4dHJhY3ROYW1lc3BhY2VGcm9tVXNlU3RhdGVtZW50KGZ1bGxJbXBvcnQpO1xuXG4gICAgICBpZiAobmFtZXNwYWNlcy5pbmRleE9mKG5hbWVzcGFjZSkgPT09IC0xKSB7XG4gICAgICAgIG5hbWVzcGFjZXMucHVzaChuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGltcG9ydHMucHVzaChmdWxsSW1wb3J0KTtcbiAgfVxuXG4gIHJldHVybiB7aW1wb3J0cywgbmFtZXNwYWNlc307XG59XG5cbi8qKiBNaWdyYXRlcyB0aGUgTWF0ZXJpYWwgc3ltYm9scyBpbiBhIGZpbGUuICovXG5mdW5jdGlvbiBtaWdyYXRlTWF0ZXJpYWxTeW1ib2xzKGNvbnRlbnQ6IHN0cmluZywgaW1wb3J0UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZEltcG9ydHM6IERldGVjdEltcG9ydFJlc3VsdCk6IHN0cmluZyB7XG4gIGNvbnN0IGluaXRpYWxDb250ZW50ID0gY29udGVudDtcbiAgY29uc3QgbmFtZXNwYWNlID0gJ21hdCc7XG5cbiAgLy8gTWlncmF0ZSB0aGUgbWl4aW5zLlxuICBjb250ZW50ID0gcmVuYW1lU3ltYm9scyhjb250ZW50LCBtYXRlcmlhbE1peGlucywgZGV0ZWN0ZWRJbXBvcnRzLm5hbWVzcGFjZXMsIG1peGluS2V5Rm9ybWF0dGVyLFxuICAgIGdldE1peGluVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlKSk7XG5cbiAgLy8gTWlncmF0ZSB0aGUgZnVuY3Rpb25zLlxuICBjb250ZW50ID0gcmVuYW1lU3ltYm9scyhjb250ZW50LCBtYXRlcmlhbEZ1bmN0aW9ucywgZGV0ZWN0ZWRJbXBvcnRzLm5hbWVzcGFjZXMsXG4gICAgZnVuY3Rpb25LZXlGb3JtYXR0ZXIsIGdldEZ1bmN0aW9uVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlKSk7XG5cbiAgLy8gTWlncmF0ZSB0aGUgdmFyaWFibGVzLlxuICBjb250ZW50ID0gcmVuYW1lU3ltYm9scyhjb250ZW50LCBtYXRlcmlhbFZhcmlhYmxlcywgZGV0ZWN0ZWRJbXBvcnRzLm5hbWVzcGFjZXMsXG4gICAgdmFyaWFibGVLZXlGb3JtYXR0ZXIsIGdldFZhcmlhYmxlVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlKSk7XG5cbiAgaWYgKGNvbnRlbnQgIT09IGluaXRpYWxDb250ZW50KSB7XG4gICAgLy8gQWRkIGFuIGltcG9ydCB0byB0aGUgbmV3IEFQSSBvbmx5IGlmIGFueSBvZiB0aGUgQVBJcyB3ZXJlIGJlaW5nIHVzZWQuXG4gICAgY29udGVudCA9IGluc2VydFVzZVN0YXRlbWVudChjb250ZW50LCBpbXBvcnRQYXRoLCBkZXRlY3RlZEltcG9ydHMuaW1wb3J0cywgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKiogTWlncmF0ZXMgdGhlIENESyBzeW1ib2xzIGluIGEgZmlsZS4gKi9cbmZ1bmN0aW9uIG1pZ3JhdGVDZGtTeW1ib2xzKGNvbnRlbnQ6IHN0cmluZywgaW1wb3J0UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWRJbXBvcnRzOiBEZXRlY3RJbXBvcnRSZXN1bHQpOiBzdHJpbmcge1xuICBjb25zdCBpbml0aWFsQ29udGVudCA9IGNvbnRlbnQ7XG4gIGNvbnN0IG5hbWVzcGFjZSA9ICdjZGsnO1xuXG4gIC8vIE1pZ3JhdGUgdGhlIG1peGlucy5cbiAgY29udGVudCA9IHJlbmFtZVN5bWJvbHMoY29udGVudCwgY2RrTWl4aW5zLCBkZXRlY3RlZEltcG9ydHMubmFtZXNwYWNlcywgbWl4aW5LZXlGb3JtYXR0ZXIsXG4gICAgZ2V0TWl4aW5WYWx1ZUZvcm1hdHRlcihuYW1lc3BhY2UpKTtcblxuICAvLyBNaWdyYXRlIHRoZSB2YXJpYWJsZXMuXG4gIGNvbnRlbnQgPSByZW5hbWVTeW1ib2xzKGNvbnRlbnQsIGNka1ZhcmlhYmxlcywgZGV0ZWN0ZWRJbXBvcnRzLm5hbWVzcGFjZXMsIHZhcmlhYmxlS2V5Rm9ybWF0dGVyLFxuICAgIGdldFZhcmlhYmxlVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlKSk7XG5cbiAgLy8gUHJldmlvdXNseSB0aGUgQ0RLIHN5bWJvbHMgd2VyZSBleHBvc2VkIHRocm91Z2ggYG1hdGVyaWFsL3RoZW1pbmdgLCBidXQgbm93IHdlIGhhdmUgYVxuICAvLyBkZWRpY2F0ZWQgZW50cnlwb2ludCBmb3IgdGhlIENESy4gT25seSBhZGQgYW4gaW1wb3J0IGZvciBpdCBpZiBhbnkgb2YgdGhlIHN5bWJvbHMgYXJlIHVzZWQuXG4gIGlmIChjb250ZW50ICE9PSBpbml0aWFsQ29udGVudCkge1xuICAgIGNvbnRlbnQgPSBpbnNlcnRVc2VTdGF0ZW1lbnQoY29udGVudCwgaW1wb3J0UGF0aCwgZGV0ZWN0ZWRJbXBvcnRzLmltcG9ydHMsIG5hbWVzcGFjZSk7XG4gIH1cblxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGFsbCBTYXNzIHN5bWJvbHMgaW4gYSBmaWxlIGJhc2VkIG9uIGEgcHJlLWRlZmluZWQgbWFwcGluZy5cbiAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgb2YgYSBmaWxlIHRvIGJlIG1pZ3JhdGVkLlxuICogQHBhcmFtIG1hcHBpbmcgTWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgdGhlaXIgcmVwbGFjZW1lbnRzLlxuICogQHBhcmFtIG5hbWVzcGFjZXMgTmFtZXMgdG8gaXRlcmF0ZSBvdmVyIGFuZCBwYXNzIHRvIGdldEtleVBhdHRlcm4uXG4gKiBAcGFyYW0gZ2V0S2V5UGF0dGVybiBGdW5jdGlvbiB1c2VkIHRvIHR1cm4gZWFjaCBvZiB0aGUga2V5cyBpbnRvIGEgcmVnZXguXG4gKiBAcGFyYW0gZm9ybWF0VmFsdWUgRm9ybWF0cyB0aGUgdmFsdWUgdGhhdCB3aWxsIHJlcGxhY2UgYW55IG1hdGNoZXMgb2YgdGhlIHBhdHRlcm4gcmV0dXJuZWQgYnlcbiAqICBgZ2V0S2V5UGF0dGVybmAuXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZVN5bWJvbHMoY29udGVudDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgZ2V0S2V5UGF0dGVybjogKG5hbWVzcGFjZTogc3RyaW5nfG51bGwsIGtleTogc3RyaW5nKSA9PiBSZWdFeHAsXG4gICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSBudWxsIGF0IHRoZSBlbmQgaXMgc28gdGhhdCB3ZSBtYWtlIG9uZSBsYXN0IHBhc3MgdG8gY292ZXIgbm9uLW5hbWVzcGFjZWQgc3ltYm9scy5cbiAgWy4uLm5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KHNvcnRMZW5ndGhEZXNjZW5kaW5nKSwgbnVsbF0uZm9yRWFjaChuYW1lc3BhY2UgPT4ge1xuICAgIC8vIE1pZ3JhdGUgdGhlIGxvbmdlc3Qga2V5cyBmaXJzdCBzbyB0aGF0IG91ciByZWdleC1iYXNlZCByZXBsYWNlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5XG4gICAgLy8gY2FwdHVyZSBrZXlzIHRoYXQgY29udGFpbiBvdGhlciBrZXlzLiBFLmcuIGAkbWF0LWJsdWVgIGlzIGNvbnRhaW5lZCB3aXRoaW4gYCRtYXQtYmx1ZS1ncmV5YC5cbiAgICBPYmplY3Qua2V5cyhtYXBwaW5nKS5zb3J0KHNvcnRMZW5ndGhEZXNjZW5kaW5nKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gZ2V0S2V5UGF0dGVybihuYW1lc3BhY2UsIGtleSk7XG5cbiAgICAgIC8vIFNhbml0eSBjaGVjayBzaW5jZSBub24tZ2xvYmFsIHJlZ2V4ZXMgd2lsbCBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG1hdGNoLlxuICAgICAgaWYgKHBhdHRlcm4uZmxhZ3MuaW5kZXhPZignZycpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBFcnJvcignUmVwbGFjZW1lbnQgcGF0dGVybiBtdXN0IGJlIGdsb2JhbC4nKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCBmb3JtYXRWYWx1ZShtYXBwaW5nW2tleV0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKiBJbnNlcnRzIGFuIGBAdXNlYCBzdGF0ZW1lbnQgaW4gYSBzdHJpbmcuICovXG5mdW5jdGlvbiBpbnNlcnRVc2VTdGF0ZW1lbnQoY29udGVudDogc3RyaW5nLCBpbXBvcnRQYXRoOiBzdHJpbmcsIGltcG9ydHNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBXZSB3YW50IHRvIGZpbmQgdGhlIGZpcnN0IGltcG9ydCB0aGF0IGlzbid0IGluIHRoZSBsaXN0IG9mIGlnbm9yZWQgaW1wb3J0cyBvciBmaW5kIG5vdGhpbmcsXG4gIC8vIGJlY2F1c2UgdGhlIGltcG9ydHMgYmVpbmcgcmVwbGFjZWQgbWlnaHQgYmUgdGhlIG9ubHkgb25lcyBpbiB0aGUgZmlsZSBhbmQgdGhleSBjYW4gYmUgZnVydGhlclxuICAvLyBkb3duLiBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHRvIHJlcGxhY2UgdGhlIGltcG9ydHMgd2l0aCBhIHJhbmRvbSBjaGFyYWN0ZXIgYW5kIHJ1blxuICAvLyBgaW5kZXhPZmAgb24gdGhlIHJlc3VsdC4gVGhpcyBpc24ndCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IG9mIGRvaW5nIGl0LCBidXQgaXQncyBtb3JlIGNvbXBhY3RcbiAgLy8gYW5kIGl0IGFsbG93cyB1cyB0byBlYXNpbHkgZGVhbCB3aXRoIHRoaW5ncyBsaWtlIGNvbW1lbnQgbm9kZXMuXG4gIGNvbnN0IGNvbnRlbnRUb1NlYXJjaCA9IGltcG9ydHNUb0lnbm9yZS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PlxuICAgIGFjY3VtdWxhdG9yLnJlcGxhY2UoY3VycmVudCwgJ+KXrCcucmVwZWF0KGN1cnJlbnQubGVuZ3RoKSksIGNvbnRlbnQpO1xuXG4gIC8vIFNhc3MgaGFzIGEgbGltaXRhdGlvbiB0aGF0IGFsbCBgQHVzZWAgZGVjbGFyYXRpb25zIGhhdmUgdG8gY29tZSBiZWZvcmUgYEBpbXBvcnRgIHNvIHdlIGhhdmVcbiAgLy8gdG8gZmluZCB0aGUgZmlyc3QgaW1wb3J0IGFuZCBpbnNlcnQgYmVmb3JlIGl0LiBUZWNobmljYWxseSB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBhbHdheXNcbiAgLy8gaW5zZXJ0aW5nIGF0IDAsIGJ1dCB0aGUgZmlsZSBtYXkgc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZSBhIGxpY2Vuc2UgaGVhZGVyLlxuICBjb25zdCBuZXdJbXBvcnRJbmRleCA9IE1hdGgubWF4KDAsIGNvbnRlbnRUb1NlYXJjaC5pbmRleE9mKCdAaW1wb3J0ICcpKTtcblxuICByZXR1cm4gY29udGVudC5zbGljZSgwLCBuZXdJbXBvcnRJbmRleCkgKyBgQHVzZSAnJHtpbXBvcnRQYXRofScgYXMgJHtuYW1lc3BhY2V9O1xcbmAgK1xuICAgICAgICAgY29udGVudC5zbGljZShuZXdJbXBvcnRJbmRleCk7XG59XG5cbi8qKiBGb3JtYXRzIGEgbWlncmF0aW9uIGtleSBhcyBhIFNhc3MgbWl4aW4gaW52b2NhdGlvbi4gKi9cbmZ1bmN0aW9uIG1peGluS2V5Rm9ybWF0dGVyKG5hbWVzcGFjZTogc3RyaW5nfG51bGwsIG5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIC8vIE5vdGUgdGhhdCBhZGRpbmcgYSBgKGAgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlLCBidXQgbWl4aW5cbiAgLy8gaW52b2NhdGlvbnMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbmNsdWRlIHRoZSBwYXJlbnRoZXNlcy4gV2UgY291bGQgYWRkIGBbKDtdYCxcbiAgLy8gYnV0IHRoZW4gd2Ugd29uJ3Qga25vdyB3aGljaCBjaGFyYWN0ZXIgdG8gaW5jbHVkZSBpbiB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLlxuICByZXR1cm4gbmV3IFJlZ0V4cChgQGluY2x1ZGUgKyR7ZXNjYXBlUmVnRXhwKChuYW1lc3BhY2UgPyBuYW1lc3BhY2UgKyAnLicgOiAnJykgKyBuYW1lKX1gLCAnZycpO1xufVxuXG4vKiogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybWF0IGEgU2FzcyBtaXhpbiByZXBsYWNlbWVudC4gKi9cbmZ1bmN0aW9uIGdldE1peGluVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlOiBzdHJpbmcpOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcge1xuICAvLyBOb3RlIHRoYXQgYWRkaW5nIGEgYChgIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4gd291bGQgYmUgbW9yZSBhY2N1cmF0ZSxcbiAgLy8gYnV0IG1peGluIGludm9jYXRpb25zIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW5jbHVkZSB0aGUgcGFyZW50aGVzZXMuXG4gIHJldHVybiBuYW1lID0+IGBAaW5jbHVkZSAke25hbWVzcGFjZX0uJHtuYW1lfWA7XG59XG5cbi8qKiBGb3JtYXRzIGEgbWlncmF0aW9uIGtleSBhcyBhIFNhc3MgZnVuY3Rpb24gaW52b2NhdGlvbi4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uS2V5Rm9ybWF0dGVyKG5hbWVzcGFjZTogc3RyaW5nfG51bGwsIG5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChgJHtuYW1lc3BhY2UgPyBuYW1lc3BhY2UgKyAnLicgOiAnJ30ke25hbWV9KGApLCAnZycpO1xufVxuXG4vKiogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybWF0IGEgU2FzcyBmdW5jdGlvbiByZXBsYWNlbWVudC4gKi9cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlOiBzdHJpbmcpOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcge1xuICByZXR1cm4gbmFtZSA9PiBgJHtuYW1lc3BhY2V9LiR7bmFtZX0oYDtcbn1cblxuLyoqIEZvcm1hdHMgYSBtaWdyYXRpb24ga2V5IGFzIGEgU2FzcyB2YXJpYWJsZS4gKi9cbmZ1bmN0aW9uIHZhcmlhYmxlS2V5Rm9ybWF0dGVyKG5hbWVzcGFjZTogc3RyaW5nfG51bGwsIG5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChgJHtuYW1lc3BhY2UgPyBuYW1lc3BhY2UgKyAnLicgOiAnJ30kJHtuYW1lfWApLCAnZycpO1xufVxuXG4vKiogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybWF0IGEgU2FzcyB2YXJpYWJsZSByZXBsYWNlbWVudC4gKi9cbmZ1bmN0aW9uIGdldFZhcmlhYmxlVmFsdWVGb3JtYXR0ZXIobmFtZXNwYWNlOiBzdHJpbmcpOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcge1xuICByZXR1cm4gbmFtZSA9PiBgJHtuYW1lc3BhY2V9LiQke25hbWV9YDtcbn1cblxuLyoqIEVzY2FwZXMgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG59XG5cbi8qKiBVc2VkIHdpdGggYEFycmF5LnByb3RvdHlwZS5zb3J0YCB0byBvcmRlciBzdHJpbmdzIGluIGRlc2NlbmRpbmcgbGVuZ3RoLiAqL1xuZnVuY3Rpb24gc29ydExlbmd0aERlc2NlbmRpbmcoYTogc3RyaW5nLCBiOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG59XG5cbi8qKiBSZW1vdmVzIGFsbCBzdHJpbmdzIGZyb20gYW5vdGhlciBzdHJpbmcuICovXG5mdW5jdGlvbiByZW1vdmVTdHJpbmdzKGNvbnRlbnQ6IHN0cmluZywgdG9SZW1vdmU6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvUmVtb3ZlXG4gICAgLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yLnJlcGxhY2UoY3VycmVudCwgJycpLCBjb250ZW50KVxuICAgIC5yZXBsYWNlKC9eXFxzKy8sICcnKTtcbn1cblxuLyoqIFBhcnNlcyBvdXQgdGhlIG5hbWVzcGFjZSBmcm9tIGEgU2FzcyBgQHVzZWAgc3RhdGVtZW50LiAqL1xuZnVuY3Rpb24gZXh0cmFjdE5hbWVzcGFjZUZyb21Vc2VTdGF0ZW1lbnQoZnVsbEltcG9ydDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2VRdW90ZUluZGV4ID0gTWF0aC5tYXgoZnVsbEltcG9ydC5sYXN0SW5kZXhPZihgXCJgKSwgZnVsbEltcG9ydC5sYXN0SW5kZXhPZihgJ2ApKTtcblxuICBpZiAoY2xvc2VRdW90ZUluZGV4ID4gLTEpIHtcbiAgICBjb25zdCBhc0V4cHJlc3Npb24gPSAnYXMgJztcbiAgICBjb25zdCBhc0luZGV4ID0gZnVsbEltcG9ydC5pbmRleE9mKGFzRXhwcmVzc2lvbiwgY2xvc2VRdW90ZUluZGV4KTtcblxuICAgIC8vIElmIHdlIGZvdW5kIGFuIGAgYXMgYCBleHByZXNzaW9uLCB3ZSBjb25zaWRlciB0aGUgcmVzdCBvZiB0aGUgdGV4dCBhcyB0aGUgbmFtZXNwYWNlLlxuICAgIGlmIChhc0luZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBmdWxsSW1wb3J0LnNsaWNlKGFzSW5kZXggKyBhc0V4cHJlc3Npb24ubGVuZ3RoKS5zcGxpdCgnOycpWzBdLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgdGhlIG5hbWVzcGFjZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlzIGJlaW5nIGltcG9ydGVkLlxuICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gZnVsbEltcG9ydC5sYXN0SW5kZXhPZignLycsIGNsb3NlUXVvdGVJbmRleCk7XG5cbiAgICBpZiAobGFzdFNsYXNoSW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmdWxsSW1wb3J0LnNsaWNlKGxhc3RTbGFzaEluZGV4ICsgMSwgY2xvc2VRdW90ZUluZGV4KVxuICAgICAgICAvLyBTYXNzIGFsbG93cyBmb3IgbGVhZGluZyB1bmRlcnNjb3JlcyB0byBiZSBvbWl0dGVkIGFuZCBpdCB0ZWNobmljYWxseSBzdXBwb3J0cyAuc2Nzcy5cbiAgICAgICAgLnJlcGxhY2UoL15ffChcXC5pbXBvcnQpP1xcLnNjc3MkfFxcLmltcG9ydCQvZywgJycpO1xuXG4gICAgICAvLyBTYXNzIGlnbm9yZXMgYC9pbmRleGAgYW5kIGluZmVycyB0aGUgbmFtZXNwYWNlIGFzIHRoZSBuZXh0IHNlZ21lbnQgaW4gdGhlIHBhdGguXG4gICAgICBpZiAoZmlsZU5hbWUgPT09ICdpbmRleCcpIHtcbiAgICAgICAgY29uc3QgbmV4dFNsYXNoSW5kZXggPSBmdWxsSW1wb3J0Lmxhc3RJbmRleE9mKCcvJywgbGFzdFNsYXNoSW5kZXggLSAxKTtcblxuICAgICAgICBpZiAobmV4dFNsYXNoSW5kZXggPiAtMSkge1xuICAgICAgICAgIHJldHVybiBmdWxsSW1wb3J0LnNsaWNlKG5leHRTbGFzaEluZGV4ICsgMSwgbGFzdFNsYXNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IG5hbWVzcGFjZSBmcm9tIGltcG9ydCBcIiR7ZnVsbEltcG9ydH1cIi5gKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCB3aXRoIHRoZWlyIHZhbHVlcy5cbiAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgbWlncmF0ZWQuXG4gKiBAcGFyYW0gdmFyaWFibGVzIE1hcHBpbmcgYmV0d2VlbiB2YXJpYWJsZSBuYW1lcyBhbmQgdGhlaXIgdmFsdWVzLlxuICovXG5mdW5jdGlvbiByZXBsYWNlUmVtb3ZlZFZhcmlhYmxlcyhjb250ZW50OiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gIE9iamVjdC5rZXlzKHZhcmlhYmxlcykuc29ydChzb3J0TGVuZ3RoRGVzY2VuZGluZykuZm9yRWFjaCh2YXJpYWJsZU5hbWUgPT4ge1xuICAgIC8vIE5vdGUgdGhhdCB0aGUgcGF0dGVybiB1c2VzIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIGV4Y2x1ZGVcbiAgICAvLyB2YXJpYWJsZSBhc3NpZ25tZW50cywgYmVjYXVzZSB0aGV5IGNhbid0IGJlIG1pZ3JhdGVkLlxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXCQke2VzY2FwZVJlZ0V4cCh2YXJpYWJsZU5hbWUpfSg/IVxcXFxzKzp8OilgLCAnZycpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVnZXgsIHZhcmlhYmxlc1t2YXJpYWJsZU5hbWVdKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4iXX0=