@decaf-ts/for-angular 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/for-angular/cli/cli-module.d.ts +22 -0
  2. package/dist/for-angular/cli/cli-module.d.ts.map +1 -0
  3. package/dist/for-angular/cli/cli-module.js +131 -0
  4. package/dist/for-angular/cli/cli-module.js.map +1 -0
  5. package/dist/{components → lib/components}/component-renderer/component-renderer.component.d.ts +1 -0
  6. package/dist/lib/components/component-renderer/component-renderer.component.d.ts.map +1 -0
  7. package/dist/{components → lib/components}/crud-field/crud-field.component.d.ts +1 -0
  8. package/dist/lib/components/crud-field/crud-field.component.d.ts.map +1 -0
  9. package/dist/{components → lib/components}/crud-form/constants.d.ts +1 -0
  10. package/dist/lib/components/crud-form/constants.d.ts.map +1 -0
  11. package/dist/{components → lib/components}/crud-form/crud-form.component.d.ts +1 -0
  12. package/dist/lib/components/crud-form/crud-form.component.d.ts.map +1 -0
  13. package/dist/{components → lib/components}/crud-form/types.d.ts +1 -0
  14. package/dist/lib/components/crud-form/types.d.ts.map +1 -0
  15. package/dist/{components → lib/components}/empty-state/empty-state.component.d.ts +1 -0
  16. package/dist/lib/components/empty-state/empty-state.component.d.ts.map +1 -0
  17. package/dist/{components → lib/components}/fieldset/fieldset.component.d.ts +1 -0
  18. package/dist/lib/components/fieldset/fieldset.component.d.ts.map +1 -0
  19. package/dist/{components → lib/components}/filter/filter.component.d.ts +1 -0
  20. package/dist/lib/components/filter/filter.component.d.ts.map +1 -0
  21. package/dist/{components → lib/components}/for-angular-components.module.d.ts +1 -0
  22. package/dist/lib/components/for-angular-components.module.d.ts.map +1 -0
  23. package/dist/{components → lib/components}/index.d.ts +1 -0
  24. package/dist/lib/components/index.d.ts.map +1 -0
  25. package/dist/{components → lib/components}/layout/layout.component.d.ts +1 -0
  26. package/dist/lib/components/layout/layout.component.d.ts.map +1 -0
  27. package/dist/{components → lib/components}/list/constants.d.ts +1 -0
  28. package/dist/lib/components/list/constants.d.ts.map +1 -0
  29. package/dist/{components → lib/components}/list/list.component.d.ts +1 -0
  30. package/dist/lib/components/list/list.component.d.ts.map +1 -0
  31. package/dist/{components → lib/components}/list-item/list-item.component.d.ts +1 -0
  32. package/dist/lib/components/list-item/list-item.component.d.ts.map +1 -0
  33. package/dist/{components → lib/components}/model-renderer/model-renderer.component.d.ts +1 -0
  34. package/dist/lib/components/model-renderer/model-renderer.component.d.ts.map +1 -0
  35. package/dist/{components → lib/components}/pagination/constants.d.ts +1 -0
  36. package/dist/lib/components/pagination/constants.d.ts.map +1 -0
  37. package/dist/{components → lib/components}/pagination/pagination.component.d.ts +1 -0
  38. package/dist/lib/components/pagination/pagination.component.d.ts.map +1 -0
  39. package/dist/{components → lib/components}/searchbar/searchbar.component.d.ts +1 -0
  40. package/dist/lib/components/searchbar/searchbar.component.d.ts.map +1 -0
  41. package/dist/lib/decaf-ts-for-angular.d.ts.map +1 -0
  42. package/dist/{directives → lib/directives}/collapsable.directive.d.ts +1 -0
  43. package/dist/lib/directives/collapsable.directive.d.ts.map +1 -0
  44. package/dist/{directives → lib/directives}/index.d.ts +1 -0
  45. package/dist/lib/directives/index.d.ts.map +1 -0
  46. package/dist/{engine → lib/engine}/DynamicModule.d.ts +1 -0
  47. package/dist/lib/engine/DynamicModule.d.ts.map +1 -0
  48. package/dist/{engine → lib/engine}/NgxBaseComponent.d.ts +1 -0
  49. package/dist/lib/engine/NgxBaseComponent.d.ts.map +1 -0
  50. package/dist/{engine → lib/engine}/NgxCrudFormField.d.ts +1 -0
  51. package/dist/lib/engine/NgxCrudFormField.d.ts.map +1 -0
  52. package/dist/{engine → lib/engine}/NgxFormService.d.ts +1 -0
  53. package/dist/lib/engine/NgxFormService.d.ts.map +1 -0
  54. package/dist/{engine → lib/engine}/NgxRenderingEngine.d.ts +1 -0
  55. package/dist/lib/engine/NgxRenderingEngine.d.ts.map +1 -0
  56. package/dist/{engine → lib/engine}/NgxRenderingEngine2.d.ts +1 -0
  57. package/dist/lib/engine/NgxRenderingEngine2.d.ts.map +1 -0
  58. package/dist/{engine → lib/engine}/ValidatorFactory.d.ts +1 -0
  59. package/dist/lib/engine/ValidatorFactory.d.ts.map +1 -0
  60. package/dist/{engine → lib/engine}/constants.d.ts +1 -0
  61. package/dist/lib/engine/constants.d.ts.map +1 -0
  62. package/dist/{engine → lib/engine}/decorators.d.ts +1 -0
  63. package/dist/lib/engine/decorators.d.ts.map +1 -0
  64. package/dist/{engine → lib/engine}/index.d.ts +1 -0
  65. package/dist/lib/engine/index.d.ts.map +1 -0
  66. package/dist/{engine → lib/engine}/types.d.ts +1 -0
  67. package/dist/lib/engine/types.d.ts.map +1 -0
  68. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +359 -0
  69. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +456 -0
  70. package/dist/lib/esm2022/components/crud-form/constants.mjs +14 -0
  71. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +272 -0
  72. package/dist/lib/esm2022/components/crud-form/types.mjs +2 -0
  73. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +410 -0
  74. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +250 -0
  75. package/dist/lib/esm2022/components/filter/filter.component.mjs +906 -0
  76. package/dist/lib/esm2022/components/for-angular-components.module.mjs +72 -0
  77. package/dist/lib/esm2022/components/index.mjs +20 -0
  78. package/dist/lib/esm2022/components/layout/layout.component.mjs +245 -0
  79. package/dist/lib/esm2022/components/list/constants.mjs +6 -0
  80. package/dist/lib/esm2022/components/list/list.component.mjs +1405 -0
  81. package/dist/lib/esm2022/components/list-item/list-item.component.mjs +612 -0
  82. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +182 -0
  83. package/dist/lib/esm2022/components/pagination/constants.mjs +2 -0
  84. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +364 -0
  85. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +503 -0
  86. package/dist/lib/esm2022/decaf-ts-for-angular.mjs +5 -0
  87. package/dist/lib/esm2022/directives/collapsable.directive.mjs +28 -0
  88. package/dist/lib/esm2022/directives/index.mjs +2 -0
  89. package/dist/lib/esm2022/engine/DynamicModule.mjs +18 -0
  90. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +546 -0
  91. package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +125 -0
  92. package/dist/lib/esm2022/engine/NgxFormService.mjs +315 -0
  93. package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +192 -0
  94. package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +332 -0
  95. package/dist/lib/esm2022/engine/ValidatorFactory.mjs +102 -0
  96. package/dist/lib/esm2022/engine/constants.mjs +160 -0
  97. package/dist/lib/esm2022/engine/decorators.mjs +38 -0
  98. package/dist/lib/esm2022/engine/index.mjs +17 -0
  99. package/dist/lib/esm2022/engine/types.mjs +4 -0
  100. package/dist/lib/esm2022/for-angular.module.mjs +119 -0
  101. package/dist/lib/esm2022/helpers/index.mjs +13 -0
  102. package/dist/lib/esm2022/helpers/utils.mjs +415 -0
  103. package/dist/lib/esm2022/interfaces.mjs +2 -0
  104. package/dist/lib/esm2022/public-apis.mjs +14 -0
  105. package/dist/{fesm2022 → lib/fesm2022}/decaf-ts-for-angular.mjs +1805 -621
  106. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  107. package/dist/{for-angular.module.d.ts → lib/for-angular.module.d.ts} +1 -0
  108. package/dist/lib/for-angular.module.d.ts.map +1 -0
  109. package/dist/{helpers → lib/helpers}/index.d.ts +1 -0
  110. package/dist/lib/helpers/index.d.ts.map +1 -0
  111. package/dist/{helpers → lib/helpers}/utils.d.ts +1 -0
  112. package/dist/lib/helpers/utils.d.ts.map +1 -0
  113. package/dist/{index.d.ts → lib/index.d.ts} +1 -0
  114. package/dist/{interfaces.d.ts → lib/interfaces.d.ts} +1 -0
  115. package/dist/lib/interfaces.d.ts.map +1 -0
  116. package/dist/{public-apis.d.ts → lib/public-apis.d.ts} +1 -0
  117. package/dist/lib/public-apis.d.ts.map +1 -0
  118. package/package.json +3 -2
  119. package/dist/esm2022/components/component-renderer/component-renderer.component.mjs +0 -313
  120. package/dist/esm2022/components/crud-field/crud-field.component.mjs +0 -301
  121. package/dist/esm2022/components/crud-form/constants.mjs +0 -14
  122. package/dist/esm2022/components/crud-form/crud-form.component.mjs +0 -139
  123. package/dist/esm2022/components/crud-form/types.mjs +0 -2
  124. package/dist/esm2022/components/empty-state/empty-state.component.mjs +0 -348
  125. package/dist/esm2022/components/fieldset/fieldset.component.mjs +0 -225
  126. package/dist/esm2022/components/filter/filter.component.mjs +0 -689
  127. package/dist/esm2022/components/for-angular-components.module.mjs +0 -71
  128. package/dist/esm2022/components/index.mjs +0 -20
  129. package/dist/esm2022/components/layout/layout.component.mjs +0 -176
  130. package/dist/esm2022/components/list/constants.mjs +0 -6
  131. package/dist/esm2022/components/list/list.component.mjs +0 -1236
  132. package/dist/esm2022/components/list-item/list-item.component.mjs +0 -408
  133. package/dist/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
  134. package/dist/esm2022/components/pagination/constants.mjs +0 -2
  135. package/dist/esm2022/components/pagination/pagination.component.mjs +0 -323
  136. package/dist/esm2022/components/searchbar/searchbar.component.mjs +0 -493
  137. package/dist/esm2022/decaf-ts-for-angular.mjs +0 -5
  138. package/dist/esm2022/directives/collapsable.directive.mjs +0 -28
  139. package/dist/esm2022/directives/index.mjs +0 -2
  140. package/dist/esm2022/engine/DynamicModule.mjs +0 -18
  141. package/dist/esm2022/engine/NgxBaseComponent.mjs +0 -539
  142. package/dist/esm2022/engine/NgxCrudFormField.mjs +0 -125
  143. package/dist/esm2022/engine/NgxFormService.mjs +0 -315
  144. package/dist/esm2022/engine/NgxRenderingEngine.mjs +0 -192
  145. package/dist/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
  146. package/dist/esm2022/engine/ValidatorFactory.mjs +0 -102
  147. package/dist/esm2022/engine/constants.mjs +0 -160
  148. package/dist/esm2022/engine/decorators.mjs +0 -38
  149. package/dist/esm2022/engine/index.mjs +0 -17
  150. package/dist/esm2022/engine/types.mjs +0 -4
  151. package/dist/esm2022/for-angular.module.mjs +0 -118
  152. package/dist/esm2022/helpers/index.mjs +0 -13
  153. package/dist/esm2022/helpers/utils.mjs +0 -415
  154. package/dist/esm2022/interfaces.mjs +0 -2
  155. package/dist/esm2022/public-apis.mjs +0 -14
  156. package/dist/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
  157. /package/dist/{README.md → lib/README.md} +0 -0
  158. /package/dist/{assets → lib/assets}/i18n/en.json +0 -0
  159. /package/dist/{assets → lib/assets}/images/angular-logo.svg +0 -0
  160. /package/dist/{assets → lib/assets}/images/decaf-logo-black.svg +0 -0
  161. /package/dist/{assets → lib/assets}/images/decaf-logo-lw.svg +0 -0
  162. /package/dist/{assets → lib/assets}/images/decaf-logo-white.svg +0 -0
  163. /package/dist/{assets → lib/assets}/images/decaf-logo.svg +0 -0
@@ -0,0 +1,410 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { Component, inject, Input } from '@angular/core';
3
+ import { IonCard, IonCardContent, IonIcon, IonTitle, NavController } from '@ionic/angular/standalone';
4
+ import * as allIcons from 'ionicons/icons';
5
+ import { addIcons } from 'ionicons';
6
+ import { ForAngularModule } from '../../for-angular.module';
7
+ import { Dynamic } from '../../engine';
8
+ import { stringToBoolean } from '../../helpers';
9
+ import { NgxBaseComponent } from '../../engine/NgxBaseComponent';
10
+ import { DomSanitizer } from '@angular/platform-browser';
11
+ import { TranslateService } from '@ngx-translate/core';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@ionic/angular/standalone";
14
+ import * as i2 from "@angular/common";
15
+ function EmptyStateComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "div", 1);
17
+ i0.ɵɵelement(1, "ion-icon", 3);
18
+ i0.ɵɵelementEnd();
19
+ } }
20
+ function EmptyStateComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "h5", 4);
22
+ } if (rf & 2) {
23
+ const ctx_r0 = i0.ɵɵnextContext();
24
+ i0.ɵɵclassMap(ctx_r0.titleColor);
25
+ i0.ɵɵproperty("innerHTML", ctx_r0.title, i0.ɵɵsanitizeHtml);
26
+ } }
27
+ function EmptyStateComponent_Conditional_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
28
+ i0.ɵɵelement(0, "p", 4);
29
+ } if (rf & 2) {
30
+ const ctx_r0 = i0.ɵɵnextContext(2);
31
+ i0.ɵɵclassMap(ctx_r0.subtitleColor);
32
+ i0.ɵɵproperty("innerHTML", ctx_r0.subtitle, i0.ɵɵsanitizeHtml);
33
+ } }
34
+ function EmptyStateComponent_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelement(0, "p", 4);
36
+ } if (rf & 2) {
37
+ const ctx_r0 = i0.ɵɵnextContext(2);
38
+ i0.ɵɵclassMap(ctx_r0.subtitleColor);
39
+ i0.ɵɵproperty("innerHTML", ctx_r0.searchSubtitle, i0.ɵɵsanitizeHtml);
40
+ } }
41
+ function EmptyStateComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵtemplate(0, EmptyStateComponent_Conditional_4_Conditional_0_Template, 1, 3, "p", 2)(1, EmptyStateComponent_Conditional_4_Conditional_1_Template, 1, 3, "p", 2);
43
+ } if (rf & 2) {
44
+ const ctx_r0 = i0.ɵɵnextContext();
45
+ i0.ɵɵconditional(!ctx_r0.searchValue ? 0 : 1);
46
+ } }
47
+ function EmptyStateComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
48
+ const _r2 = i0.ɵɵgetCurrentView();
49
+ i0.ɵɵelementStart(0, "div")(1, "ion-button", 5);
50
+ i0.ɵɵlistener("click", function EmptyStateComponent_Conditional_5_Template_ion_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.handleClick()); });
51
+ i0.ɵɵtext(2);
52
+ i0.ɵɵelementEnd()();
53
+ } if (rf & 2) {
54
+ const ctx_r0 = i0.ɵɵnextContext();
55
+ i0.ɵɵadvance();
56
+ i0.ɵɵproperty("size", ctx_r0.buttonSize)("fill", ctx_r0.buttonFill)("color", ctx_r0.buttonColor);
57
+ i0.ɵɵadvance();
58
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.buttonText, " ");
59
+ } }
60
+ /**
61
+ * @description Component for displaying empty state messages with optional actions.
62
+ * @summary This component provides a standardized way to display empty state messages
63
+ * when no data is available or when a user needs to take an action to populate content.
64
+ * It includes customizable title, subtitle, icon, and action button elements that can be
65
+ * styled and configured through input properties. The component supports localization
66
+ * and can trigger navigation or custom actions when the button is clicked.
67
+ *
68
+ * @mermaid
69
+ * classDiagram
70
+ * class EmptyStateComponent {
71
+ * +string title
72
+ * +string titleColor
73
+ * +string subtitle
74
+ * +string subtitleColor
75
+ * +StringOrBoolean showIcon
76
+ * +string icon
77
+ * +string iconSize
78
+ * +PredefinedColors iconColor
79
+ * +string|Function buttonLink
80
+ * +string buttonText
81
+ * +string buttonFill
82
+ * +Color buttonColor
83
+ * +string buttonSize
84
+ * +string searchValue
85
+ * -NavController navController
86
+ * +ngOnInit()
87
+ * +handleClick()
88
+ * }
89
+ * EmptyStateComponent --|> NgxBaseComponent
90
+ * EmptyStateComponent --|> OnInit
91
+ *
92
+ * @extends {NgxBaseComponent}
93
+ * @implements {OnInit}
94
+ */
95
+ let EmptyStateComponent = class EmptyStateComponent extends NgxBaseComponent {
96
+ /**
97
+ * @description Creates an instance of EmptyStateComponent.
98
+ * @summary Initializes a new EmptyStateComponent by calling the parent class constructor
99
+ * with the component name for logging and identification purposes. This component provides
100
+ * a standardized way to display empty state messages with optional icons and action buttons.
101
+ *
102
+ * @memberOf EmptyStateComponent
103
+ */
104
+ constructor() {
105
+ super("EmptyStateComponent");
106
+ /**
107
+ * @description The main title displayed in the empty state.
108
+ * @summary Specifies the primary message to show in the empty state component.
109
+ * This text is typically used to inform the user about why they're seeing an empty view.
110
+ * If translatable is true, this will be processed through the localization system.
111
+ *
112
+ * @type {string}
113
+ * @default "title"
114
+ * @memberOf EmptyStateComponent
115
+ */
116
+ this.title = "title";
117
+ /**
118
+ * @description The color of the title text.
119
+ * @summary Specifies the color for the title text using the application's color system.
120
+ * The value should correspond to a color variable defined in the application's theme.
121
+ * The component will automatically prefix this with "color-" to create the CSS class.
122
+ *
123
+ * @type {string}
124
+ * @default 'gray-6'
125
+ * @memberOf EmptyStateComponent
126
+ */
127
+ this.titleColor = 'gray-6';
128
+ /**
129
+ * @description The secondary message displayed in the empty state.
130
+ * @summary Provides additional context or instructions below the main title.
131
+ * This text is typically used to guide the user on what actions they can take.
132
+ * If translatable is true, this will be processed through the localization system.
133
+ *
134
+ * @type {string | undefined}
135
+ * @memberOf EmptyStateComponent
136
+ */
137
+ this.subtitle = "";
138
+ /**
139
+ * @description The color of the subtitle text.
140
+ * @summary Specifies the color for the subtitle text using the application's color system.
141
+ * The value should correspond to a color variable defined in the application's theme.
142
+ * The component will automatically prefix this with "color-" to create the CSS class.
143
+ *
144
+ * @type {string}
145
+ * @default 'gray-4'
146
+ * @memberOf EmptyStateComponent
147
+ */
148
+ this.subtitleColor = 'gray-4';
149
+ /**
150
+ * @description Controls whether the icon is displayed.
151
+ * @summary Determines if the visual icon should be shown in the empty state.
152
+ * This can be provided as a boolean or a string that will be converted to a boolean.
153
+ * Icons help visually communicate the empty state context to users.
154
+ *
155
+ * @type {StringOrBoolean}
156
+ * @default true
157
+ * @memberOf EmptyStateComponent
158
+ */
159
+ this.showIcon = true;
160
+ /**
161
+ * @description The name of the icon to display.
162
+ * @summary Specifies which icon to show when showIcon is true.
163
+ * The component uses the icon system defined in the application,
164
+ * and this value should correspond to an available icon name.
165
+ *
166
+ * @type {string}
167
+ * @default "ti-info-square-rounded"
168
+ * @memberOf EmptyStateComponent
169
+ */
170
+ this.icon = "ti-info-square-rounded";
171
+ /**
172
+ * @description The size of the displayed icon.
173
+ * @summary Controls the size of the icon shown in the empty state.
174
+ * Can be either 'large' or 'small' to accommodate different layout needs.
175
+ *
176
+ * @type {'large' | 'small' | undefined}
177
+ * @default 'large'
178
+ * @memberOf EmptyStateComponent
179
+ */
180
+ this.iconSize = 'large';
181
+ /**
182
+ * @description The color of the displayed icon.
183
+ * @summary Specifies the color for the icon using Ionic's predefined color system.
184
+ * This allows the icon to match the application's color scheme.
185
+ *
186
+ * @type {PredefinedColors | undefined}
187
+ * @default 'medium'
188
+ * @memberOf EmptyStateComponent
189
+ */
190
+ this.iconColor = 'medium';
191
+ /**
192
+ * @description The fill style of the action button.
193
+ * @summary Controls the visual style of the button using Ionic's button fill options.
194
+ * 'solid' creates a button with a solid background, 'outline' creates a button with
195
+ * just a border, and 'clear' creates a button with no background or border.
196
+ *
197
+ * @type {'clear' | 'solid' | 'outline'}
198
+ * @default 'solid'
199
+ * @memberOf EmptyStateComponent
200
+ */
201
+ this.buttonFill = 'solid';
202
+ /**
203
+ * @description The color of the action button.
204
+ * @summary Specifies the color for the button using Ionic's color system.
205
+ * This allows the button to match the application's color scheme.
206
+ *
207
+ * @type {Color}
208
+ * @default 'primary'
209
+ * @memberOf EmptyStateComponent
210
+ */
211
+ this.buttonColor = 'primary';
212
+ /**
213
+ * @description The size of the action button.
214
+ * @summary Controls the size of the button shown in the empty state.
215
+ * Can be 'large', 'small', or 'default' to accommodate different layout needs.
216
+ *
217
+ * @type {'large' | 'small' | 'default'}
218
+ * @default 'default'
219
+ * @memberOf EmptyStateComponent
220
+ */
221
+ this.buttonSize = 'default';
222
+ /**
223
+ * @description Service for handling navigation operations.
224
+ * @summary Injected service that provides methods for navigating between routes.
225
+ * This service is used when the buttonLink is a string URL to navigate to that location.
226
+ *
227
+ * @private
228
+ * @type {NavController}
229
+ * @memberOf EmptyStateComponent
230
+ */
231
+ this.navController = inject(NavController);
232
+ this.sanitizer = inject(DomSanitizer);
233
+ this.translate = inject(TranslateService);
234
+ addIcons(allIcons);
235
+ }
236
+ /**
237
+ * @description Initializes the component after Angular first displays the data-bound properties.
238
+ * @summary Sets up the component by processing boolean inputs, applying localization to text
239
+ * elements if translation is enabled, and formatting CSS classes for title and subtitle colors.
240
+ * This method prepares the component for user interaction by ensuring all properties are
241
+ * properly initialized and localized.
242
+ *
243
+ * @mermaid
244
+ * sequenceDiagram
245
+ * participant A as Angular Lifecycle
246
+ * participant E as EmptyStateComponent
247
+ *
248
+ * A->>E: ngOnInit()
249
+ * E->>E: Process translatable flag
250
+ * E->>E: Process showIcon flag
251
+ * E->>E: Get locale settings
252
+ * alt translatable is true
253
+ * E->>E: Localize title
254
+ * E->>E: Localize subtitle
255
+ * E->>E: Localize buttonText
256
+ * end
257
+ * E->>E: Format title CSS class
258
+ * E->>E: Format subtitle CSS class
259
+ *
260
+ * @return {Promise<void>}
261
+ * @memberOf EmptyStateComponent
262
+ */
263
+ async ngOnInit() {
264
+ this.parseProps(this);
265
+ this.translatable = stringToBoolean(this.translatable);
266
+ this.showIcon = stringToBoolean(this.showIcon);
267
+ this.locale = this.getLocale(this.translatable);
268
+ // if(this.translatable) {
269
+ // this.title = generateLocaleFromString(this.locale, this.title);
270
+ // this.subtitle = generateLocaleFromString(this.locale, this.subtitle);
271
+ // this.buttonText = generateLocaleFromString(this.locale, this.buttonText);
272
+ // }
273
+ this.titleColor = `dcf-title color-${this.titleColor}`;
274
+ this.subtitleColor = `dcf-subtitle color-${this.titleColor}`;
275
+ if (this.searchValue && this.translatable)
276
+ this.searchSubtitle = await this.getSearchSubtitle(this.subtitle);
277
+ }
278
+ /**
279
+ * @description Handles click events on the action button.
280
+ * @summary This method is triggered when the user clicks the action button in the empty state
281
+ * component. It supports three navigation patterns: 1) no action when buttonLink is not provided,
282
+ * 2) custom function execution when buttonLink is a function, and 3) navigation to a specific URL
283
+ * when buttonLink is a string. This flexibility allows the empty state to trigger various actions
284
+ * based on the context in which it's used.
285
+ *
286
+ * @mermaid
287
+ * sequenceDiagram
288
+ * participant U as User
289
+ * participant E as EmptyStateComponent
290
+ * participant N as NavController
291
+ *
292
+ * U->>E: Click action button
293
+ * E->>E: handleClick()
294
+ * alt buttonLink is not provided
295
+ * E-->>U: Return false (no action)
296
+ * else buttonLink is a function
297
+ * E->>E: Execute buttonLink function
298
+ * E-->>U: Return function result
299
+ * else buttonLink is a URL string
300
+ * E->>N: navigateForward(buttonLink)
301
+ * N-->>E: Return navigation result
302
+ * E-->>U: Return navigation result
303
+ * end
304
+ *
305
+ * @return {boolean | void | Promise<boolean>}
306
+ * - false if no action is taken
307
+ * - The result of the buttonLink function if it's a function
308
+ * - A Promise resolving to the navigation result if buttonLink is a URL
309
+ * @memberOf EmptyStateComponent
310
+ */
311
+ handleClick() {
312
+ const fn = this.buttonLink;
313
+ if (!fn)
314
+ return false;
315
+ if (fn instanceof Function)
316
+ return fn();
317
+ return this.navController.navigateForward(fn);
318
+ }
319
+ /**
320
+ * @description Generates a localized and sanitized subtitle for search results.
321
+ * @summary This method takes a content string, typically the subtitle, and processes it
322
+ * through the translation service. It replaces a placeholder ('value0') with the actual
323
+ * search value, then sanitizes the result to safely use as HTML. This is particularly
324
+ * useful for displaying dynamic, localized messages in the empty state when a search
325
+ * yields no results.
326
+ *
327
+ * @param {string} content - The content string to be translated and processed
328
+ * @return {Promise<SafeHtml>} A promise that resolves to a sanitized HTML string
329
+ *
330
+ * @mermaid
331
+ * sequenceDiagram
332
+ * participant E as EmptyStateComponent
333
+ * participant T as TranslateService
334
+ * participant S as DomSanitizer
335
+ *
336
+ * E->>T: instant(content, {'value0': searchValue})
337
+ * T-->>E: Return translated string
338
+ * E->>S: bypassSecurityTrustHtml(translatedString)
339
+ * S-->>E: Return sanitized SafeHtml
340
+ *
341
+ * @memberOf EmptyStateComponent
342
+ */
343
+ async getSearchSubtitle(content) {
344
+ const result = await this.translate.instant(content, { 'value0': this.searchValue });
345
+ return this.sanitizer.bypassSecurityTrustHtml(result);
346
+ }
347
+ static { this.ɵfac = function EmptyStateComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || EmptyStateComponent)(); }; }
348
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EmptyStateComponent, selectors: [["ngx-decaf-empty-state"]], inputs: { title: "title", titleColor: "titleColor", subtitle: "subtitle", subtitleColor: "subtitleColor", showIcon: "showIcon", icon: "icon", iconSize: "iconSize", iconColor: "iconColor", buttonLink: "buttonLink", buttonText: "buttonText", buttonFill: "buttonFill", buttonColor: "buttonColor", buttonSize: "buttonSize", searchValue: "searchValue" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 6, vars: 5, consts: [["id", "dcf-card-empty-state", 3, "ngClass"], [1, "dcf-icon-container"], [3, "class", "innerHTML"], ["name", "alert-circle-outline", "size", "large", "color", "danger"], [3, "innerHTML"], [3, "click", "size", "fill", "color"]], template: function EmptyStateComponent_Template(rf, ctx) { if (rf & 1) {
349
+ i0.ɵɵelementStart(0, "ion-card", 0)(1, "ion-card-content");
350
+ i0.ɵɵtemplate(2, EmptyStateComponent_Conditional_2_Template, 2, 0, "div", 1)(3, EmptyStateComponent_Conditional_3_Template, 1, 3, "h5", 2)(4, EmptyStateComponent_Conditional_4_Template, 2, 1)(5, EmptyStateComponent_Conditional_5_Template, 3, 4, "div");
351
+ i0.ɵɵelementEnd()();
352
+ } if (rf & 2) {
353
+ i0.ɵɵproperty("ngClass", ctx.className);
354
+ i0.ɵɵadvance(2);
355
+ i0.ɵɵconditional(ctx.icon && ctx.showIcon ? 2 : -1);
356
+ i0.ɵɵadvance();
357
+ i0.ɵɵconditional(ctx.title ? 3 : -1);
358
+ i0.ɵɵadvance();
359
+ i0.ɵɵconditional(ctx.subtitle ? 4 : -1);
360
+ i0.ɵɵadvance();
361
+ i0.ɵɵconditional(ctx.buttonLink && ctx.buttonText ? 5 : -1);
362
+ } }, dependencies: [ForAngularModule, i1.IonButton, i2.NgClass, IonCard,
363
+ IonCardContent,
364
+ IonIcon], styles: ["ion-card[_ngcontent-%COMP%]{text-align:center}ion-card[_ngcontent-%COMP%] ion-button[_ngcontent-%COMP%]{margin-top:.75rem}ion-card[_ngcontent-%COMP%] ion-icon[_ngcontent-%COMP%]{font-size:2.5rem}ion-card[_ngcontent-%COMP%] .dcf-icon-container[_ngcontent-%COMP%]{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card[_ngcontent-%COMP%] .dcf-ititle[_ngcontent-%COMP%]{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card[_ngcontent-%COMP%] .dcf-isubtitle[_ngcontent-%COMP%]{font-weight:500!important}"] }); }
365
+ };
366
+ EmptyStateComponent = __decorate([
367
+ Dynamic(),
368
+ __metadata("design:paramtypes", [])
369
+ ], EmptyStateComponent);
370
+ export { EmptyStateComponent };
371
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EmptyStateComponent, [{
372
+ type: Component,
373
+ args: [{ selector: 'ngx-decaf-empty-state', standalone: true, imports: [
374
+ ForAngularModule,
375
+ IonCard,
376
+ IonCardContent,
377
+ IonTitle,
378
+ IonIcon
379
+ ], template: "\n<ion-card id=\"dcf-card-empty-state\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"] }]
380
+ }], () => [], { title: [{
381
+ type: Input
382
+ }], titleColor: [{
383
+ type: Input
384
+ }], subtitle: [{
385
+ type: Input
386
+ }], subtitleColor: [{
387
+ type: Input
388
+ }], showIcon: [{
389
+ type: Input
390
+ }], icon: [{
391
+ type: Input
392
+ }], iconSize: [{
393
+ type: Input
394
+ }], iconColor: [{
395
+ type: Input
396
+ }], buttonLink: [{
397
+ type: Input
398
+ }], buttonText: [{
399
+ type: Input
400
+ }], buttonFill: [{
401
+ type: Input
402
+ }], buttonColor: [{
403
+ type: Input
404
+ }], buttonSize: [{
405
+ type: Input
406
+ }], searchValue: [{
407
+ type: Input
408
+ }] }); })();
409
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EmptyStateComponent, { className: "EmptyStateComponent", filePath: "components/empty-state/empty-state.component.ts", lineNumber: 72 }); })();
410
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3RhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFDTCxPQUFPLEVBQ1AsY0FBYyxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQ0ksMkJBQTJCLENBQUM7QUFDakMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztJQ2JqRCw4QkFBZ0M7SUFDOUIsOEJBSUk7SUFDTixpQkFBTTs7O0lBR04sd0JBQWtEOzs7SUFBOUMsZ0NBQW9CO0lBQUMsMkRBQW1COzs7SUFJMUMsdUJBQXNEOzs7SUFBbkQsbUNBQXVCO0lBQUMsOERBQXNCOzs7SUFFakQsdUJBQTREOzs7SUFBekQsbUNBQXVCO0lBQUMsb0VBQTRCOzs7SUFE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TixTQUFTO2tCQURSLEtBQUs7WUFhTixVQUFVO2tCQURULEtBQUs7WUFhTixVQUFVO2tCQURULEtBQUs7WUFjTixVQUFVO2tCQURULEtBQUs7WUFhTixXQUFXO2tCQURWLEtBQUs7WUFhTixVQUFVO2tCQURULEtBQUs7WUFhTixXQUFXO2tCQURWLEtBQUs7O2tGQTdLSyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uSW5pdCAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbG9yLCBQcmVkZWZpbmVkQ29sb3JzIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtcbiAgSW9uQ2FyZCxcbiAgSW9uQ2FyZENvbnRlbnQsXG4gIElvbkljb24sXG4gIElvblRpdGxlLFxuICBOYXZDb250cm9sbGVyXG59XG5mcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCAqIGFzIGFsbEljb25zIGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgRm9yQW5ndWxhck1vZHVsZSB9IGZyb20gJy4uLy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBEeW5hbWljLCBTdHJpbmdPckJvb2xlYW4gfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgc3RyaW5nVG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRnVuY3Rpb25MaWtlIH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgZW1wdHkgc3RhdGUgbWVzc2FnZXMgd2l0aCBvcHRpb25hbCBhY3Rpb25zLlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgd2F5IHRvIGRpc3BsYXkgZW1wdHkgc3RhdGUgbWVzc2FnZXNcbiAqIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgb3Igd2hlbiBhIHVzZXIgbmVlZHMgdG8gdGFrZSBhbiBhY3Rpb24gdG8gcG9wdWxhdGUgY29udGVudC5cbiAqIEl0IGluY2x1ZGVzIGN1c3RvbWl6YWJsZSB0aXRsZSwgc3VidGl0bGUsIGljb24sIGFuZCBhY3Rpb24gYnV0dG9uIGVsZW1lbnRzIHRoYXQgY2FuIGJlXG4gKiBzdHlsZWQgYW5kIGNvbmZpZ3VyZWQgdGhyb3VnaCBpbnB1dCBwcm9wZXJ0aWVzLiBUaGUgY29tcG9uZW50IHN1cHBvcnRzIGxvY2FsaXphdGlvblxuICogYW5kIGNhbiB0cmlnZ2VyIG5hdmlnYXRpb24gb3IgY3VzdG9tIGFjdGlvbnMgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBFbXB0eVN0YXRlQ29tcG9uZW50IHtcbiAqICAgICArc3RyaW5nIHRpdGxlXG4gKiAgICAgK3N0cmluZyB0aXRsZUNvbG9yXG4gKiAgICAgK3N0cmluZyBzdWJ0aXRsZVxuICogICAgICtzdHJpbmcgc3VidGl0bGVDb2xvclxuICogICAgICtTdHJpbmdPckJvb2xlYW4gc2hvd0ljb25cbiAqICAgICArc3RyaW5nIGljb25cbiAqICAgICArc3RyaW5nIGljb25TaXplXG4gKiAgICAgK1ByZWRlZmluZWRDb2xvcnMgaWNvbkNvbG9yXG4gKiAgICAgK3N0cmluZ3xGdW5jdGlvbiBidXR0b25MaW5rXG4gKiAgICAgK3N0cmluZyBidXR0b25UZXh0XG4gKiAgICAgK3N0cmluZyBidXR0b25GaWxsXG4gKiAgICAgK0NvbG9yIGJ1dHRvbkNvbG9yXG4gKiAgICAgK3N0cmluZyBidXR0b25TaXplXG4gKiAgICAgK3N0cmluZyBzZWFyY2hWYWx1ZVxuICogICAgIC1OYXZDb250cm9sbGVyIG5hdkNvbnRyb2xsZXJcbiAqICAgICArbmdPbkluaXQoKVxuICogICAgICtoYW5kbGVDbGljaygpXG4gKiAgIH1cbiAqICAgRW1wdHlTdGF0ZUNvbXBvbmVudCAtLXw+IE5neEJhc2VDb21wb25lbnRcbiAqICAgRW1wdHlTdGF0ZUNvbXBvbmVudCAtLXw+IE9uSW5pdFxuICpcbiAqIEBleHRlbmRzIHtOZ3hCYXNlQ29tcG9uZW50fVxuICogQGltcGxlbWVudHMge09uSW5pdH1cbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWVtcHR5LXN0YXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VtcHR5LXN0YXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZW1wdHktc3RhdGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvckFuZ3VsYXJNb2R1bGUsXG4gICAgSW9uQ2FyZCxcbiAgICBJb25DYXJkQ29udGVudCxcbiAgICBJb25UaXRsZSxcbiAgICBJb25JY29uXG4gIF1cblxufSlcbmV4cG9ydCBjbGFzcyBFbXB0eVN0YXRlQ29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWFpbiB0aXRsZSBkaXNwbGF5ZWQgaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHByaW1hcnkgbWVzc2FnZSB0byBzaG93IGluIHRoZSBlbXB0eSBzdGF0ZSBjb21wb25lbnQuXG4gICAqIFRoaXMgdGV4dCBpcyB0eXBpY2FsbHkgdXNlZCB0byBpbmZvcm0gdGhlIHVzZXIgYWJvdXQgd2h5IHRoZXkncmUgc2VlaW5nIGFuIGVtcHR5IHZpZXcuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwidGl0bGVcIlxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZyA9IFwidGl0bGVcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb2xvciBvZiB0aGUgdGl0bGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIHRpdGxlIHRleHQgdXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc3lzdGVtLlxuICAgKiBUaGUgdmFsdWUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBjb2xvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHRoZW1lLlxuICAgKiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIFwiY29sb3ItXCIgdG8gY3JlYXRlIHRoZSBDU1MgY2xhc3MuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdncmF5LTYnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZUNvbG9yID0gJ2dyYXktNic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2Vjb25kYXJ5IG1lc3NhZ2UgZGlzcGxheWVkIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWRkaXRpb25hbCBjb250ZXh0IG9yIGluc3RydWN0aW9ucyBiZWxvdyB0aGUgbWFpbiB0aXRsZS5cbiAgICogVGhpcyB0ZXh0IGlzIHR5cGljYWxseSB1c2VkIHRvIGd1aWRlIHRoZSB1c2VyIG9uIHdoYXQgYWN0aW9ucyB0aGV5IGNhbiB0YWtlLlxuICAgKiBJZiB0cmFuc2xhdGFibGUgaXMgdHJ1ZSwgdGhpcyB3aWxsIGJlIHByb2Nlc3NlZCB0aHJvdWdoIHRoZSBsb2NhbGl6YXRpb24gc3lzdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3VidGl0bGU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29sb3Igb2YgdGhlIHN1YnRpdGxlIHRleHQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBzdWJ0aXRsZSB0ZXh0IHVzaW5nIHRoZSBhcHBsaWNhdGlvbidzIGNvbG9yIHN5c3RlbS5cbiAgICogVGhlIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIGEgY29sb3IgdmFyaWFibGUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyB0aGVtZS5cbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcHJlZml4IHRoaXMgd2l0aCBcImNvbG9yLVwiIHRvIGNyZWF0ZSB0aGUgQ1NTIGNsYXNzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnZ3JheS00J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3VidGl0bGVDb2xvcjogc3RyaW5nID0gJ2dyYXktNCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBpY29uIGlzIGRpc3BsYXllZC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgdmlzdWFsIGljb24gc2hvdWxkIGJlIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogVGhpcyBjYW4gYmUgcHJvdmlkZWQgYXMgYSBib29sZWFuIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgKiBJY29ucyBoZWxwIHZpc3VhbGx5IGNvbW11bmljYXRlIHRoZSBlbXB0eSBzdGF0ZSBjb250ZXh0IHRvIHVzZXJzLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93SWNvbjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBpY29uIHRvIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBpY29uIHRvIHNob3cgd2hlbiBzaG93SWNvbiBpcyB0cnVlLlxuICAgKiBUaGUgY29tcG9uZW50IHVzZXMgdGhlIGljb24gc3lzdGVtIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uLFxuICAgKiBhbmQgdGhpcyB2YWx1ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhbiBhdmFpbGFibGUgaWNvbiBuYW1lLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcInRpLWluZm8tc3F1YXJlLXJvdW5kZWRcIlxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaWNvbjogc3RyaW5nID0gXCJ0aS1pbmZvLXNxdWFyZS1yb3VuZGVkXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2l6ZSBvZiB0aGUgZGlzcGxheWVkIGljb24uXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBpY29uIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogQ2FuIGJlIGVpdGhlciAnbGFyZ2UnIG9yICdzbWFsbCcgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGxheW91dCBuZWVkcy5cbiAgICpcbiAgICogQHR5cGUgeydsYXJnZScgfCAnc21hbGwnIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCAnbGFyZ2UnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uU2l6ZT86ICdsYXJnZScgfCAnc21hbGwnID0gJ2xhcmdlJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb2xvciBvZiB0aGUgZGlzcGxheWVkIGljb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBpY29uIHVzaW5nIElvbmljJ3MgcHJlZGVmaW5lZCBjb2xvciBzeXN0ZW0uXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBpY29uIHRvIG1hdGNoIHRoZSBhcHBsaWNhdGlvbidzIGNvbG9yIHNjaGVtZS5cbiAgICpcbiAgICogQHR5cGUge1ByZWRlZmluZWRDb2xvcnMgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICdtZWRpdW0nXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uQ29sb3I/OiBQcmVkZWZpbmVkQ29sb3JzID0gJ21lZGl1bSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgb3IgYWN0aW9uIGZvciB0aGUgYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGJ1dHRvbiBzaG91bGQgbmF2aWdhdGUgdG8gd2hlbiBjbGlja2VkIG9yIHdoYXQgZnVuY3Rpb25cbiAgICogaXQgc2hvdWxkIGV4ZWN1dGUuIFRoaXMgY2FuIGJlIGVpdGhlciBhIFVSTCBzdHJpbmcgb3IgYSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgbmF2aWdhdGlvbi5cbiAgICogV2hlbiBub3QgcHJvdmlkZWQsIHRoZSBidXR0b24gd2lsbCBub3QgcGVyZm9ybSBhbnkgYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgRnVuY3Rpb25MaWtlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uTGluaz86IHN0cmluZyB8IEZ1bmN0aW9uTGlrZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0ZXh0IGRpc3BsYXllZCBvbiB0aGUgYWN0aW9uIGJ1dHRvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBsYWJlbCBmb3IgdGhlIGFjdGlvbiBidXR0b24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBJZiB0cmFuc2xhdGFibGUgaXMgdHJ1ZSwgdGhpcyB3aWxsIGJlIHByb2Nlc3NlZCB0aHJvdWdoIHRoZSBsb2NhbGl6YXRpb24gc3lzdGVtLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBidXR0b24gd2lsbCBub3QgZGlzcGxheSBhbnkgdGV4dC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZmlsbCBzdHlsZSBvZiB0aGUgYWN0aW9uIGJ1dHRvbi5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgYnV0dG9uIHVzaW5nIElvbmljJ3MgYnV0dG9uIGZpbGwgb3B0aW9ucy5cbiAgICogJ3NvbGlkJyBjcmVhdGVzIGEgYnV0dG9uIHdpdGggYSBzb2xpZCBiYWNrZ3JvdW5kLCAnb3V0bGluZScgY3JlYXRlcyBhIGJ1dHRvbiB3aXRoXG4gICAqIGp1c3QgYSBib3JkZXIsIGFuZCAnY2xlYXInIGNyZWF0ZXMgYSBidXR0b24gd2l0aCBubyBiYWNrZ3JvdW5kIG9yIGJvcmRlci5cbiAgICpcbiAgICogQHR5cGUgeydjbGVhcicgfCAnc29saWQnIHwgJ291dGxpbmUnfVxuICAgKiBAZGVmYXVsdCAnc29saWQnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBidXR0b25GaWxsOiAnY2xlYXInIHwgJ3NvbGlkJyB8ICdvdXRsaW5lJyA9ICAnc29saWQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbG9yIGZvciB0aGUgYnV0dG9uIHVzaW5nIElvbmljJ3MgY29sb3Igc3lzdGVtLlxuICAgKiBUaGlzIGFsbG93cyB0aGUgYnV0dG9uIHRvIG1hdGNoIHRoZSBhcHBsaWNhdGlvbidzIGNvbG9yIHNjaGVtZS5cbiAgICpcbiAgICogQHR5cGUge0NvbG9yfVxuICAgKiBAZGVmYXVsdCAncHJpbWFyeSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvbkNvbG9yOiBDb2xvciA9ICAncHJpbWFyeSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2l6ZSBvZiB0aGUgYWN0aW9uIGJ1dHRvbi5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbiBzaG93biBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIENhbiBiZSAnbGFyZ2UnLCAnc21hbGwnLCBvciAnZGVmYXVsdCcgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGxheW91dCBuZWVkcy5cbiAgICpcbiAgICogQHR5cGUgeydsYXJnZScgfCAnc21hbGwnIHwgJ2RlZmF1bHQnfVxuICAgKiBAZGVmYXVsdCAnZGVmYXVsdCdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvblNpemU6ICdsYXJnZScgfCAnc21hbGwnIHwgJ2RlZmF1bHQnID0gICdkZWZhdWx0JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzZWFyY2ggdmFsdWUgdGhhdCByZXN1bHRlZCBpbiBubyByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRoZSBlbXB0eSBzdGF0ZSBpcyBzaG93biBkdWUgdG8gYSBzZWFyY2ggd2l0aCBubyByZXN1bHRzLFxuICAgKiB0aGlzIHByb3BlcnR5IGNhbiBob2xkIHRoZSBzZWFyY2ggdGVybSB0aGF0IHdhcyB1c2VkLiBUaGlzIGNhbiBiZSBkaXNwbGF5ZWRcbiAgICogaW4gdGhlIGVtcHR5IHN0YXRlIG1lc3NhZ2UgdG8gcHJvdmlkZSBjb250ZXh0IHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVmFsdWUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIGZvciBoYW5kbGluZyBuYXZpZ2F0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciBuYXZpZ2F0aW5nIGJldHdlZW4gcm91dGVzLlxuICAgKiBUaGlzIHNlcnZpY2UgaXMgdXNlZCB3aGVuIHRoZSBidXR0b25MaW5rIGlzIGEgc3RyaW5nIFVSTCB0byBuYXZpZ2F0ZSB0byB0aGF0IGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7TmF2Q29udHJvbGxlcn1cbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlciA9IGluamVjdChOYXZDb250cm9sbGVyKTtcblxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgc2VhcmNoU3VidGl0bGUhOiBTYWZlSHRtbFxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEVtcHR5U3RhdGVDb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEVtcHR5U3RhdGVDb21wb25lbnQgYnkgY2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGNvbnN0cnVjdG9yXG4gICAqIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGZvciBsb2dnaW5nIGFuZCBpZGVudGlmaWNhdGlvbiBwdXJwb3Nlcy4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXNcbiAgICogYSBzdGFuZGFyZGl6ZWQgd2F5IHRvIGRpc3BsYXkgZW1wdHkgc3RhdGUgbWVzc2FnZXMgd2l0aCBvcHRpb25hbCBpY29ucyBhbmQgYWN0aW9uIGJ1dHRvbnMuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkVtcHR5U3RhdGVDb21wb25lbnRcIik7XG4gICAgYWRkSWNvbnMoYWxsSWNvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGFmdGVyIEFuZ3VsYXIgZmlyc3QgZGlzcGxheXMgdGhlIGRhdGEtYm91bmQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgY29tcG9uZW50IGJ5IHByb2Nlc3NpbmcgYm9vbGVhbiBpbnB1dHMsIGFwcGx5aW5nIGxvY2FsaXphdGlvbiB0byB0ZXh0XG4gICAqIGVsZW1lbnRzIGlmIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQsIGFuZCBmb3JtYXR0aW5nIENTUyBjbGFzc2VzIGZvciB0aXRsZSBhbmQgc3VidGl0bGUgY29sb3JzLlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwYXJlcyB0aGUgY29tcG9uZW50IGZvciB1c2VyIGludGVyYWN0aW9uIGJ5IGVuc3VyaW5nIGFsbCBwcm9wZXJ0aWVzIGFyZVxuICAgKiBwcm9wZXJseSBpbml0aWFsaXplZCBhbmQgbG9jYWxpemVkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqXG4gICAqICAgQS0+PkU6IG5nT25Jbml0KClcbiAgICogICBFLT4+RTogUHJvY2VzcyB0cmFuc2xhdGFibGUgZmxhZ1xuICAgKiAgIEUtPj5FOiBQcm9jZXNzIHNob3dJY29uIGZsYWdcbiAgICogICBFLT4+RTogR2V0IGxvY2FsZSBzZXR0aW5nc1xuICAgKiAgIGFsdCB0cmFuc2xhdGFibGUgaXMgdHJ1ZVxuICAgKiAgICAgRS0+PkU6IExvY2FsaXplIHRpdGxlXG4gICAqICAgICBFLT4+RTogTG9jYWxpemUgc3VidGl0bGVcbiAgICogICAgIEUtPj5FOiBMb2NhbGl6ZSBidXR0b25UZXh0XG4gICAqICAgZW5kXG4gICAqICAgRS0+PkU6IEZvcm1hdCB0aXRsZSBDU1MgY2xhc3NcbiAgICogICBFLT4+RTogRm9ybWF0IHN1YnRpdGxlIENTUyBjbGFzc1xuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5wYXJzZVByb3BzKHRoaXMpO1xuICAgIHRoaXMudHJhbnNsYXRhYmxlID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgICB0aGlzLnNob3dJY29uID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuc2hvd0ljb24pO1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbGUodGhpcy50cmFuc2xhdGFibGUpO1xuXG4gICAgLy8gaWYodGhpcy50cmFuc2xhdGFibGUpIHtcbiAgICAvLyAgIHRoaXMudGl0bGUgPSBnZW5lcmF0ZUxvY2FsZUZyb21TdHJpbmcodGhpcy5sb2NhbGUsIHRoaXMudGl0bGUpO1xuICAgIC8vICAgdGhpcy5zdWJ0aXRsZSA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5zdWJ0aXRsZSk7XG4gICAgLy8gICB0aGlzLmJ1dHRvblRleHQgPSBnZW5lcmF0ZUxvY2FsZUZyb21TdHJpbmcodGhpcy5sb2NhbGUsIHRoaXMuYnV0dG9uVGV4dCk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy50aXRsZUNvbG9yID0gYGRjZi10aXRsZSBjb2xvci0ke3RoaXMudGl0bGVDb2xvcn1gO1xuICAgIHRoaXMuc3VidGl0bGVDb2xvciA9IGBkY2Ytc3VidGl0bGUgY29sb3ItJHt0aGlzLnRpdGxlQ29sb3J9YDtcblxuICAgIGlmKHRoaXMuc2VhcmNoVmFsdWUgJiYgdGhpcy50cmFuc2xhdGFibGUpXG4gICAgICB0aGlzLnNlYXJjaFN1YnRpdGxlID0gYXdhaXQgdGhpcy5nZXRTZWFyY2hTdWJ0aXRsZSh0aGlzLnN1YnRpdGxlIGFzIHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGFjdGlvbiBidXR0b24gaW4gdGhlIGVtcHR5IHN0YXRlXG4gICAqIGNvbXBvbmVudC4gSXQgc3VwcG9ydHMgdGhyZWUgbmF2aWdhdGlvbiBwYXR0ZXJuczogMSkgbm8gYWN0aW9uIHdoZW4gYnV0dG9uTGluayBpcyBub3QgcHJvdmlkZWQsXG4gICAqIDIpIGN1c3RvbSBmdW5jdGlvbiBleGVjdXRpb24gd2hlbiBidXR0b25MaW5rIGlzIGEgZnVuY3Rpb24sIGFuZCAzKSBuYXZpZ2F0aW9uIHRvIGEgc3BlY2lmaWMgVVJMXG4gICAqIHdoZW4gYnV0dG9uTGluayBpcyBhIHN0cmluZy4gVGhpcyBmbGV4aWJpbGl0eSBhbGxvd3MgdGhlIGVtcHR5IHN0YXRlIHRvIHRyaWdnZXIgdmFyaW91cyBhY3Rpb25zXG4gICAqIGJhc2VkIG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0J3MgdXNlZC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTiBhcyBOYXZDb250cm9sbGVyXG4gICAqXG4gICAqICAgVS0+PkU6IENsaWNrIGFjdGlvbiBidXR0b25cbiAgICogICBFLT4+RTogaGFuZGxlQ2xpY2soKVxuICAgKiAgIGFsdCBidXR0b25MaW5rIGlzIG5vdCBwcm92aWRlZFxuICAgKiAgICAgRS0tPj5VOiBSZXR1cm4gZmFsc2UgKG5vIGFjdGlvbilcbiAgICogICBlbHNlIGJ1dHRvbkxpbmsgaXMgYSBmdW5jdGlvblxuICAgKiAgICAgRS0+PkU6IEV4ZWN1dGUgYnV0dG9uTGluayBmdW5jdGlvblxuICAgKiAgICAgRS0tPj5VOiBSZXR1cm4gZnVuY3Rpb24gcmVzdWx0XG4gICAqICAgZWxzZSBidXR0b25MaW5rIGlzIGEgVVJMIHN0cmluZ1xuICAgKiAgICAgRS0+Pk46IG5hdmlnYXRlRm9yd2FyZChidXR0b25MaW5rKVxuICAgKiAgICAgTi0tPj5FOiBSZXR1cm4gbmF2aWdhdGlvbiByZXN1bHRcbiAgICogICAgIEUtLT4+VTogUmV0dXJuIG5hdmlnYXRpb24gcmVzdWx0XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCB2b2lkIHwgUHJvbWlzZTxib29sZWFuPn1cbiAgICogICAtIGZhbHNlIGlmIG5vIGFjdGlvbiBpcyB0YWtlblxuICAgKiAgIC0gVGhlIHJlc3VsdCBvZiB0aGUgYnV0dG9uTGluayBmdW5jdGlvbiBpZiBpdCdzIGEgZnVuY3Rpb25cbiAgICogICAtIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIG5hdmlnYXRpb24gcmVzdWx0IGlmIGJ1dHRvbkxpbmsgaXMgYSBVUkxcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUNsaWNrKCk6IGJvb2xlYW4gfCB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLmJ1dHRvbkxpbms7XG4gICAgaWYoIWZuKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmKGZuIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICByZXR1cm4gZm4oKTtcbiAgICByZXR1cm4gdGhpcy5uYXZDb250cm9sbGVyLm5hdmlnYXRlRm9yd2FyZChmbiBhcyBzdHJpbmcpO1xuICB9XG5cblxuIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbG9jYWxpemVkIGFuZCBzYW5pdGl6ZWQgc3VidGl0bGUgZm9yIHNlYXJjaCByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCB0YWtlcyBhIGNvbnRlbnQgc3RyaW5nLCB0eXBpY2FsbHkgdGhlIHN1YnRpdGxlLCBhbmQgcHJvY2Vzc2VzIGl0XG4gICAqIHRocm91Z2ggdGhlIHRyYW5zbGF0aW9uIHNlcnZpY2UuIEl0IHJlcGxhY2VzIGEgcGxhY2Vob2xkZXIgKCd2YWx1ZTAnKSB3aXRoIHRoZSBhY3R1YWxcbiAgICogc2VhcmNoIHZhbHVlLCB0aGVuIHNhbml0aXplcyB0aGUgcmVzdWx0IHRvIHNhZmVseSB1c2UgYXMgSFRNTC4gVGhpcyBpcyBwYXJ0aWN1bGFybHlcbiAgICogdXNlZnVsIGZvciBkaXNwbGF5aW5nIGR5bmFtaWMsIGxvY2FsaXplZCBtZXNzYWdlcyBpbiB0aGUgZW1wdHkgc3RhdGUgd2hlbiBhIHNlYXJjaFxuICAgKiB5aWVsZHMgbm8gcmVzdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBUaGUgY29udGVudCBzdHJpbmcgdG8gYmUgdHJhbnNsYXRlZCBhbmQgcHJvY2Vzc2VkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2FmZUh0bWw+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHNhbml0aXplZCBIVE1MIHN0cmluZ1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRyYW5zbGF0ZVNlcnZpY2VcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIERvbVNhbml0aXplclxuICAgKlxuICAgKiAgIEUtPj5UOiBpbnN0YW50KGNvbnRlbnQsIHsndmFsdWUwJzogc2VhcmNoVmFsdWV9KVxuICAgKiAgIFQtLT4+RTogUmV0dXJuIHRyYW5zbGF0ZWQgc3RyaW5nXG4gICAqICAgRS0+PlM6IGJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRyYW5zbGF0ZWRTdHJpbmcpXG4gICAqICAgUy0tPj5FOiBSZXR1cm4gc2FuaXRpemVkIFNhZmVIdG1sXG4gICAqXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBnZXRTZWFyY2hTdWJ0aXRsZShjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPFNhZmVIdG1sPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuaW5zdGFudChjb250ZW50LCB7J3ZhbHVlMCc6IHRoaXMuc2VhcmNoVmFsdWV9KTtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwocmVzdWx0KTtcbiAgfVxufVxuIiwiXG48aW9uLWNhcmQgaWQ9XCJkY2YtY2FyZC1lbXB0eS1zdGF0ZVwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8aW9uLWNhcmQtY29udGVudD5cbiAgICBAaWYoaWNvbiAmJiBzaG93SWNvbikge1xuICAgICAgPGRpdiBjbGFzcz1cImRjZi1pY29uLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW9uLWljb25cbiAgICAgICAgICBuYW1lPVwiYWxlcnQtY2lyY2xlLW91dGxpbmVcIlxuICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgY29sb3I9XCJkYW5nZXJcIlxuICAgICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmKHRpdGxlKSB7XG4gICAgICA8aDUgW2NsYXNzXT1cInRpdGxlQ29sb3JcIiBbaW5uZXJIVE1MXT1cInRpdGxlXCI+PC9oNT5cbiAgICB9XG4gICAgQGlmKHN1YnRpdGxlKSB7XG4gICAgICBAaWYoIXNlYXJjaFZhbHVlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJzdWJ0aXRsZUNvbG9yXCIgW2lubmVySFRNTF09XCJzdWJ0aXRsZVwiPjwvcD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8cCBbY2xhc3NdPVwic3VidGl0bGVDb2xvclwiIFtpbm5lckhUTUxdPVwic2VhcmNoU3VidGl0bGVcIj48L3A+XG4gICAgICB9XG4gICAgfVxuICAgIEBpZihidXR0b25MaW5rICYmIGJ1dHRvblRleHQpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgW3NpemVdPVwiYnV0dG9uU2l6ZVwiXG4gICAgICAgICAgW2ZpbGxdPVwiYnV0dG9uRmlsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImJ1dHRvbkNvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soKVwiPlxuICAgICAgICAgIHt7ICBidXR0b25UZXh0IH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9pb24tY2FyZC1jb250ZW50PlxuPC9pb24tY2FyZD5cbiJdfQ==