@ecodev/natural 62.1.2 → 63.0.0

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 (183) hide show
  1. package/fesm2022/ecodev-natural-vanilla.mjs +1193 -0
  2. package/fesm2022/ecodev-natural-vanilla.mjs.map +1 -0
  3. package/fesm2022/ecodev-natural.mjs +436 -425
  4. package/fesm2022/ecodev-natural.mjs.map +1 -1
  5. package/lib/classes/network-activity.service.d.ts +54 -0
  6. package/lib/classes/validators.d.ts +1 -1
  7. package/lib/modules/columns-picker/columns-picker.component.d.ts +2 -2
  8. package/lib/modules/common/services/seo.provider.d.ts +2 -2
  9. package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +1 -1
  10. package/lib/modules/file/abstract-file.d.ts +6 -3
  11. package/lib/modules/file/component/file.component.d.ts +2 -2
  12. package/lib/modules/file/file-drop.directive.d.ts +2 -3
  13. package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +2 -3
  14. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -3
  15. package/lib/modules/icon/icon.module.d.ts +2 -2
  16. package/lib/modules/panels/panels.service.d.ts +1 -2
  17. package/lib/modules/relations/relations.component.d.ts +3 -3
  18. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -3
  19. package/lib/modules/search/group/group.component.d.ts +2 -3
  20. package/lib/modules/search/input/input.component.d.ts +5 -5
  21. package/lib/modules/search/search/search.component.d.ts +2 -2
  22. package/lib/modules/select/abstract-select.component.d.ts +3 -3
  23. package/lib/modules/select/select/select.component.d.ts +1 -1
  24. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +1 -1
  25. package/lib/modules/table-button/table-button.component.d.ts +4 -2
  26. package/package.json +16 -14
  27. package/public-api.d.ts +1 -0
  28. package/src/lib/_natural.theme.scss +1 -2
  29. package/vanilla/index.d.ts +5 -0
  30. package/vanilla/package.json +3 -0
  31. package/vanilla/public-api.d.ts +11 -0
  32. package/vanilla/src/lib/classes/crypto.d.ts +8 -0
  33. package/vanilla/src/lib/classes/data-source.d.ts +32 -0
  34. package/vanilla/src/lib/classes/query-variable-manager-utils.d.ts +2 -0
  35. package/vanilla/src/lib/classes/query-variable-manager.d.ts +91 -0
  36. package/vanilla/src/lib/classes/signing.d.ts +7 -0
  37. package/vanilla/src/lib/classes/utility.d.ts +77 -0
  38. package/vanilla/src/lib/modules/search/classes/graphql-doctrine.types.d.ts +83 -0
  39. package/vanilla/src/lib/modules/search/classes/utils.d.ts +17 -0
  40. package/vanilla/src/lib/modules/search/types/dropdown-component.d.ts +20 -0
  41. package/vanilla/src/lib/modules/search/types/facet.d.ts +75 -0
  42. package/vanilla/src/lib/modules/search/types/values.d.ts +32 -0
  43. package/vanilla/src/lib/services/abstract-model.service.d.ts +244 -0
  44. package/vanilla/src/lib/services/debounce.service.d.ts +52 -0
  45. package/vanilla/src/lib/types/types.d.ts +100 -0
  46. package/esm2022/ecodev-natural.mjs +0 -5
  47. package/esm2022/lib/classes/abstract-detail.mjs +0 -229
  48. package/esm2022/lib/classes/abstract-editable-list.mjs +0 -99
  49. package/esm2022/lib/classes/abstract-list.mjs +0 -461
  50. package/esm2022/lib/classes/abstract-navigable-list.mjs +0 -133
  51. package/esm2022/lib/classes/apollo-utils.mjs +0 -59
  52. package/esm2022/lib/classes/crypto.mjs +0 -23
  53. package/esm2022/lib/classes/cumulative-changes.mjs +0 -50
  54. package/esm2022/lib/classes/data-source.mjs +0 -71
  55. package/esm2022/lib/classes/providers.mjs +0 -13
  56. package/esm2022/lib/classes/query-variable-manager-utils.mjs +0 -14
  57. package/esm2022/lib/classes/query-variable-manager.mjs +0 -172
  58. package/esm2022/lib/classes/rxjs.mjs +0 -54
  59. package/esm2022/lib/classes/signing.mjs +0 -38
  60. package/esm2022/lib/classes/tld.mjs +0 -1476
  61. package/esm2022/lib/classes/utility.mjs +0 -234
  62. package/esm2022/lib/classes/validators.mjs +0 -179
  63. package/esm2022/lib/directives/http-prefix.directive.mjs +0 -47
  64. package/esm2022/lib/modules/alert/alert.service.mjs +0 -53
  65. package/esm2022/lib/modules/alert/confirm.component.mjs +0 -16
  66. package/esm2022/lib/modules/alert/public-api.mjs +0 -6
  67. package/esm2022/lib/modules/avatar/component/avatar.component.mjs +0 -203
  68. package/esm2022/lib/modules/avatar/public-api.mjs +0 -6
  69. package/esm2022/lib/modules/avatar/service/avatar.service.mjs +0 -63
  70. package/esm2022/lib/modules/avatar/sources/gravatar.mjs +0 -29
  71. package/esm2022/lib/modules/avatar/sources/image.mjs +0 -13
  72. package/esm2022/lib/modules/avatar/sources/initials.mjs +0 -39
  73. package/esm2022/lib/modules/avatar/sources/source.mjs +0 -16
  74. package/esm2022/lib/modules/columns-picker/columns-picker.component.mjs +0 -145
  75. package/esm2022/lib/modules/columns-picker/public-api.mjs +0 -5
  76. package/esm2022/lib/modules/columns-picker/types.mjs +0 -2
  77. package/esm2022/lib/modules/common/directives/background-density.directive.mjs +0 -63
  78. package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +0 -93
  79. package/esm2022/lib/modules/common/directives/src-density.directive.mjs +0 -72
  80. package/esm2022/lib/modules/common/pipes/capitalize.pipe.mjs +0 -24
  81. package/esm2022/lib/modules/common/pipes/ellipsis.pipe.mjs +0 -17
  82. package/esm2022/lib/modules/common/pipes/enum.pipe.mjs +0 -24
  83. package/esm2022/lib/modules/common/pipes/time-ago.pipe.mjs +0 -140
  84. package/esm2022/lib/modules/common/public-api.mjs +0 -14
  85. package/esm2022/lib/modules/common/services/memory-storage.mjs +0 -110
  86. package/esm2022/lib/modules/common/services/seo.provider.mjs +0 -23
  87. package/esm2022/lib/modules/common/services/seo.service.mjs +0 -235
  88. package/esm2022/lib/modules/detail-header/detail-header.component.mjs +0 -84
  89. package/esm2022/lib/modules/detail-header/public-api.mjs +0 -5
  90. package/esm2022/lib/modules/dialog-trigger/dialog-trigger.component.mjs +0 -72
  91. package/esm2022/lib/modules/dialog-trigger/public-api.mjs +0 -5
  92. package/esm2022/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +0 -100
  93. package/esm2022/lib/modules/dropdown-components/public-api.mjs +0 -14
  94. package/esm2022/lib/modules/dropdown-components/type-boolean/type-boolean.component.mjs +0 -39
  95. package/esm2022/lib/modules/dropdown-components/type-date/type-date.component.mjs +0 -173
  96. package/esm2022/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +0 -134
  97. package/esm2022/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +0 -80
  98. package/esm2022/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +0 -48
  99. package/esm2022/lib/modules/dropdown-components/type-number/type-number.component.mjs +0 -110
  100. package/esm2022/lib/modules/dropdown-components/type-options/type-options.component.mjs +0 -64
  101. package/esm2022/lib/modules/dropdown-components/type-select/type-select.component.mjs +0 -175
  102. package/esm2022/lib/modules/dropdown-components/type-text/type-text.component.mjs +0 -62
  103. package/esm2022/lib/modules/dropdown-components/types.mjs +0 -41
  104. package/esm2022/lib/modules/dropdown-components/utils.mjs +0 -35
  105. package/esm2022/lib/modules/file/abstract-file.mjs +0 -230
  106. package/esm2022/lib/modules/file/component/file.component.mjs +0 -172
  107. package/esm2022/lib/modules/file/file-drop.directive.mjs +0 -111
  108. package/esm2022/lib/modules/file/file-select.directive.mjs +0 -26
  109. package/esm2022/lib/modules/file/file.service.mjs +0 -43
  110. package/esm2022/lib/modules/file/public-api.mjs +0 -9
  111. package/esm2022/lib/modules/file/types.mjs +0 -2
  112. package/esm2022/lib/modules/file/utils.mjs +0 -129
  113. package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +0 -30
  114. package/esm2022/lib/modules/fixed-button/public-api.mjs +0 -5
  115. package/esm2022/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +0 -56
  116. package/esm2022/lib/modules/fixed-button-detail/public-api.mjs +0 -5
  117. package/esm2022/lib/modules/hierarchic-selector/classes/flat-node.mjs +0 -18
  118. package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs +0 -2
  119. package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs +0 -2
  120. package/esm2022/lib/modules/hierarchic-selector/classes/model-node.mjs +0 -14
  121. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +0 -398
  122. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +0 -243
  123. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +0 -38
  124. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +0 -22
  125. package/esm2022/lib/modules/hierarchic-selector/public-api.mjs +0 -10
  126. package/esm2022/lib/modules/icon/icon.directive.mjs +0 -96
  127. package/esm2022/lib/modules/icon/icon.module.mjs +0 -33
  128. package/esm2022/lib/modules/icon/public-api.mjs +0 -6
  129. package/esm2022/lib/modules/logger/error-handler.mjs +0 -87
  130. package/esm2022/lib/modules/logger/error.module.mjs +0 -22
  131. package/esm2022/lib/modules/logger/public-api.mjs +0 -6
  132. package/esm2022/lib/modules/matomo/matomo.service.mjs +0 -96
  133. package/esm2022/lib/modules/matomo/public-api.mjs +0 -5
  134. package/esm2022/lib/modules/panels/abstract-panel.mjs +0 -76
  135. package/esm2022/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs +0 -12
  136. package/esm2022/lib/modules/panels/panels.component.mjs +0 -27
  137. package/esm2022/lib/modules/panels/panels.module.mjs +0 -10
  138. package/esm2022/lib/modules/panels/panels.service.mjs +0 -329
  139. package/esm2022/lib/modules/panels/panels.urlmatcher.mjs +0 -75
  140. package/esm2022/lib/modules/panels/public-api.mjs +0 -11
  141. package/esm2022/lib/modules/panels/types.mjs +0 -3
  142. package/esm2022/lib/modules/relations/public-api.mjs +0 -5
  143. package/esm2022/lib/modules/relations/relations.component.mjs +0 -254
  144. package/esm2022/lib/modules/search/classes/graphql-doctrine.mjs +0 -111
  145. package/esm2022/lib/modules/search/classes/graphql-doctrine.types.mjs +0 -14
  146. package/esm2022/lib/modules/search/classes/transformers.mjs +0 -142
  147. package/esm2022/lib/modules/search/classes/url.mjs +0 -53
  148. package/esm2022/lib/modules/search/classes/utils.mjs +0 -25
  149. package/esm2022/lib/modules/search/dropdown-container/dropdown-container-animations.mjs +0 -44
  150. package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +0 -87
  151. package/esm2022/lib/modules/search/dropdown-container/dropdown-ref.mjs +0 -24
  152. package/esm2022/lib/modules/search/dropdown-container/dropdown.service.mjs +0 -90
  153. package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +0 -45
  154. package/esm2022/lib/modules/search/group/group.component.mjs +0 -53
  155. package/esm2022/lib/modules/search/input/input.component.mjs +0 -365
  156. package/esm2022/lib/modules/search/public-api.mjs +0 -7
  157. package/esm2022/lib/modules/search/search/search.component.mjs +0 -102
  158. package/esm2022/lib/modules/search/types/dropdown-component.mjs +0 -2
  159. package/esm2022/lib/modules/search/types/facet.mjs +0 -2
  160. package/esm2022/lib/modules/search/types/values.mjs +0 -2
  161. package/esm2022/lib/modules/select/abstract-select.component.mjs +0 -232
  162. package/esm2022/lib/modules/select/public-api.mjs +0 -7
  163. package/esm2022/lib/modules/select/select/select.component.mjs +0 -310
  164. package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +0 -57
  165. package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +0 -155
  166. package/esm2022/lib/modules/sidenav/public-api.mjs +0 -9
  167. package/esm2022/lib/modules/sidenav/sidenav/sidenav.component.mjs +0 -15
  168. package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +0 -90
  169. package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +0 -11
  170. package/esm2022/lib/modules/sidenav/sidenav-stack.service.mjs +0 -50
  171. package/esm2022/lib/modules/sidenav/sidenav.service.mjs +0 -196
  172. package/esm2022/lib/modules/stamp/public-api.mjs +0 -5
  173. package/esm2022/lib/modules/stamp/stamp.component.mjs +0 -23
  174. package/esm2022/lib/modules/table-button/public-api.mjs +0 -5
  175. package/esm2022/lib/modules/table-button/table-button.component.mjs +0 -78
  176. package/esm2022/lib/services/abstract-model.service.mjs +0 -526
  177. package/esm2022/lib/services/debounce.service.mjs +0 -149
  178. package/esm2022/lib/services/enum.service.mjs +0 -64
  179. package/esm2022/lib/services/link-mutation.service.mjs +0 -154
  180. package/esm2022/lib/services/persistence.service.mjs +0 -115
  181. package/esm2022/lib/services/swiss-parsing-date-adapter.service.mjs +0 -63
  182. package/esm2022/lib/types/types.mjs +0 -2
  183. package/esm2022/public-api.mjs +0 -46
@@ -1,140 +0,0 @@
1
- import { Inject, Optional, Pipe } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- function isDate(value) {
4
- return value instanceof Date && !isNaN(value.valueOf());
5
- }
6
- /**
7
- * Returns a string to approximately describe the date.
8
- *
9
- * Eg:
10
- *
11
- * - "il y a quelques minutes"
12
- * - "dans 3 jours"
13
- * - "dans 3 ans"
14
- */
15
- export class NaturalTimeAgoPipe {
16
- fakedNow;
17
- constructor(fakedNow = null) {
18
- this.fakedNow = fakedNow;
19
- }
20
- getNow() {
21
- return this.fakedNow ?? Date.now();
22
- }
23
- transform(date) {
24
- if (!date) {
25
- return '';
26
- }
27
- const stamp = isDate(date) ? date.getTime() : Date.parse(date);
28
- const now = this.getNow();
29
- const $seconds = (stamp - now) / 1000;
30
- const minutes = $seconds / 60;
31
- const hours = minutes / 60;
32
- const days = hours / 24;
33
- const weeks = days / 7;
34
- const months = days / 31;
35
- const years = days / 365;
36
- // Find out the best unit to use for display
37
- if (years <= -2) {
38
- const value = Math.round(Math.abs(years));
39
- return $localize `il y a ${value} ans`;
40
- }
41
- else if (years <= -1) {
42
- return $localize `il y a un an`;
43
- }
44
- else if (months <= -2) {
45
- const value = Math.round(Math.abs(months));
46
- return $localize `il y a ${value} mois`;
47
- }
48
- else if (months <= -1) {
49
- return $localize `il y a un mois`;
50
- }
51
- else if (weeks <= -2) {
52
- const value = Math.round(Math.abs(weeks));
53
- return $localize `il y a ${value} semaines`;
54
- }
55
- else if (weeks <= -1) {
56
- return $localize `il y a une semaine`;
57
- }
58
- else if (days <= -2) {
59
- const value = Math.round(Math.abs(days));
60
- return $localize `il y a ${value} jours`;
61
- }
62
- else if (days <= -1) {
63
- return $localize `il y a un jour`;
64
- }
65
- else if (hours <= -2) {
66
- const value = Math.round(Math.abs(hours));
67
- return $localize `il y a ${value} heures`;
68
- }
69
- else if (hours <= -1) {
70
- return $localize `il y a une heure`;
71
- }
72
- else if (minutes <= -5) {
73
- const value = Math.round(Math.abs(minutes));
74
- return $localize `il y a ${value} minutes`;
75
- }
76
- else if (minutes <= 0) {
77
- return $localize `il y a quelques minutes`;
78
- }
79
- else if (years > 2) {
80
- const value = Math.round(years);
81
- return $localize `dans ${value} ans`;
82
- }
83
- else if (years > 1) {
84
- return $localize `dans un an`;
85
- }
86
- else if (months > 2) {
87
- const value = Math.round(months);
88
- return $localize `dans ${value} mois`;
89
- }
90
- else if (months > 1) {
91
- return $localize `dans un mois`;
92
- }
93
- else if (weeks > 2) {
94
- const value = Math.round(weeks);
95
- return $localize `dans ${value} semaines`;
96
- }
97
- else if (weeks > 1) {
98
- return $localize `dans une semaine`;
99
- }
100
- else if (days > 2) {
101
- const value = Math.round(days);
102
- return $localize `dans ${value} jours`;
103
- }
104
- else if (days > 1) {
105
- return $localize `dans un jour`;
106
- }
107
- else if (hours > 2) {
108
- const value = Math.round(hours);
109
- return $localize `dans ${value} heures`;
110
- }
111
- else if (hours > 1) {
112
- return $localize `dans une heure`;
113
- }
114
- else if (minutes > 5) {
115
- const value = Math.round(minutes);
116
- return $localize `dans ${value} minutes`;
117
- }
118
- else if (minutes > 0) {
119
- return $localize `dans quelques minutes`;
120
- }
121
- else {
122
- throw new Error('Time travelling just happened');
123
- }
124
- }
125
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, deps: [{ token: 'SHOULD_NEVER_BE_INJECTED', optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
126
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, isStandalone: true, name: "timeAgo" });
127
- }
128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, decorators: [{
129
- type: Pipe,
130
- args: [{
131
- name: 'timeAgo',
132
- standalone: true,
133
- }]
134
- }], ctorParameters: () => [{ type: undefined, decorators: [{
135
- type: Optional
136
- }, {
137
- type: Inject,
138
- args: ['SHOULD_NEVER_BE_INJECTED']
139
- }] }] });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1hZ28ucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2NvbW1vbi9waXBlcy90aW1lLWFnby5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7O0FBRXBFLFNBQVMsTUFBTSxDQUFDLEtBQVU7SUFDdEIsT0FBTyxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUtILE1BQU0sT0FBTyxrQkFBa0I7SUFFMEM7SUFEckUsWUFDcUUsV0FBMEIsSUFBSTtRQUE5QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtJQUNoRyxDQUFDO0lBRUksTUFBTTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFzQztRQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFMUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDOUIsTUFBTSxL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QUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLFNBQVMsQ0FBQSxRQUFRLEtBQUssU0FBUyxDQUFDO1FBQzNDLENBQUM7YUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQSxnQkFBZ0IsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQSxRQUFRLEtBQUssVUFBVSxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLFNBQVMsQ0FBQSx1QkFBdUIsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQzt1R0F6RlEsa0JBQWtCLGtCQUVILDBCQUEwQjtxR0FGekMsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUo5QixJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs7MEJBR1EsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgT3B0aW9uYWwsIFBpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5mdW5jdGlvbiBpc0RhdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIERhdGUge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyB0byBhcHByb3hpbWF0ZWx5IGRlc2NyaWJlIHRoZSBkYXRlLlxuICpcbiAqIEVnOlxuICpcbiAqIC0gXCJpbCB5IGEgcXVlbHF1ZXMgbWludXRlc1wiXG4gKiAtIFwiZGFucyAzIGpvdXJzXCJcbiAqIC0gXCJkYW5zIDMgYW5zXCJcbiAqL1xuQFBpcGUoe1xuICAgIG5hbWU6ICd0aW1lQWdvJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsVGltZUFnb1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ1NIT1VMRF9ORVZFUl9CRV9JTkpFQ1RFRCcpIHByaXZhdGUgcmVhZG9ubHkgZmFrZWROb3c6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHByaXZhdGUgZ2V0Tm93KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZha2VkTm93ID8/IERhdGUubm93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybShkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhbXAgPSBpc0RhdGUoZGF0ZSkgPyBkYXRlLmdldFRpbWUoKSA6IERhdGUucGFyc2UoZGF0ZSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuZ2V0Tm93KCk7XG5cbiAgICAgICAgY29uc3QgJHNlY29uZHMgPSAoc3RhbXAgLSBub3cpIC8gMTAwMDtcbiAgICAgICAgY29uc3QgbWludXRlcyA9ICRzZWNvbmRzIC8gNjA7XG4gICAgICAgIGNvbnN0IGhvdXJzID0gbWludXRlcyAvIDYwO1xuICAgICAgICBjb25zdCBkYXlzID0gaG91cnMgLyAyNDtcbiAgICAgICAgY29uc3Qgd2Vla3MgPSBkYXlzIC8gNztcbiAgICAgICAgY29uc3QgbW9udGhzID0gZGF5cyAvIDMxO1xuICAgICAgICBjb25zdCB5ZWFycyA9IGRheXMgLyAzNjU7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgdGhlIGJlc3QgdW5pdCB0byB1c2UgZm9yIGRpc3BsYXlcbiAgICAgICAgaWYgKHllYXJzIDw9IC0yKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoTWF0aC5hYnMoeWVhcnMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IGFuc2A7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhcnMgPD0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhIHVuIGFuYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPD0gLTIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyhtb250aHMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IG1vaXNgO1xuICAgICAgICB9IGVsc2UgaWYgKG1vbnRocyA8PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBpbCB5IGEgdW4gbW9pc2A7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla3MgPD0gLTIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyh3ZWVrcykpO1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBpbCB5IGEgJHt2YWx1ZX0gc2VtYWluZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1bmUgc2VtYWluZWA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA8PSAtMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKGRheXMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IGpvdXJzYDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1biBqb3VyYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA8PSAtMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKGhvdXJzKSk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSAke3ZhbHVlfSBoZXVyZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1bmUgaGV1cmVgO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPD0gLTUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyhtaW51dGVzKSk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSAke3ZhbHVlfSBtaW51dGVzYDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhIHF1ZWxxdWVzIG1pbnV0ZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXJzID4gMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKHllYXJzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBhbnNgO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXJzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBkYW5zIHVuIGFuYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPiAyKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQobW9udGhzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBtb2lzYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgdW4gbW9pc2A7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla3MgPiAyKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQod2Vla3MpO1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBkYW5zICR7dmFsdWV9IHNlbWFpbmVzYDtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrcyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1bmUgc2VtYWluZWA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChkYXlzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBqb3Vyc2A7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1biBqb3VyYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChob3Vycyk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgJHt2YWx1ZX0gaGV1cmVzYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1bmUgaGV1cmVgO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPiA1KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQobWludXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgJHt2YWx1ZX0gbWludXRlc2A7XG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlcyA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyBxdWVscXVlcyBtaW51dGVzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGltZSB0cmF2ZWxsaW5nIGp1c3QgaGFwcGVuZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -1,14 +0,0 @@
1
- /*
2
- * Public API Surface of natural
3
- */
4
- export * from './directives/linkable-tab.directive';
5
- export * from './pipes/capitalize.pipe';
6
- export * from './pipes/ellipsis.pipe';
7
- export * from './pipes/enum.pipe';
8
- export { NaturalTimeAgoPipe } from './pipes/time-ago.pipe';
9
- export * from './services/memory-storage';
10
- export { NaturalSrcDensityDirective } from './directives/src-density.directive';
11
- export { NaturalBackgroundDensityDirective } from './directives/background-density.directive';
12
- export { NATURAL_SEO_CONFIG, NaturalSeoService } from './services/seo.service';
13
- export { provideSeo } from './services/seo.provider';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2NvbW1vbi9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQzVGLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBUzdFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmF0dXJhbFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aXZlcy9saW5rYWJsZS10YWIuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZXMvY2FwaXRhbGl6ZS5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZXMvZWxsaXBzaXMucGlwZSc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVzL2VudW0ucGlwZSc7XG5leHBvcnQge05hdHVyYWxUaW1lQWdvUGlwZX0gZnJvbSAnLi9waXBlcy90aW1lLWFnby5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvbWVtb3J5LXN0b3JhZ2UnO1xuZXhwb3J0IHtOYXR1cmFsU3JjRGVuc2l0eURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL3NyYy1kZW5zaXR5LmRpcmVjdGl2ZSc7XG5leHBvcnQge05hdHVyYWxCYWNrZ3JvdW5kRGVuc2l0eURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL2JhY2tncm91bmQtZGVuc2l0eS5kaXJlY3RpdmUnO1xuZXhwb3J0IHtOQVRVUkFMX1NFT19DT05GSUcsIE5hdHVyYWxTZW9TZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL3Nlby5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgICBOYXR1cmFsU2VvQ29uZmlnLFxuICAgIE5hdHVyYWxTZW8sXG4gICAgTmF0dXJhbFNlb0Jhc2ljLFxuICAgIE5hdHVyYWxTZW9SZXNvbHZlLFxuICAgIE5hdHVyYWxTZW9DYWxsYmFjayxcbiAgICBOYXR1cmFsU2VvUmVzb2x2ZURhdGEsXG59IGZyb20gJy4vc2VydmljZXMvc2VvLnNlcnZpY2UnO1xuZXhwb3J0IHtwcm92aWRlU2VvfSBmcm9tICcuL3NlcnZpY2VzL3Nlby5wcm92aWRlcic7XG4iXX0=
@@ -1,110 +0,0 @@
1
- import { Injectable, InjectionToken } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export const SESSION_STORAGE = new InjectionToken('Session storage that can be shimed when running on server or in tests');
4
- export const LOCAL_STORAGE = new InjectionToken('Local storage that can be shimed when running on server or in tests');
5
- /**
6
- * Memory storage to keep store volatile things in memory
7
- *
8
- * Should be used to shim sessionStorage when running on server or in our tests
9
- */
10
- export class NaturalMemoryStorage {
11
- data = new Map();
12
- get length() {
13
- return this.data.size;
14
- }
15
- clear() {
16
- this.data.clear();
17
- }
18
- getItem(key) {
19
- const value = this.data.get(key);
20
- return value === undefined ? null : value;
21
- }
22
- key(index) {
23
- let i = 0;
24
- for (const key of this.data.keys()) {
25
- if (i++ === index) {
26
- return key;
27
- }
28
- }
29
- return null;
30
- }
31
- removeItem(key) {
32
- this.data.delete(key);
33
- }
34
- setItem(key, value) {
35
- this.data.set(key, value);
36
- }
37
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
38
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, providedIn: 'root' });
39
- }
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, decorators: [{
41
- type: Injectable,
42
- args: [{
43
- providedIn: 'root',
44
- }]
45
- }] });
46
- export function sessionStorageFactory() {
47
- try {
48
- // eslint-disable-next-line no-restricted-globals
49
- if (typeof sessionStorage !== 'undefined') {
50
- // eslint-disable-next-line no-restricted-globals
51
- return sessionStorage;
52
- }
53
- }
54
- catch (e) {
55
- // nothing do to
56
- }
57
- return new NaturalMemoryStorage();
58
- }
59
- /**
60
- * Standard `sessionStorage` provider that is compatible with SSR.
61
- *
62
- * In SSR environment, or when `sessionStorage` is not available, will return a `NaturalMemoryStorage`
63
- */
64
- export const sessionStorageProvider = {
65
- // Here we must use a factory that return directly the value, otherwise it will
66
- // crash when running on server because the value does not exist (but the factory will
67
- // never actually be called on server, so the server will not see the missing value)
68
- provide: SESSION_STORAGE,
69
- useFactory: sessionStorageFactory,
70
- };
71
- /**
72
- * Provide in-memory session storage to be used only in tests or SSR
73
- */
74
- export const memorySessionStorageProvider = {
75
- provide: SESSION_STORAGE,
76
- useClass: NaturalMemoryStorage,
77
- };
78
- export function localStorageFactory() {
79
- try {
80
- // eslint-disable-next-line no-restricted-globals
81
- if (typeof localStorage !== 'undefined') {
82
- // eslint-disable-next-line no-restricted-globals
83
- return localStorage;
84
- }
85
- }
86
- catch (e) {
87
- // Do nothing
88
- }
89
- return new NaturalMemoryStorage();
90
- }
91
- /**
92
- * Standard `localStorage` provider that is compatible with SSR.
93
- *
94
- * In SSR environment, or when `localStorage` is not available, will return a `NaturalMemoryStorage`
95
- */
96
- export const localStorageProvider = {
97
- // Here we must use a factory that return directly the value, otherwise it will
98
- // crash when running on server because the value does not exist (but the factory will
99
- // never actually be called on server, so the server will not see the missing value)
100
- provide: LOCAL_STORAGE,
101
- useFactory: localStorageFactory,
102
- };
103
- /**
104
- * Provide in-memory local storage to be used only in tests or SSR
105
- */
106
- export const memoryLocalStorageProvider = {
107
- provide: LOCAL_STORAGE,
108
- useClass: NaturalMemoryStorage,
109
- };
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvbWVtb3J5LXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQVcsTUFBTSxlQUFlLENBQUM7O0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FDN0MsdUVBQXVFLENBQzFFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQzNDLHFFQUFxRSxDQUN4RSxDQUFDO0FBT0Y7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFDWixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFbEQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU0sS0FBSztRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxLQUFhO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVSxDQUFDLEdBQVc7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzt1R0FqQ1Esb0JBQW9COzJHQUFwQixvQkFBb0IsY0FGakIsTUFBTTs7MkZBRVQsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7QUFxQ0QsTUFBTSxVQUFVLHFCQUFxQjtJQUNqQyxJQUFJLENBQUM7UUFDRCxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxpREFBaUQ7WUFDakQsT0FBTyxjQUFjLENBQUM7UUFDMUIsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsZ0JBQWdCO0lBQ3BCLENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFhO0lBQzVDLCtFQUErRTtJQUMvRSxzRkFBc0Y7SUFDdEYsb0ZBQW9GO0lBQ3BGLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFVBQVUsRUFBRSxxQkFBcUI7Q0FDcEMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWE7SUFDbEQsT0FBTyxFQUFFLGVBQWU7SUFDeEIsUUFBUSxFQUFFLG9CQUFvQjtDQUNqQyxDQUFDO0FBRUYsTUFBTSxVQUFVLG1CQUFtQjtJQUMvQixJQUFJLENBQUM7UUFDRCxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxpREFBaUQ7WUFDakQsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsYUFBYTtJQUNqQixDQUFDO0lBRUQsT0FBTyxJQUFJLG9CQUFvQixFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBYTtJQUMxQywrRUFBK0U7SUFDL0Usc0ZBQXNGO0lBQ3RGLG9GQUFvRjtJQUNwRixPQUFPLEVBQUUsYUFBYTtJQUN0QixVQUFVLEVBQUUsbUJBQW1CO0NBQ2xDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFhO0lBQ2hELE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFFBQVEsRUFBRSxvQkFBb0I7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IFNFU1NJT05fU1RPUkFHRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU3RvcmFnZT4oXG4gICAgJ1Nlc3Npb24gc3RvcmFnZSB0aGF0IGNhbiBiZSBzaGltZWQgd2hlbiBydW5uaW5nIG9uIHNlcnZlciBvciBpbiB0ZXN0cycsXG4pO1xuXG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU3RvcmFnZT4oXG4gICAgJ0xvY2FsIHN0b3JhZ2UgdGhhdCBjYW4gYmUgc2hpbWVkIHdoZW4gcnVubmluZyBvbiBzZXJ2ZXIgb3IgaW4gdGVzdHMnLFxuKTtcblxuLyoqXG4gKiBOb3JtYWwgYFN0b3JhZ2VgIHR5cGUsIGJ1dCB3aXRob3V0IGFycmF5IGFjY2Vzc1xuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU3RvcmFnZSA9IFBpY2s8U3RvcmFnZSwgJ2xlbmd0aCcgfCAnY2xlYXInIHwgJ2dldEl0ZW0nIHwgJ2tleScgfCAncmVtb3ZlSXRlbScgfCAnc2V0SXRlbSc+O1xuXG4vKipcbiAqIE1lbW9yeSBzdG9yYWdlIHRvIGtlZXAgc3RvcmUgdm9sYXRpbGUgdGhpbmdzIGluIG1lbW9yeVxuICpcbiAqIFNob3VsZCBiZSB1c2VkIHRvIHNoaW0gc2Vzc2lvblN0b3JhZ2Ugd2hlbiBydW5uaW5nIG9uIHNlcnZlciBvciBpbiBvdXIgdGVzdHNcbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBOYXR1cmFsU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmRhdGEua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoaSsrID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uU3RvcmFnZUZhY3RvcnkoKTogTmF0dXJhbFN0b3JhZ2Uge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90aGluZyBkbyB0b1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmF0dXJhbE1lbW9yeVN0b3JhZ2UoKTtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBgc2Vzc2lvblN0b3JhZ2VgIHByb3ZpZGVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIFNTUi5cbiAqXG4gKiBJbiBTU1IgZW52aXJvbm1lbnQsIG9yIHdoZW4gYHNlc3Npb25TdG9yYWdlYCBpcyBub3QgYXZhaWxhYmxlLCB3aWxsIHJldHVybiBhIGBOYXR1cmFsTWVtb3J5U3RvcmFnZWBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlc3Npb25TdG9yYWdlUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIC8vIEhlcmUgd2UgbXVzdCB1c2UgYSBmYWN0b3J5IHRoYXQgcmV0dXJuIGRpcmVjdGx5IHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHdpbGxcbiAgICAvLyBjcmFzaCB3aGVuIHJ1bm5pbmcgb24gc2VydmVyIGJlY2F1c2UgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0IChidXQgdGhlIGZhY3Rvcnkgd2lsbFxuICAgIC8vIG5ldmVyIGFjdHVhbGx5IGJlIGNhbGxlZCBvbiBzZXJ2ZXIsIHNvIHRoZSBzZXJ2ZXIgd2lsbCBub3Qgc2VlIHRoZSBtaXNzaW5nIHZhbHVlKVxuICAgIHByb3ZpZGU6IFNFU1NJT05fU1RPUkFHRSxcbiAgICB1c2VGYWN0b3J5OiBzZXNzaW9uU3RvcmFnZUZhY3RvcnksXG59O1xuXG4vKipcbiAqIFByb3ZpZGUgaW4tbWVtb3J5IHNlc3Npb24gc3RvcmFnZSB0byBiZSB1c2VkIG9ubHkgaW4gdGVzdHMgb3IgU1NSXG4gKi9cbmV4cG9ydCBjb25zdCBtZW1vcnlTZXNzaW9uU3RvcmFnZVByb3ZpZGVyOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBTRVNTSU9OX1NUT1JBR0UsXG4gICAgdXNlQ2xhc3M6IE5hdHVyYWxNZW1vcnlTdG9yYWdlLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZUZhY3RvcnkoKTogTmF0dXJhbFN0b3JhZ2Uge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOYXR1cmFsTWVtb3J5U3RvcmFnZSgpO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIGBsb2NhbFN0b3JhZ2VgIHByb3ZpZGVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIFNTUi5cbiAqXG4gKiBJbiBTU1IgZW52aXJvbm1lbnQsIG9yIHdoZW4gYGxvY2FsU3RvcmFnZWAgaXMgbm90IGF2YWlsYWJsZSwgd2lsbCByZXR1cm4gYSBgTmF0dXJhbE1lbW9yeVN0b3JhZ2VgXG4gKi9cbmV4cG9ydCBjb25zdCBsb2NhbFN0b3JhZ2VQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gICAgLy8gSGVyZSB3ZSBtdXN0IHVzZSBhIGZhY3RvcnkgdGhhdCByZXR1cm4gZGlyZWN0bHkgdGhlIHZhbHVlLCBvdGhlcndpc2UgaXQgd2lsbFxuICAgIC8vIGNyYXNoIHdoZW4gcnVubmluZyBvbiBzZXJ2ZXIgYmVjYXVzZSB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QgKGJ1dCB0aGUgZmFjdG9yeSB3aWxsXG4gICAgLy8gbmV2ZXIgYWN0dWFsbHkgYmUgY2FsbGVkIG9uIHNlcnZlciwgc28gdGhlIHNlcnZlciB3aWxsIG5vdCBzZWUgdGhlIG1pc3NpbmcgdmFsdWUpXG4gICAgcHJvdmlkZTogTE9DQUxfU1RPUkFHRSxcbiAgICB1c2VGYWN0b3J5OiBsb2NhbFN0b3JhZ2VGYWN0b3J5LFxufTtcblxuLyoqXG4gKiBQcm92aWRlIGluLW1lbW9yeSBsb2NhbCBzdG9yYWdlIHRvIGJlIHVzZWQgb25seSBpbiB0ZXN0cyBvciBTU1JcbiAqL1xuZXhwb3J0IGNvbnN0IG1lbW9yeUxvY2FsU3RvcmFnZVByb3ZpZGVyOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBMT0NBTF9TVE9SQUdFLFxuICAgIHVzZUNsYXNzOiBOYXR1cmFsTWVtb3J5U3RvcmFnZSxcbn07XG4iXX0=
@@ -1,23 +0,0 @@
1
- import { APP_INITIALIZER, inject } from '@angular/core';
2
- import { NATURAL_SEO_CONFIG, NaturalSeoService } from './seo.service';
3
- /**
4
- * Configure and starts `NaturalSeoService`
5
- */
6
- export function provideSeo(config) {
7
- return [
8
- {
9
- provide: NATURAL_SEO_CONFIG,
10
- useValue: config,
11
- },
12
- {
13
- provide: APP_INITIALIZER,
14
- multi: true,
15
- useFactory: () => {
16
- // injection required, but works without doing anything else
17
- inject(NaturalSeoService);
18
- return () => undefined;
19
- },
20
- },
21
- ];
22
- }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvY29tbW9uL3NlcnZpY2VzL3Nlby5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUF3QjtJQUMvQyxPQUFPO1FBQ0g7WUFDSSxPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLFFBQVEsRUFBRSxNQUFNO1NBQ25CO1FBQ0Q7WUFDSSxPQUFPLEVBQUUsZUFBZTtZQUN4QixLQUFLLEVBQUUsSUFBSTtZQUNYLFVBQVUsRUFBRSxHQUFpQixFQUFFO2dCQUMzQiw0REFBNEQ7Z0JBQzVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUUxQixPQUFPLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUMzQixDQUFDO1NBQ0o7S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QVBQX0lOSVRJQUxJWkVSLCBpbmplY3QsIFByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TkFUVVJBTF9TRU9fQ09ORklHLCBOYXR1cmFsU2VvQ29uZmlnLCBOYXR1cmFsU2VvU2VydmljZX0gZnJvbSAnLi9zZW8uc2VydmljZSc7XG5cbi8qKlxuICogQ29uZmlndXJlIGFuZCBzdGFydHMgYE5hdHVyYWxTZW9TZXJ2aWNlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVNlbyhjb25maWc6IE5hdHVyYWxTZW9Db25maWcpOiBQcm92aWRlcltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOQVRVUkFMX1NFT19DT05GSUcsXG4gICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluamVjdGlvbiByZXF1aXJlZCwgYnV0IHdvcmtzIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIGluamVjdChOYXR1cmFsU2VvU2VydmljZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICBdO1xufVxuIl19
@@ -1,235 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { inject, Injectable, InjectionToken, LOCALE_ID } from '@angular/core';
3
- import { Meta, Title } from '@angular/platform-browser';
4
- import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';
5
- import { NaturalDialogTriggerComponent } from '../../dialog-trigger/dialog-trigger.component';
6
- import { combineLatest, filter, map, Observable, of, startWith, switchMap } from 'rxjs';
7
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
- import * as i0 from "@angular/core";
9
- export const NATURAL_SEO_CONFIG = new InjectionToken('Configuration for SEO service');
10
- export function stripTags(str) {
11
- return str.replace(/<\/?[^>]*>/g, '');
12
- }
13
- /**
14
- * This service is responsible to keep up to date the page title and page description according
15
- * to what is configured in routing or default values.
16
- *
17
- * It **must** be injected in the root module of the application to have effects in all modules. And it
18
- * must be provided a configuration.
19
- *
20
- * The full title has the following structure:
21
- *
22
- * dialog title - page title - extra part - app name
23
- *
24
- * `dialog title` only exists if a `NaturalDialogTriggerComponent` is currently open, and that some SEO is
25
- * configured for it in the routing.
26
- */
27
- export class NaturalSeoService {
28
- router = inject(Router);
29
- titleService = inject(Title);
30
- metaTagService = inject(Meta);
31
- document = inject(DOCUMENT);
32
- locale = inject(LOCALE_ID);
33
- routeData;
34
- config = {
35
- applicationName: '',
36
- };
37
- constructor() {
38
- const configToken = inject(NATURAL_SEO_CONFIG);
39
- combineLatest({
40
- config: configToken instanceof Observable ? configToken.pipe(startWith(this.config)) : of(configToken),
41
- navigationEnd: this.router.events.pipe(filter(event => event instanceof NavigationEnd)),
42
- })
43
- .pipe(takeUntilDestroyed(), switchMap(({ config }) => {
44
- this.config = config;
45
- const root = this.router.routerState.root.snapshot;
46
- this.routeData = this.getRouteData(root);
47
- const seo = this.routeData.seo ?? { title: '' };
48
- const dialogRouteData = this.getDialogRouteData(root);
49
- const dialogSeo = dialogRouteData?.seo;
50
- const basic = this.toBasic(seo, this.routeData);
51
- const dialogBasic = dialogRouteData && dialogSeo ? this.toBasic(dialogSeo, dialogRouteData) : of(null);
52
- return combineLatest({ basic, dialogBasic });
53
- }))
54
- .subscribe(({ basic, dialogBasic }) => {
55
- if (dialogBasic) {
56
- basic = {
57
- ...dialogBasic,
58
- title: this.join([dialogBasic.title, basic.title]),
59
- };
60
- }
61
- this.update(basic);
62
- });
63
- }
64
- /**
65
- * Update the SEO with given info. The extra part and app name will be appended automatically.
66
- *
67
- * In most cases, this should not be used. And instead, the SEO should be configured in the routing,
68
- * possibly with the callback variant for some dynamism.
69
- *
70
- * But in rare cases, only the Component is able to build a proper page title, after it gathered everything it
71
- * needed. For those cases, the Component can inject this service and update the SEO directly.
72
- */
73
- update(seo) {
74
- // Title
75
- const parts = [
76
- seo.title,
77
- this.config.extraPart && this.routeData ? this.config.extraPart(this.routeData) : '',
78
- this.config.applicationName,
79
- ];
80
- const title = this.join(parts);
81
- this.titleService.setTitle(title);
82
- // Description
83
- const description = seo?.description ?? this.config.defaultDescription;
84
- this.updateTag('description', description);
85
- // Robots
86
- const robots = seo?.robots ?? this.config.defaultRobots;
87
- this.updateTag('robots', robots);
88
- // Canonical
89
- // Add language in url (after domain) if some languages are provided only
90
- const language = this.config.languages?.length && this.locale ? this.locale.split('-')[0] : '';
91
- const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist ?? []);
92
- this.updateLinkTag({ rel: 'canonical', href: this.getUrl(urlParts, language) });
93
- this.updateAlternates(urlParts);
94
- }
95
- updateAlternates(urlParts) {
96
- this.config.languages?.forEach(language => {
97
- this.updateLinkTag({ rel: 'alternate', href: this.getUrl(urlParts, language), hreflang: language });
98
- });
99
- }
100
- getUrlParts(whiteListedParams) {
101
- let url = 'https://' + this.document.defaultView?.window.location.hostname;
102
- const urlTree = this.router.parseUrl(this.router.url);
103
- // need better like something recursive ?
104
- if (urlTree.root.hasChildren()) {
105
- const segments = urlTree.root.children.primary?.segments;
106
- if (segments && segments.length > 0) {
107
- url += '/' + segments.map(segment => segment.path).join('/');
108
- }
109
- }
110
- // Query Params
111
- let params = '';
112
- for (const whiteListedParam of whiteListedParams) {
113
- if (whiteListedParam in urlTree.queryParams) {
114
- const key = encodeURIComponent(whiteListedParam);
115
- const value = encodeURIComponent(urlTree.queryParams[whiteListedParam]);
116
- if (params.length) {
117
- params += '&';
118
- }
119
- params += `${key}=${value}`;
120
- }
121
- }
122
- if (params.length) {
123
- params = '?' + params;
124
- }
125
- return { url, params };
126
- }
127
- /**
128
- * Add language between domain and uri https://example.com/fr/folder/page
129
- */
130
- getUrl(urlParts, language) {
131
- let url = urlParts.url;
132
- if (language) {
133
- url = this.addLanguageSegment(url, language);
134
- }
135
- if (urlParts.params) {
136
- url += urlParts.params;
137
- }
138
- return url;
139
- }
140
- addLanguageSegment(url, language) {
141
- const urlObj = new URL(url);
142
- const newPath = urlObj.pathname === '/' ? `/${language}` : `/${language}${urlObj.pathname}`;
143
- return urlObj.origin + newPath + urlObj.search + urlObj.hash;
144
- }
145
- join(parts) {
146
- return parts.filter(s => !!s).join(' - ');
147
- }
148
- updateTag(name, value) {
149
- if (value) {
150
- this.metaTagService.updateTag({
151
- name: name,
152
- value: stripTags(value),
153
- });
154
- }
155
- else {
156
- this.metaTagService.removeTag(`name="${name}"`);
157
- }
158
- }
159
- updateLinkTag(definition) {
160
- const linkElement = this.document.head.querySelector(this.parseSelector(definition)) ??
161
- this.document.head.appendChild(this.document.createElement('link'));
162
- if (linkElement) {
163
- Object.keys(definition).forEach((attribute) => {
164
- linkElement.setAttribute(attribute, definition[attribute]);
165
- });
166
- }
167
- }
168
- /**
169
- * Returns selector to use in querySelector to get the given link
170
- */
171
- parseSelector(definition) {
172
- let attributes = 'link';
173
- Object.keys(definition).forEach(attr => {
174
- if (attr !== 'href') {
175
- attributes += `[${attr}="${definition[attr]}"]`;
176
- }
177
- });
178
- return attributes;
179
- }
180
- /**
181
- * Returns the data from the most deep/specific activated route
182
- */
183
- getRouteData(route) {
184
- if (route.firstChild) {
185
- return this.getRouteData(route.firstChild);
186
- }
187
- else {
188
- return route.data;
189
- }
190
- }
191
- /**
192
- * Returns the data from the `NaturalDialogTriggerComponent` if one is open
193
- */
194
- getDialogRouteData(route) {
195
- if (route.component === NaturalDialogTriggerComponent && route.outlet !== PRIMARY_OUTLET) {
196
- return route.data;
197
- }
198
- for (const child of route.children) {
199
- const data = this.getDialogRouteData(child);
200
- if (data) {
201
- return data;
202
- }
203
- }
204
- return null;
205
- }
206
- toBasic(seo, routeData) {
207
- if (typeof seo === 'function') {
208
- const result = seo(routeData);
209
- return result instanceof Observable ? result : of(result);
210
- }
211
- else if ('resolve' in seo) {
212
- if (!('model' in routeData)) {
213
- throw new Error('Could not find resolved data `model` for SEO service');
214
- }
215
- const model = routeData.model;
216
- return (model instanceof Observable ? model : of(model)).pipe(map(value => {
217
- return {
218
- title: value?.fullName ?? value?.name ?? '',
219
- description: value?.description,
220
- robots: seo.robots,
221
- };
222
- }));
223
- }
224
- return of(seo);
225
- }
226
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
227
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, providedIn: 'root' });
228
- }
229
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, decorators: [{
230
- type: Injectable,
231
- args: [{
232
- providedIn: 'root',
233
- }]
234
- }], ctorParameters: () => [] });
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvc2VvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQStCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDNUYsT0FBTyxFQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUE2RzlELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFtQiwrQkFBK0IsQ0FBQyxDQUFDO0FBRXhHLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBVztJQUNqQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFZRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUNULE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixjQUFjLEdB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LENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7YUFBTSxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzVFLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBRTlCLE9BQU8sQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDekQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNSLE9BQU87b0JBQ0gsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFO29CQUMzQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVc7b0JBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtpQkFDckIsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDTixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQzt1R0EvT1EsaUJBQWlCOzJHQUFqQixpQkFBaUIsY0FGZCxNQUFNOzsyRkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgTE9DQUxFX0lEfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWV0YSwgVGl0bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBEYXRhLCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudH0gZnJvbSAnLi4vLi4vZGlhbG9nLXRyaWdnZXIvZGlhbG9nLXRyaWdnZXIuY29tcG9uZW50JztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzdGFydFdpdGgsIHN3aXRjaE1hcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvID0gTmF0dXJhbFNlb0Jhc2ljIHwgTmF0dXJhbFNlb0NhbGxiYWNrIHwgTmF0dXJhbFNlb1Jlc29sdmU7XG5cbi8qKlxuICogVHlwaWNhbGx5IHVzZWQgZm9yIFwic3RhdGljXCIgcGFnZXMgd2hlcmUgdGhlcmUgaXMgbm90IGEgc2luZ2xlIHJlc29sdmVkIG9iamVjdC4gU29cbiAqIGFsbCBwYWdlcyBzdWNoIGFzIFwiQWJvdXRcIiwgb3IgbGlzdCBvZiBvYmplY3RzIChsaXN0IG9mIHJpc2tzLCBldGMuKS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gdXNlZCB2YXJpYW50LlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQmFzaWMgPSBSb2JvdHMgJiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhZ2UgdGl0bGUsIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aCBhcHBsaWNhdGlvbiBuYW1lXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElmIGdpdmVuIHdpbGwgYmUgdXNlZCBhcyBwYWdlIGRlc2NyaXB0aW9uLCBvdGhlcndpc2UgZmFsbGJhY2sgb24gZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwYXJhbWV0ZXJzIGluY2x1ZGVkIGluIHRoZSBjYW5vbmljYWwgdGFnJ3MgdXJsXG4gICAgICovXG4gICAgY2Fub25pY2FsUXVlcnlQYXJhbXNXaGl0ZWxpc3Q/OiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgTmF0dXJhbExpbmtEZWZpbml0aW9uID0ge1xuICAgIGNoYXJzZXQ/OiBzdHJpbmc7XG4gICAgY3Jvc3NvcmlnaW4/OiBzdHJpbmc7XG4gICAgaHJlZj86IHN0cmluZztcbiAgICBocmVmbGFuZz86IHN0cmluZztcbiAgICBtZWRpYT86IHN0cmluZztcbiAgICByZWw/OiBzdHJpbmc7XG4gICAgcmV2Pzogc3RyaW5nO1xuICAgIHNpemVzPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xufSAmIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4vKipcbiAqIFR5cGljYWxseSB1c2VkIGZvciBhIFwiZHluYW1pY1wiIHBhZ2Ugd2hlcmUgYSBzaW5nbGUgb2JqZWN0IGlzIHJlc29sdmVkLiBTbyBhIGRldGFpbCBwYWdlLCBzdWNoXG4gKiBhcyB0aGUgZGV0YWlsIG9mIGEgcmlzayBhbmQgc28gb24uXG4gKi9cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW9SZXNvbHZlID0gUm9ib3RzICYge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgYG1vZGVsYCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdmVkIGRhdGEgdG8gZmluZCB0aGUgcmVzb2x2ZWQgb2JqZWN0LiBUaGUgZnVsbE5hbWVcbiAgICAgKiBvciBuYW1lIG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGZvciBwYWdlIHRpdGxlLCBhbmQgdGhlIG9iamVjdCBkZXNjcmlwdGlvbiwgaWYgYW55LFxuICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgcGFnZSBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICByZXNvbHZlOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSYXJlbHkgdXNlZCBmb3IgYSBwYWdlIHRoYXQgaGFzIHZlcnkgc3BlY2lmaWMgbmVlZHMgYW5kIG5lZWQgdG8gYnVpbGQgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGluIGEgY3VzdG9tIHdheS5cbiAqIFRoZSBjYWxsYmFjayBiYWNrIHdpbGwgYmUgZ2l2ZW4gdGhlIHJlc29sdmVkIGRhdGEsIGFuZCBpdCBpcyB1cCB0byB0aGUgY2FsbGJhY2sgdG8gZmluZCB3aGF0ZXZlciBpdCBuZWVkcy5cbiAqL1xuZXhwb3J0IHR5cGUgTmF0dXJhbFNlb0NhbGxiYWNrID0gKHJvdXRlRGF0YTogRGF0YSkgPT4gTmF0dXJhbFNlb0Jhc2ljIHwgT2JzZXJ2YWJsZTxOYXR1cmFsU2VvQmFzaWM+O1xuXG4vKipcbiAqIFR5cGljYWxseSB1c2VkIHRvIHR5cGUgdGhlIHJvdXRpbmcgZGF0YSByZWNlaXZlZCBpbiB0aGUgY29tcG9uZW50LCBlZzpcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3REZXRhaWw8TXlTZXJ2aWNlLCBOYXR1cmFsU2VvUmVzb2x2ZURhdGE+IHt9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTmF0dXJhbFNlb1Jlc29sdmVEYXRhID0ge1xuICAgIHNlbzogTmF0dXJhbFNlb0Jhc2ljO1xufTtcblxudHlwZSBSb2JvdHMgPSB7XG4gICAgLyoqXG4gICAgICogSWYgZ2l2ZW4gd2lsbCBiZSB1c2VkIGFzIHJvYm90cyBtZXRhIHRhZywgb3RoZXJ3aXNlIGZhbGxiYWNrIG9uIGRlZmF1bHQgdmFsdWVcbiAgICAgKi9cbiAgICByb2JvdHM/OiBzdHJpbmc7XG59O1xuXG50eXBlIE5hdHVyYWxTZW9Db25maWdQbGFpbiA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB3aWxsIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHBhZ2UgdGl0bGVcbiAgICAgKi9cbiAgICByZWFkb25seSBhcHBsaWNhdGlvbk5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIGRlc2NyaXB0aW9uIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZSBmb3Igcm9ib3RzIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdFJvYm90cz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElmIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcm91dGUgYW5kIG11c3QgcmV0dXJuIGEgc3RyaW5nIHRoYXQgd2lsbFxuICAgICAqIGJlIGluc2VydGVkIGJldHdlZW4gdGhlIHBhZ2UgdGl0bGUgYW5kIHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgICAqXG4gICAgICogSXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlIHRpdGxlIHdpdGggaW5mbyB0aGF0IGFyZSBvZnRlbiwgYnV0IG5vdCBuZWNlc3NhcmlseSBhbHdheXMsXG4gICAgICogYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5IHVzZWQgZm9yIHRoZSBzaXRlL3N0YXRlIGluIE9LcGlsb3QuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXh0cmFQYXJ0PzogKHJvdXRlRGF0YTogRGF0YSkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSB0YWdzXG4gICAgICogPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgaHJlZmxhbmc9XCJlblwiIGhyZWY9XCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9lbi9wYWdlXCI+XG4gICAgICovXG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VzPzogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQ29uZmlnID0gTmF0dXJhbFNlb0NvbmZpZ1BsYWluIHwgT2JzZXJ2YWJsZTxOYXR1cmFsU2VvQ29uZmlnUGxhaW4+O1xuZXhwb3J0IGNvbnN0IE5BVFVSQUxfU0VPX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU2VvQ29uZmlnPignQ29uZmlndXJhdGlvbiBmb3IgU0VPIHNlcnZpY2UnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVGFncyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC88XFwvP1tePl0qPi9nLCAnJyk7XG59XG5cbnR5cGUgTW9kZWwgPSB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBmdWxsTmFtZT86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5cbnR5cGUgUmVzb2x2ZWREYXRhID0ge1xuICAgIG1vZGVsPzogTW9kZWwgfCBPYnNlcnZhYmxlPE1vZGVsPjtcbn07XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIGlzIHJlc3BvbnNpYmxlIHRvIGtlZXAgdXAgdG8gZGF0ZSB0aGUgcGFnZSB0aXRsZSBhbmQgcGFnZSBkZXNjcmlwdGlvbiBhY2NvcmRpbmdcbiAqIHRvIHdoYXQgaXMgY29uZmlndXJlZCBpbiByb3V0aW5nIG9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEl0ICoqbXVzdCoqIGJlIGluamVjdGVkIGluIHRoZSByb290IG1vZHVsZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSBlZmZlY3RzIGluIGFsbCBtb2R1bGVzLiBBbmQgaXRcbiAqIG11c3QgYmUgcHJvdmlkZWQgYSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoZSBmdWxsIHRpdGxlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAgICAgZGlhbG9nIHRpdGxlIC0gcGFnZSB0aXRsZSAtIGV4dHJhIHBhcnQgLSBhcHAgbmFtZVxuICpcbiAqIGBkaWFsb2cgdGl0bGVgIG9ubHkgZXhpc3RzIGlmIGEgYE5hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50YCBpcyBjdXJyZW50bHkgb3BlbiwgYW5kIHRoYXQgc29tZSBTRU8gaXNcbiAqIGNvbmZpZ3VyZWQgZm9yIGl0IGluIHRoZSByb3V0aW5nLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsU2VvU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZSA9IGluamVjdChUaXRsZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhVGFnU2VydmljZSA9IGluamVjdChNZXRhKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIGxvY2FsZSA9IGluamVjdChMT0NBTEVfSUQpO1xuXG4gICAgcHJpdmF0ZSByb3V0ZURhdGE/OiBEYXRhO1xuICAgIHByaXZhdGUgY29uZmlnOiBOYXR1cmFsU2VvQ29uZmlnUGxhaW4gPSB7XG4gICAgICAgIGFwcGxpY2F0aW9uTmFtZTogJycsXG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgY29uZmlnVG9rZW4gPSBpbmplY3QoTkFUVVJBTF9TRU9fQ09ORklHKTtcblxuICAgICAgICBjb21iaW5lTGF0ZXN0KHtcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnVG9rZW4gaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gY29uZmlnVG9rZW4ucGlwZShzdGFydFdpdGgodGhpcy5jb25maWcpKSA6IG9mKGNvbmZpZ1Rva2VuKSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25FbmQ6IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoe2NvbmZpZ30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290LnNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlRGF0YSA9IHRoaXMuZ2V0Um91dGVEYXRhKHJvb3QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbzogTmF0dXJhbFNlbyA9IHRoaXMucm91dGVEYXRhLnNlbyA/PyB7dGl0bGU6ICcnfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUm91dGVEYXRhID0gdGhpcy5nZXREaWFsb2dSb3V0ZURhdGEocm9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1NlbzogTmF0dXJhbFNlbyA9IGRpYWxvZ1JvdXRlRGF0YT8uc2VvO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljID0gdGhpcy50b0Jhc2ljKHNlbywgdGhpcy5yb3V0ZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2dCYXNpYyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dSb3V0ZURhdGEgJiYgZGlhbG9nU2VvID8gdGhpcy50b0Jhc2ljKGRpYWxvZ1NlbywgZGlhbG9nUm91dGVEYXRhKSA6IG9mKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtiYXNpYywgZGlhbG9nQmFzaWN9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHtiYXNpYywgZGlhbG9nQmFzaWN9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxvZ0Jhc2ljKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2ljID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGlhbG9nQmFzaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5qb2luKFtkaWFsb2dCYXNpYy50aXRsZSwgYmFzaWMudGl0bGVdKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShiYXNpYyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIFNFTyB3aXRoIGdpdmVuIGluZm8uIFRoZSBleHRyYSBwYXJ0IGFuZCBhcHAgbmFtZSB3aWxsIGJlIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZC4gQW5kIGluc3RlYWQsIHRoZSBTRU8gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHJvdXRpbmcsXG4gICAgICogcG9zc2libHkgd2l0aCB0aGUgY2FsbGJhY2sgdmFyaWFudCBmb3Igc29tZSBkeW5hbWlzbS5cbiAgICAgKlxuICAgICAqIEJ1dCBpbiByYXJlIGNhc2VzLCBvbmx5IHRoZSBDb21wb25lbnQgaXMgYWJsZSB0byBidWlsZCBhIHByb3BlciBwYWdlIHRpdGxlLCBhZnRlciBpdCBnYXRoZXJlZCBldmVyeXRoaW5nIGl0XG4gICAgICogbmVlZGVkLiBGb3IgdGhvc2UgY2FzZXMsIHRoZSBDb21wb25lbnQgY2FuIGluamVjdCB0aGlzIHNlcnZpY2UgYW5kIHVwZGF0ZSB0aGUgU0VPIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUoc2VvOiBOYXR1cmFsU2VvQmFzaWMpOiB2b2lkIHtcbiAgICAgICAgLy8gVGl0bGVcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgICBzZW8udGl0bGUsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRyYVBhcnQgJiYgdGhpcy5yb3V0ZURhdGEgPyB0aGlzLmNvbmZpZy5leHRyYVBhcnQodGhpcy5yb3V0ZURhdGEpIDogJycsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbk5hbWUsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmpvaW4ocGFydHMpO1xuICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aXRsZSk7XG5cbiAgICAgICAgLy8gRGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZW8/LmRlc2NyaXB0aW9uID8/IHRoaXMuY29uZmlnLmRlZmF1bHREZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy51cGRhdGVUYWcoJ2Rlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24pO1xuXG4gICAgICAgIC8vIFJvYm90c1xuICAgICAgICBjb25zdCByb2JvdHMgPSBzZW8/LnJvYm90cyA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0Um9ib3RzO1xuICAgICAgICB0aGlzLnVwZGF0ZVRhZygncm9ib3RzJywgcm9ib3RzKTtcblxuICAgICAgICAvLyBDYW5vbmljYWxcbiAgICAgICAgLy8gQWRkIGxhbmd1YWdlIGluIHVybCAoYWZ0ZXIgZG9tYWluKSBpZiBzb21lIGxhbmd1YWdlcyBhcmUgcHJvdmlkZWQgb25seVxuICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29uZmlnLmxhbmd1YWdlcz8ubGVuZ3RoICYmIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuc3BsaXQoJy0nKVswXSA6ICcnO1xuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0VXJsUGFydHMoc2VvLmNhbm9uaWNhbFF1ZXJ5UGFyYW1zV2hpdGVsaXN0ID8/IFtdKTtcbiAgICAgICAgdGhpcy51cGRhdGVMaW5rVGFnKHtyZWw6ICdjYW5vbmljYWwnLCBocmVmOiB0aGlzLmdldFVybCh1cmxQYXJ0cywgbGFuZ3VhZ2UpfSk7XG4gICAgICAgIHRoaXMudXBkYXRlQWx0ZXJuYXRlcyh1cmxQYXJ0cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBbHRlcm5hdGVzKHVybFBhcnRzOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZy5sYW5ndWFnZXM/LmZvckVhY2gobGFuZ3VhZ2UgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMaW5rVGFnKHtyZWw6ICdhbHRlcm5hdGUnLCBocmVmOiB0aGlzLmdldFVybCh1cmxQYXJ0cywgbGFuZ3VhZ2UpLCBocmVmbGFuZzogbGFuZ3VhZ2V9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmxQYXJ0cyh3aGl0ZUxpc3RlZFBhcmFtczogc3RyaW5nW10pOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSB7XG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly8nICsgdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5yb3V0ZXIudXJsKTtcblxuICAgICAgICAvLyBuZWVkIGJldHRlciBsaWtlIHNvbWV0aGluZyByZWN1cnNpdmUgP1xuICAgICAgICBpZiAodXJsVHJlZS5yb290Lmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdXJsVHJlZS5yb290LmNoaWxkcmVuLnByaW1hcnk/LnNlZ21lbnRzO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnRzICYmIHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gJy8nICsgc2VnbWVudHMubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKS5qb2luKCcvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWVyeSBQYXJhbXNcbiAgICAgICAgbGV0IHBhcmFtcyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHdoaXRlTGlzdGVkUGFyYW0gb2Ygd2hpdGVMaXN0ZWRQYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh3aGl0ZUxpc3RlZFBhcmFtIGluIHVybFRyZWUucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQod2hpdGVMaXN0ZWRQYXJhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodXJsVHJlZS5xdWVyeVBhcmFtc1t3aGl0ZUxpc3RlZFBhcmFtXSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zICs9IGAke2tleX09JHt2YWx1ZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9ICc/JyArIHBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7dXJsLCBwYXJhbXN9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBsYW5ndWFnZSBiZXR3ZWVuIGRvbWFpbiBhbmQgdXJpIGh0dHBzOi8vZXhhbXBsZS5jb20vZnIvZm9sZGVyL3BhZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFVybCh1cmxQYXJ0czoge3VybDogc3RyaW5nOyBwYXJhbXM6IHN0cmluZ30sIGxhbmd1YWdlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IHVybFBhcnRzLnVybDtcblxuICAgICAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHVybCA9IHRoaXMuYWRkTGFuZ3VhZ2VTZWdtZW50KHVybCwgbGFuZ3VhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybFBhcnRzLnBhcmFtcykge1xuICAgICAgICAgICAgdXJsICs9IHVybFBhcnRzLnBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRMYW5ndWFnZVNlZ21lbnQodXJsOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSB1cmxPYmoucGF0aG5hbWUgPT09ICcvJyA/IGAvJHtsYW5ndWFnZX1gIDogYC8ke2xhbmd1YWdlfSR7dXJsT2JqLnBhdGhuYW1lfWA7XG4gICAgICAgIHJldHVybiB1cmxPYmoub3JpZ2luICsgbmV3UGF0aCArIHVybE9iai5zZWFyY2ggKyB1cmxPYmouaGFzaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGpvaW4ocGFydHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmZpbHRlcihzID0+ICEhcykuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUYWcobmFtZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdHJpcFRhZ3ModmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT1cIiR7bmFtZX1cImApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVMaW5rVGFnKGRlZmluaXRpb246IE5hdHVyYWxMaW5rRGVmaW5pdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcjxIVE1MTGlua0VsZW1lbnQ+KHRoaXMucGFyc2VTZWxlY3RvcihkZWZpbml0aW9uKSkgPz9cbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7XG5cbiAgICAgICAgaWYgKGxpbmtFbGVtZW50KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZpbml0aW9uKS5mb3JFYWNoKChhdHRyaWJ1dGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRlZmluaXRpb25bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgc2VsZWN0b3IgdG8gdXNlIGluIHF1ZXJ5U2VsZWN0b3IgdG8gZ2V0IHRoZSBnaXZlbiBsaW5rXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVNlbGVjdG9yKGRlZmluaXRpb246IE5hdHVyYWxMaW5rRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGxldCBhdHRyaWJ1dGVzID0gJ2xpbmsnO1xuICAgICAgICBPYmplY3Qua2V5cyhkZWZpbml0aW9uKS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgICAgICAgaWYgKGF0dHIgIT09ICdocmVmJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgKz0gYFske2F0dHJ9PVwiJHtkZWZpbml0aW9uW2F0dHJdfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgZnJvbSB0aGUgbW9zdCBkZWVwL3NwZWNpZmljIGFjdGl2YXRlZCByb3V0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Um91dGVEYXRhKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGF0YSB7XG4gICAgICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSb3V0ZURhdGEocm91dGUuZmlyc3RDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcm91dGUuZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgZnJvbSB0aGUgYE5hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50YCBpZiBvbmUgaXMgb3BlblxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGlhbG9nUm91dGVEYXRhKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGF0YSB8IG51bGwge1xuICAgICAgICBpZiAocm91dGUuY29tcG9uZW50ID09PSBOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudCAmJiByb3V0ZS5vdXRsZXQgIT09IFBSSU1BUllfT1VUTEVUKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91dGUuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERpYWxvZ1JvdXRlRGF0YShjaGlsZCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b0Jhc2ljKHNlbzogTmF0dXJhbFNlbywgcm91dGVEYXRhOiBSZXNvbHZlZERhdGEpOiBPYnNlcnZhYmxlPE5hdHVyYWxTZW9CYXNpYz4ge1xuICAgICAgICBpZiAodHlwZW9mIHNlbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VvKHJvdXRlRGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHJlc3VsdCA6IG9mKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3Jlc29sdmUnIGluIHNlbykge1xuICAgICAgICAgICAgaWYgKCEoJ21vZGVsJyBpbiByb3V0ZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCByZXNvbHZlZCBkYXRhIGBtb2RlbGAgZm9yIFNFTyBzZXJ2aWNlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gcm91dGVEYXRhLm1vZGVsO1xuXG4gICAgICAgICAgICByZXR1cm4gKG1vZGVsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IG1vZGVsIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdmFsdWU/LmZ1bGxOYW1lID8/IHZhbHVlPy5uYW1lID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlPy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvYm90czogc2VvLnJvYm90cyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Yoc2VvKTtcbiAgICB9XG59XG4iXX0=