keevo-components 1.5.183 → 1.5.185

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 (178) hide show
  1. package/README.md +24 -24
  2. package/esm2020/keevo-components.mjs +4 -4
  3. package/esm2020/lib/api/base-components/base-component-button.mjs +36 -36
  4. package/esm2020/lib/api/base-components/base-component-chart.mjs +92 -92
  5. package/esm2020/lib/api/base-components/base-component-crud-form.mjs +269 -269
  6. package/esm2020/lib/api/base-components/base-component-crud-list.mjs +67 -67
  7. package/esm2020/lib/api/base-components/base-component-crud.mjs +65 -65
  8. package/esm2020/lib/api/base-components/base-component-dropdown-new.mjs +211 -211
  9. package/esm2020/lib/api/base-components/base-component-dropdown.mjs +161 -161
  10. package/esm2020/lib/api/base-components/base-component-input.mjs +94 -94
  11. package/esm2020/lib/api/base-components/base-component-multi-select.mjs +128 -128
  12. package/esm2020/lib/api/base-components/base-component.mjs +49 -49
  13. package/esm2020/lib/api/components/chart/chart.config.mjs +2 -2
  14. package/esm2020/lib/api/components/chart/chart.model.mjs +2 -2
  15. package/esm2020/lib/api/components/chart/orchart.config.mjs +2 -2
  16. package/esm2020/lib/api/components/chart/orchart.item.mjs +2 -2
  17. package/esm2020/lib/api/components/dropdown/filtro.combo.mjs +2 -2
  18. package/esm2020/lib/api/components/error/error.component.mjs +26 -26
  19. package/esm2020/lib/api/components/error/kverror.module.mjs +35 -35
  20. package/esm2020/lib/api/components/table/action-item.mjs +2 -2
  21. package/esm2020/lib/api/components/table/kv-menuitem.mjs +3 -3
  22. package/esm2020/lib/api/components/table/table.config.column.mjs +2 -2
  23. package/esm2020/lib/api/components/table/table.config.mjs +2 -2
  24. package/esm2020/lib/api/components/table/table.paginate.mjs +9 -9
  25. package/esm2020/lib/api/helpers/component-providers.mjs +16 -16
  26. package/esm2020/lib/api/helpers/keevo-validators.mjs +64 -64
  27. package/esm2020/lib/api/helpers/translate-primeng.mjs +23 -23
  28. package/esm2020/lib/api/models/menu/menu.model.mjs +2 -2
  29. package/esm2020/lib/api/models/menu/menucompleto.model.mjs +2 -2
  30. package/esm2020/lib/api/models/menu/sistemamenu.model.mjs +2 -2
  31. package/esm2020/lib/api/modules/primeng.module.mjs +247 -247
  32. package/esm2020/lib/api/services/base.api.service.mjs +74 -74
  33. package/esm2020/lib/api/services/component.service.mjs +27 -27
  34. package/esm2020/lib/api/services/form.service.mjs +84 -84
  35. package/esm2020/lib/api/services/imagens.service.mjs +22 -22
  36. package/esm2020/lib/api/services/notification.service.mjs +67 -67
  37. package/esm2020/lib/api/services/object.service.mjs +26 -26
  38. package/esm2020/lib/buttons/button-personalize/button-personalize.component.mjs +17 -17
  39. package/esm2020/lib/buttons/button-popup/button-popup.component.mjs +31 -31
  40. package/esm2020/lib/buttons/button-secondary/button-secondary.component.mjs +17 -17
  41. package/esm2020/lib/buttons/button-success/button-success.component.mjs +17 -17
  42. package/esm2020/lib/buttons/kvbutton.module.mjs +39 -39
  43. package/esm2020/lib/chart/chart.component.mjs +145 -145
  44. package/esm2020/lib/chart/kvchart.module.mjs +32 -32
  45. package/esm2020/lib/directives/template.directive.mjs +24 -24
  46. package/esm2020/lib/inputs/check/check.component.mjs +26 -26
  47. package/esm2020/lib/inputs/dropdown/dropdown.component.mjs +37 -37
  48. package/esm2020/lib/inputs/editor/editor.component.mjs +70 -70
  49. package/esm2020/lib/inputs/input-calendar/input-calendar.component.mjs +89 -89
  50. package/esm2020/lib/inputs/input-mask/input-mask.component.mjs +23 -23
  51. package/esm2020/lib/inputs/input-number/input-number.component.mjs +59 -59
  52. package/esm2020/lib/inputs/input-password/input-password.component.mjs +33 -33
  53. package/esm2020/lib/inputs/input-text/input-text.component.mjs +21 -21
  54. package/esm2020/lib/inputs/input-text-checkbox/input-text-checkbox.component.mjs +37 -37
  55. package/esm2020/lib/inputs/input-textarea/input-textarea.component.mjs +43 -43
  56. package/esm2020/lib/inputs/input-time/input-time.component.mjs +24 -24
  57. package/esm2020/lib/inputs/kvinputs.module.mjs +108 -108
  58. package/esm2020/lib/inputs/multi-select/multi-select.component.mjs +38 -38
  59. package/esm2020/lib/inputs/radio-group/radio-group.component.mjs +53 -53
  60. package/esm2020/lib/inputs/switch/switch.component.mjs +32 -32
  61. package/esm2020/lib/keevo-components.module.mjs +98 -98
  62. package/esm2020/lib/label/label.component.mjs +14 -14
  63. package/esm2020/lib/label/label.module.mjs +23 -23
  64. package/esm2020/lib/login/kvlogin.module.mjs +47 -47
  65. package/esm2020/lib/login/login.component.mjs +52 -52
  66. package/esm2020/lib/menu/kvmenu.module.mjs +43 -43
  67. package/esm2020/lib/menu/menu.component.mjs +237 -237
  68. package/esm2020/lib/orgchart/orgchart.component.mjs +100 -100
  69. package/esm2020/lib/orgchart/orgchart.module.mjs +24 -24
  70. package/esm2020/lib/page-form/kv-page-form.module.mjs +38 -38
  71. package/esm2020/lib/page-form/page-form.component.mjs +144 -144
  72. package/esm2020/lib/picklist/kvpicklist.module.mjs +32 -32
  73. package/esm2020/lib/picklist/picklist.component.mjs +48 -48
  74. package/esm2020/lib/pipes/codigofile.pipe.mjs +19 -19
  75. package/esm2020/lib/pipes/cpfcnpj.pipe.mjs +25 -25
  76. package/esm2020/lib/pipes/pipes.module.mjs +34 -34
  77. package/esm2020/lib/pipes/telefone.pipe.mjs +45 -45
  78. package/esm2020/lib/table/kvtable.module.mjs +32 -32
  79. package/esm2020/lib/table/table.component.mjs +499 -499
  80. package/esm2020/lib/tree-table/kv-treetable.component.mjs +371 -371
  81. package/esm2020/lib/tree-table/kv-treetable.module.mjs +32 -32
  82. package/esm2020/lib/tree-view/kvtree-view.module.mjs +28 -28
  83. package/esm2020/lib/tree-view/tree-view.component.mjs +29 -29
  84. package/esm2020/lib/workspace/kvworkspace.module.mjs +47 -47
  85. package/esm2020/lib/workspace/workspace.component.mjs +77 -77
  86. package/esm2020/public-api.mjs +132 -132
  87. package/fesm2015/keevo-components.mjs +4382 -4382
  88. package/fesm2015/keevo-components.mjs.map +1 -1
  89. package/fesm2020/keevo-components.mjs +4373 -4373
  90. package/fesm2020/keevo-components.mjs.map +1 -1
  91. package/index.d.ts +5 -5
  92. package/lib/api/base-components/base-component-button.d.ts +14 -14
  93. package/lib/api/base-components/base-component-chart.d.ts +40 -40
  94. package/lib/api/base-components/base-component-crud-form.d.ts +137 -137
  95. package/lib/api/base-components/base-component-crud-list.d.ts +63 -63
  96. package/lib/api/base-components/base-component-crud.d.ts +36 -36
  97. package/lib/api/base-components/base-component-dropdown-new.d.ts +14 -14
  98. package/lib/api/base-components/base-component-dropdown.d.ts +42 -42
  99. package/lib/api/base-components/base-component-input.d.ts +31 -31
  100. package/lib/api/base-components/base-component-multi-select.d.ts +35 -35
  101. package/lib/api/base-components/base-component.d.ts +21 -21
  102. package/lib/api/components/chart/chart.config.d.ts +11 -11
  103. package/lib/api/components/chart/chart.model.d.ts +9 -9
  104. package/lib/api/components/chart/orchart.config.d.ts +35 -35
  105. package/lib/api/components/chart/orchart.item.d.ts +26 -26
  106. package/lib/api/components/dropdown/filtro.combo.d.ts +4 -4
  107. package/lib/api/components/error/error.component.d.ts +12 -12
  108. package/lib/api/components/error/kverror.module.d.ts +10 -10
  109. package/lib/api/components/table/action-item.d.ts +5 -5
  110. package/lib/api/components/table/kv-menuitem.d.ts +9 -9
  111. package/lib/api/components/table/table.config.column.d.ts +21 -21
  112. package/lib/api/components/table/table.config.d.ts +17 -17
  113. package/lib/api/components/table/table.paginate.d.ts +6 -6
  114. package/lib/api/helpers/component-providers.d.ts +2 -2
  115. package/lib/api/helpers/keevo-validators.d.ts +10 -10
  116. package/lib/api/helpers/translate-primeng.d.ts +4 -4
  117. package/lib/api/models/menu/menu.model.d.ts +10 -10
  118. package/lib/api/models/menu/menucompleto.model.d.ts +6 -6
  119. package/lib/api/models/menu/sistemamenu.model.d.ts +8 -8
  120. package/lib/api/modules/primeng.module.d.ts +60 -60
  121. package/lib/api/services/base.api.service.d.ts +25 -25
  122. package/lib/api/services/component.service.d.ts +11 -11
  123. package/lib/api/services/form.service.d.ts +27 -27
  124. package/lib/api/services/imagens.service.d.ts +8 -8
  125. package/lib/api/services/notification.service.d.ts +25 -25
  126. package/lib/api/services/object.service.d.ts +8 -8
  127. package/lib/buttons/button-personalize/button-personalize.component.d.ts +7 -7
  128. package/lib/buttons/button-popup/button-popup.component.d.ts +13 -13
  129. package/lib/buttons/button-secondary/button-secondary.component.d.ts +7 -7
  130. package/lib/buttons/button-success/button-success.component.d.ts +7 -7
  131. package/lib/buttons/kvbutton.module.d.ts +11 -11
  132. package/lib/chart/chart.component.d.ts +56 -56
  133. package/lib/chart/kvchart.module.d.ts +10 -10
  134. package/lib/directives/template.directive.d.ts +11 -11
  135. package/lib/inputs/check/check.component.d.ts +11 -11
  136. package/lib/inputs/dropdown/dropdown.component.d.ts +14 -14
  137. package/lib/inputs/editor/editor.component.d.ts +39 -39
  138. package/lib/inputs/input-calendar/input-calendar.component.d.ts +27 -27
  139. package/lib/inputs/input-mask/input-mask.component.d.ts +10 -10
  140. package/lib/inputs/input-number/input-number.component.d.ts +19 -19
  141. package/lib/inputs/input-password/input-password.component.d.ts +13 -13
  142. package/lib/inputs/input-text/input-text.component.d.ts +9 -9
  143. package/lib/inputs/input-text-checkbox/input-text-checkbox.component.d.ts +15 -15
  144. package/lib/inputs/input-textarea/input-textarea.component.d.ts +16 -16
  145. package/lib/inputs/input-time/input-time.component.d.ts +10 -10
  146. package/lib/inputs/kvinputs.module.d.ts +25 -25
  147. package/lib/inputs/multi-select/multi-select.component.d.ts +12 -12
  148. package/lib/inputs/radio-group/radio-group.component.d.ts +18 -18
  149. package/lib/inputs/switch/switch.component.d.ts +13 -13
  150. package/lib/keevo-components.module.d.ts +18 -18
  151. package/lib/label/label.component.d.ts +7 -7
  152. package/lib/label/label.module.d.ts +8 -8
  153. package/lib/login/kvlogin.module.d.ts +13 -13
  154. package/lib/login/login.component.d.ts +30 -30
  155. package/lib/menu/kvmenu.module.d.ts +12 -12
  156. package/lib/menu/menu.component.d.ts +74 -74
  157. package/lib/orgchart/orgchart.component.d.ts +27 -27
  158. package/lib/orgchart/orgchart.module.d.ts +9 -9
  159. package/lib/page-form/kv-page-form.module.d.ts +11 -11
  160. package/lib/page-form/page-form.component.d.ts +69 -69
  161. package/lib/picklist/kvpicklist.module.d.ts +10 -10
  162. package/lib/picklist/picklist.component.d.ts +20 -20
  163. package/lib/pipes/codigofile.pipe.d.ts +7 -7
  164. package/lib/pipes/cpfcnpj.pipe.d.ts +7 -7
  165. package/lib/pipes/pipes.module.d.ts +10 -10
  166. package/lib/pipes/telefone.pipe.d.ts +7 -7
  167. package/lib/table/kvtable.module.d.ts +10 -10
  168. package/lib/table/table.component.d.ts +104 -104
  169. package/lib/tree-table/kv-treetable.component.d.ts +84 -84
  170. package/lib/tree-table/kv-treetable.module.d.ts +11 -11
  171. package/lib/tree-view/kvtree-view.module.d.ts +9 -9
  172. package/lib/tree-view/tree-view.component.d.ts +14 -14
  173. package/lib/workspace/kvworkspace.module.d.ts +13 -13
  174. package/lib/workspace/workspace.component.d.ts +28 -28
  175. package/package.json +1 -1
  176. package/public-api.d.ts +128 -128
  177. package/esm2020/lib/api/models/menu/master.model.mjs +0 -2
  178. package/lib/api/models/menu/master.model.d.ts +0 -6
@@ -1,269 +1,269 @@
1
- import { Component } from "@angular/core";
2
- import { FormGroup } from "@angular/forms";
3
- import { combineLatest, filter, finalize } from "rxjs";
4
- import { BaseComponentCrud } from "./base-component-crud";
5
- import { FormService } from "../services/form.service";
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "primeng/dynamicdialog";
8
- import * as i2 from "../services/notification.service";
9
- import * as i3 from "@angular/router";
10
- export class BaseComponentCrudForm extends BaseComponentCrud {
11
- constructor(dialogService, notificationService, activatedRoute, dynamicDialogRef, dynamicDialogConfig, router) {
12
- super(dialogService, notificationService);
13
- this.activatedRoute = activatedRoute;
14
- this.dynamicDialogRef = dynamicDialogRef;
15
- this.dynamicDialogConfig = dynamicDialogConfig;
16
- this.router = router;
17
- this.isAccordionExpanded = false;
18
- this.isNewRegistry = false;
19
- this.isSaveLoading = false;
20
- this.isView = false;
21
- this.formGroup = new FormGroup({});
22
- this.actions = [];
23
- this.popup = false;
24
- this.registry = null;
25
- this.onSetFormValues = false;
26
- }
27
- /**
28
- * Método disparado para tratamento das notificações do backend
29
- * @param err - Notificação
30
- */
31
- backendError(err) {
32
- if (err) {
33
- if (err.status == 404) {
34
- this.notificationService.toastError(err.error.item2[0].message);
35
- return;
36
- }
37
- else if (err.status == 400) {
38
- // Erros de validação de domínio do backend
39
- if (Array.isArray(err.error)) {
40
- if (err.error?.length) {
41
- if (err.error.length == 1 && err.error[0].key == '') {
42
- this.notificationService.toastError(err.error[0].message);
43
- return;
44
- }
45
- this.invalidForm(err.error);
46
- return;
47
- }
48
- }
49
- else if (err.error?.title) {
50
- // Erro de json no backend
51
- this.notificationService.toastError(err.error.title);
52
- return;
53
- }
54
- }
55
- else if (err.status == 415) {
56
- if (err.error?.title) {
57
- // Erro de json no backend
58
- this.notificationService.toastError(err.error.title);
59
- return;
60
- }
61
- }
62
- // Qualquer outro tipo de erro que tenha mensagem
63
- if (err.message) {
64
- this.notificationService.toastError(err.message);
65
- }
66
- }
67
- }
68
- /**
69
- * Método disparado ao clicar no botão de cancelamento
70
- */
71
- cancel() {
72
- this.notificationService.question({
73
- type: 'question',
74
- message: 'Deseja cancelar a operação?',
75
- accept: () => {
76
- this.navigateList();
77
- },
78
- });
79
- }
80
- /**
81
- * Verifica se houveram alterações nos componentes do formControl
82
- * @param controls - Nomes do controles no formGroup
83
- * @returns Observable
84
- */
85
- detectFormControlChanges(controls) {
86
- const controlList = [];
87
- controls.forEach(controlName => controlList.push(this.formGroup.controls[controlName].valueChanges));
88
- return combineLatest(controlList).pipe(filter(() => !this.onSetFormValues));
89
- }
90
- /**
91
- * Método responsável por desabilitar um componente
92
- * @param controlName - Nome do controle no formGroup
93
- */
94
- disableComponent(controlName) {
95
- FormService.disableControl(this.formGroup, controlName);
96
- }
97
- /**
98
- * Método responsável por limpar e desabilitar um componente
99
- * @param controlName - Nome do controle no formGroup
100
- * @param value - Valor default
101
- */
102
- disableAndClearComponent(controlName, value) {
103
- FormService.disableAndClearControl(this.formGroup, controlName, value);
104
- }
105
- /**
106
- * Método responsável por habilitar um componente
107
- * @param controlName - Nome do controle no formGroup
108
- */
109
- enableComponent(controName) {
110
- FormService.enableControl(this.formGroup, controName);
111
- }
112
- /**
113
- * Método que retorna o valor de um componente
114
- * @param controlName - Nome do controle no formGroup
115
- * @returns - Valor
116
- */
117
- getFormValue(controlName) {
118
- return FormService.getFormValue(this.formGroup, controlName);
119
- }
120
- /**
121
- * Verifica se o componente possui erro
122
- * @param controlName - Nome do controle no formGroup
123
- */
124
- hasControlError(controlName, errorCode) {
125
- return FormService.hasControlError(this.formGroup, controlName, errorCode);
126
- }
127
- /**
128
- * Seta inconsistências para o fomulário
129
- * @param notification - Lista de notificações
130
- */
131
- invalidForm(notification) {
132
- FormService.invalidForm(this.formGroup, notification);
133
- }
134
- /**
135
- * Método responsável pelo carregamento da tela
136
- * @param obs - Observable responsável pelo salvamento dos dados
137
- */
138
- loadData(obs) {
139
- obs
140
- //.pipe(loading())
141
- .subscribe((data) => {
142
- this.isNewRegistry = false;
143
- this.registry = data;
144
- this.setFormValues(this.registry);
145
- this.loadGrids();
146
- this.setTitlePopup();
147
- });
148
- }
149
- loadGrids() { }
150
- /**
151
- * Método disparado para retornar a lista
152
- */
153
- navigateList(id = null) {
154
- if (this.popup) {
155
- this.dynamicDialogRef.close(id);
156
- }
157
- else if (this.dadosTela?.rotaListar) {
158
- this.router.navigate([this.dadosTela.rotaListar]);
159
- }
160
- }
161
- ngOnDestroy() {
162
- if (this.dynamicDialogRef) {
163
- this.dynamicDialogRef.close();
164
- }
165
- }
166
- ngOnInit() {
167
- this.configureForm();
168
- this.popup = this.dynamicDialogConfig?.data?.popup || false;
169
- this.activatedRoute.params.subscribe((params) => {
170
- if (params['id']) {
171
- this.loadForm(params['id']);
172
- }
173
- else if (this.dynamicDialogConfig?.data?.id) {
174
- this.loadForm(this.dynamicDialogConfig.data.id);
175
- }
176
- else {
177
- this.isNewRegistry = true;
178
- this.loadGrids();
179
- this.setTitlePopup();
180
- }
181
- });
182
- }
183
- /**
184
- * Método disparado para salvar dados
185
- * @param obs - Observable responsável pelo salvamento dos dados
186
- */
187
- saveData(obs) {
188
- obs
189
- .pipe((src) => {
190
- this.isSaveLoading = true;
191
- return src.pipe(finalize(() => {
192
- this.isSaveLoading = false;
193
- }));
194
- })
195
- .subscribe({
196
- next: (res) => {
197
- this.notificationService.toastSuccess(res.item2[0].message);
198
- this.navigateList(res.item1);
199
- },
200
- error: (e) => {
201
- this.backendError(e);
202
- },
203
- });
204
- }
205
- /**
206
- * Método se atualiza o valor de um componente do formGroup
207
- * @param controName - Nome do controle
208
- * @param value - Valor para atualização
209
- */
210
- setControlValue(controName, value) {
211
- FormService.setControlValue(this.formGroup, controName, value);
212
- }
213
- /**
214
- * Atualiza valores dos componentes do formGroup
215
- * @param values - Valores para atualização
216
- */
217
- setFormValues(values) {
218
- this.onSetFormValues = true;
219
- this.formGroup.patchValue(values, { emitEvent: false });
220
- this.onSetFormValues = false;
221
- }
222
- /**
223
- * Seta o título do popup
224
- */
225
- setTitlePopup() {
226
- if (this.popup) {
227
- if (this.dynamicDialogConfig)
228
- this.dynamicDialogConfig.header = this.dadosTela?.tituloForm;
229
- }
230
- }
231
- /**
232
- * Atualiza o validador de um componente do formGroup
233
- * @param controName - Nome do controle
234
- * @param validators - Regra de validação
235
- */
236
- setValidators(controName, validators) {
237
- FormService.setValidators(this.formGroup, controName, validators);
238
- }
239
- /**
240
- * Dispara os métodos de validações do formulário
241
- * @returns - True/False
242
- */
243
- validateForm() {
244
- let valid = false;
245
- if (this.formGroup && this.formGroup.valid) {
246
- valid = true;
247
- }
248
- else {
249
- this.isAccordionExpanded = true;
250
- this.invalidForm();
251
- if (this.dadosTela?.mensagemValidacao) {
252
- this.notificationService.dialog({
253
- type: 'alert',
254
- message: 'Verifique os campos obrigatórios.',
255
- });
256
- }
257
- }
258
- return valid;
259
- }
260
- }
261
- BaseComponentCrudForm.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: BaseComponentCrudForm, deps: [{ token: i1.DialogService }, { token: i2.NotificationService }, { token: i3.ActivatedRoute }, { token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
262
- BaseComponentCrudForm.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: BaseComponentCrudForm, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: BaseComponentCrudForm, decorators: [{
264
- type: Component,
265
- args: [{
266
- template: ''
267
- }]
268
- }], ctorParameters: function () { return [{ type: i1.DialogService }, { type: i2.NotificationService }, { type: i3.ActivatedRoute }, { type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }, { type: i3.Router }]; } });
269
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21wb25lbnQtY3J1ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2FwaS9iYXNlLWNvbXBvbmVudHMvYmFzZS1jb21wb25lbnQtY3J1ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxTQUFTLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQWMsYUFBYSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWF2RCxNQUFNLE9BQWdCLHFCQUFzQixTQUFRLGlCQUFpQjtJQWdCbkUsWUFDRSxhQUE0QixFQUM1QixtQkFBd0MsRUFDOUIsY0FBOEIsRUFDOUIsZ0JBQWtDLEVBQ2xDLG1CQUF3QyxFQUN4QyxNQUFjO1FBQ3hCLEtBQUssQ0FFRCxhQUFhLEVBQ2IsbUJBQW1CLENBQ3BCLENBQUM7UUFSTSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFwQmhCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsY0FBUyxHQUFjLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLFlBQU8sR0FBaUIsRUFBRSxDQUFDO1FB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QGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSBcInByaW1lbmcvZHluYW1pY2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgZmluYWxpemUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL2FjdGlvbi1pdGVtXCI7XHJcbmltcG9ydCB7IEJhc2VDb21wb25lbnRDcnVkIH0gZnJvbSBcIi4vYmFzZS1jb21wb25lbnQtY3J1ZFwiO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYWRvc1RlbGEge1xyXG4gIHN1YlRpdHVsb0Zvcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICB0aXR1bG9Gb3JtOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcm90YUxpc3Rhcjogc3RyaW5nO1xyXG4gIG1lbnNhZ2VtVmFsaWRhY2FvOiBib29sZWFuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJ1xyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbXBvbmVudENydWRGb3JtIGV4dGVuZHMgQmFzZUNvbXBvbmVudENydWQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHByb3RlY3RlZCBpc0FjY29yZGlvbkV4cGFuZGVkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIGlzTmV3UmVnaXN0cnkgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgaXNTYXZlTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBpc1ZpZXcgPSBmYWxzZTtcclxuXHJcbiAgcHJvdGVjdGVkIGZvcm1Hcm91cDogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgcHJvdGVjdGVkIGFjdGlvbnM6IEFjdGlvbkl0ZW1bXSA9IFtdO1xyXG5cclxuICBwcm90ZWN0ZWQgZGFkb3NUZWxhOiBEYWRvc1RlbGEgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIHBvcHVwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIHJlZ2lzdHJ5OiBhbnkgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIG9uU2V0Rm9ybVZhbHVlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByb3RlY3RlZCBkeW5hbWljRGlhbG9nUmVmOiBEeW5hbWljRGlhbG9nUmVmLFxyXG4gICAgcHJvdGVjdGVkIGR5bmFtaWNEaWFsb2dDb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXHJcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIpIHtcclxuICAgIHN1cGVyXHJcbiAgICAgIChcclxuICAgICAgICBkaWFsb2dTZXJ2aWNlLFxyXG4gICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2VcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIHBhcmEgY29uZmlndXJhw6fDo28gZG8gZm9ybVxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNvbmZpZ3VyZUZvcm0oKTogdm9pZDtcclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSBvIGNhcnJlZ2FtZW50byBkbyBmb3JtXHJcbiAgICogQHBhcmFtIGlkXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgbG9hZEZvcm0oaWQ6IGFueSk6IHZvaWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIHBhcmEgc2FsdmFtZW50byBkb3MgZGFkb3NcclxuICAgKi9cclxuICBhYnN0cmFjdCBzYXZlKCk6IHZvaWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIHBhcmEgdHJhdGFtZW50byBkYXMgbm90aWZpY2HDp8O1ZXMgZG8gYmFja2VuZFxyXG4gICAqIEBwYXJhbSBlcnIgLSBOb3RpZmljYcOnw6NvXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGJhY2tlbmRFcnJvcihlcnI6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RFcnJvcihlcnIuZXJyb3IuaXRlbTJbMF0ubWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGVyci5zdGF0dXMgPT0gNDAwKSB7XHJcbiAgICAgICAgLy8gRXJyb3MgZGUgdmFsaWRhw6fDo28gZGUgZG9tw61uaW8gZG8gYmFja2VuZFxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVyci5lcnJvcikpIHtcclxuICAgICAgICAgIGlmIChlcnIuZXJyb3I/Lmxlbmd0aCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGVyci5lcnJvci5sZW5ndGggPT0gMSAmJiBlcnIuZXJyb3JbMF0ua2V5ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0RXJyb3IoZXJyLmVycm9yWzBdLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkRm9ybShlcnIuZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVyci5lcnJvcj8udGl0bGUpIHtcclxuICAgICAgICAgIC8vIEVycm8gZGUganNvbiBubyBiYWNrZW5kXHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RFcnJvcihlcnIuZXJyb3IudGl0bGUpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChlcnIuc3RhdHVzID09IDQxNSkge1xyXG4gICAgICAgIGlmIChlcnIuZXJyb3I/LnRpdGxlKSB7XHJcbiAgICAgICAgICAvLyBFcnJvIGRlIGpzb24gbm8gYmFja2VuZFxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0RXJyb3IoZXJyLmVycm9yLnRpdGxlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFF1YWxxdWVyIG91dHJvIHRpcG8gZGUgZXJybyBxdWUgdGVuaGEgbWVuc2FnZW1cclxuICAgICAgaWYgKGVyci5tZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0RXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNw6l0b2RvIGRpc3BhcmFkbyBhbyBjbGljYXIgbm8gYm90w6NvIGRlIGNhbmNlbGFtZW50b1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UucXVlc3Rpb24oe1xyXG4gICAgICB0eXBlOiAncXVlc3Rpb24nLFxyXG4gICAgICBtZXNzYWdlOiAnRGVzZWphIGNhbmNlbGFyIGEgb3BlcmHDp8Ojbz8nLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlTGlzdCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBob3V2ZXJhbSBhbHRlcmHDp8O1ZXMgbm9zIGNvbXBvbmVudGVzIGRvIGZvcm1Db250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xzIC0gTm9tZXMgZG8gY29udHJvbGVzIG5vIGZvcm1Hcm91cFxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZGV0ZWN0Rm9ybUNvbnRyb2xDaGFuZ2VzKGNvbnRyb2xzOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbnRyb2xMaXN0OiBPYnNlcnZhYmxlPGFueT5bXSA9IFtdO1xyXG4gICAgY29udHJvbHMuZm9yRWFjaChjb250cm9sTmFtZSA9PiBjb250cm9sTGlzdC5wdXNoKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS52YWx1ZUNoYW5nZXMpKTtcclxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KGNvbnRyb2xMaXN0KS5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5vblNldEZvcm1WYWx1ZXMpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcmVzcG9uc8OhdmVsIHBvciBkZXNhYmlsaXRhciB1bSBjb21wb25lbnRlXHJcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIC0gTm9tZSBkbyBjb250cm9sZSBubyBmb3JtR3JvdXBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZGlzYWJsZUNvbXBvbmVudChjb250cm9sTmFtZTogc3RyaW5nKSB7XHJcbiAgICBGb3JtU2VydmljZS5kaXNhYmxlQ29udHJvbCh0aGlzLmZvcm1Hcm91cCwgY29udHJvbE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyByZXNwb25zw6F2ZWwgcG9yIGxpbXBhciBlIGRlc2FiaWxpdGFyIHVtIGNvbXBvbmVudGVcclxuICAgKiBAcGFyYW0gY29udHJvbE5hbWUgLSBOb21lIGRvIGNvbnRyb2xlIG5vIGZvcm1Hcm91cFxyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGRlZmF1bHRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZGlzYWJsZUFuZENsZWFyQ29tcG9uZW50KGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XHJcbiAgICBGb3JtU2VydmljZS5kaXNhYmxlQW5kQ2xlYXJDb250cm9sKHRoaXMuZm9ybUdyb3VwLCBjb250cm9sTmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyByZXNwb25zw6F2ZWwgcG9yIGhhYmlsaXRhciB1bSBjb21wb25lbnRlXHJcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIC0gTm9tZSBkbyBjb250cm9sZSBubyBmb3JtR3JvdXBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZW5hYmxlQ29tcG9uZW50KGNvbnRyb05hbWU6IHN0cmluZykge1xyXG4gICAgRm9ybVNlcnZpY2UuZW5hYmxlQ29udHJvbCh0aGlzLmZvcm1Hcm91cCwgY29udHJvTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNw6l0b2RvIHF1ZSByZXRvcm5hIG8gdmFsb3IgZGUgdW0gY29tcG9uZW50ZVxyXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZSAtIE5vbWUgZG8gY29udHJvbGUgbm8gZm9ybUdyb3VwXHJcbiAgICogQHJldHVybnMgLSBWYWxvclxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRGb3JtVmFsdWU8VD4oY29udHJvbE5hbWU6IHN0cmluZyk6IFQge1xyXG4gICAgcmV0dXJuIEZvcm1TZXJ2aWNlLmdldEZvcm1WYWx1ZTxUPih0aGlzLmZvcm1Hcm91cCwgY29udHJvbE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmVyaWZpY2Egc2UgbyBjb21wb25lbnRlIHBvc3N1aSBlcnJvXHJcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIC0gTm9tZSBkbyBjb250cm9sZSBubyBmb3JtR3JvdXBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgaGFzQ29udHJvbEVycm9yKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGVycm9yQ29kZT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEZvcm1TZXJ2aWNlLmhhc0NvbnRyb2xFcnJvcih0aGlzLmZvcm1Hcm91cCwgY29udHJvbE5hbWUsIGVycm9yQ29kZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRhIGluY29uc2lzdMOqbmNpYXMgcGFyYSBvIGZvbXVsw6FyaW9cclxuICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTGlzdGEgZGUgbm90aWZpY2HDp8O1ZXNcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgaW52YWxpZEZvcm0obm90aWZpY2F0aW9uPzogYW55KSB7XHJcbiAgICBGb3JtU2VydmljZS5pbnZhbGlkRm9ybSh0aGlzLmZvcm1Hcm91cCwgbm90aWZpY2F0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcmVzcG9uc8OhdmVsIHBlbG8gY2FycmVnYW1lbnRvIGRhIHRlbGFcclxuICAgKiBAcGFyYW0gb2JzIC0gT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcGVsbyBzYWx2YW1lbnRvIGRvcyBkYWRvc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBsb2FkRGF0YTxUPihvYnM6IE9ic2VydmFibGU8YW55Pikge1xyXG4gICAgb2JzXHJcbiAgICAgIC8vLnBpcGUobG9hZGluZygpKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmlzTmV3UmVnaXN0cnkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gZGF0YSBhcyBUO1xyXG4gICAgICAgIHRoaXMuc2V0Rm9ybVZhbHVlcyh0aGlzLnJlZ2lzdHJ5KTtcclxuICAgICAgICB0aGlzLmxvYWRHcmlkcygpO1xyXG4gICAgICAgIHRoaXMuc2V0VGl0bGVQb3B1cCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkR3JpZHMoKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSByZXRvcm5hciBhIGxpc3RhXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG5hdmlnYXRlTGlzdChpZDogYW55ID0gbnVsbCkge1xyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgdGhpcy5keW5hbWljRGlhbG9nUmVmLmNsb3NlKGlkKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZGFkb3NUZWxhPy5yb3RhTGlzdGFyKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmRhZG9zVGVsYS5yb3RhTGlzdGFyXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5keW5hbWljRGlhbG9nUmVmKSB7XHJcbiAgICAgIHRoaXMuZHluYW1pY0RpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb25maWd1cmVGb3JtKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cCA9IHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZz8uZGF0YT8ucG9wdXAgfHwgZmFsc2U7XHJcblxyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocGFyYW1zWydpZCddKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRm9ybShwYXJhbXNbJ2lkJ10pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZz8uZGF0YT8uaWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRGb3JtKHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZy5kYXRhLmlkKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTmV3UmVnaXN0cnkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9hZEdyaWRzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRUaXRsZVBvcHVwKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSBzYWx2YXIgZGFkb3NcclxuICAgKiBAcGFyYW0gb2JzIC0gT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcGVsbyBzYWx2YW1lbnRvIGRvcyBkYWRvc1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBzYXZlRGF0YShvYnM6IE9ic2VydmFibGU8YW55Pikge1xyXG4gICAgb2JzXHJcbiAgICAgIC5waXBlKChzcmM6IE9ic2VydmFibGU8YW55PikgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNTYXZlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHNyYy5waXBlKGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNTYXZlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RTdWNjZXNzKHJlcy5pdGVtMlswXS5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGVMaXN0KHJlcy5pdGVtMSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuYmFja2VuZEVycm9yKGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBzZSBhdHVhbGl6YSBvIHZhbG9yIGRlIHVtIGNvbXBvbmVudGUgZG8gZm9ybUdyb3VwXHJcbiAgICogQHBhcmFtIGNvbnRyb05hbWUgLSBOb21lIGRvIGNvbnRyb2xlXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgcGFyYSBhdHVhbGl6YcOnw6NvXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHNldENvbnRyb2xWYWx1ZShjb250cm9OYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIEZvcm1TZXJ2aWNlLnNldENvbnRyb2xWYWx1ZSh0aGlzLmZvcm1Hcm91cCwgY29udHJvTmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR1YWxpemEgdmFsb3JlcyBkb3MgY29tcG9uZW50ZXMgZG8gZm9ybUdyb3VwXHJcbiAgICogQHBhcmFtIHZhbHVlcyAtIFZhbG9yZXMgcGFyYSBhdHVhbGl6YcOnw6NvXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHNldEZvcm1WYWx1ZXModmFsdWVzOiBhbnkpIHtcclxuICAgIHRoaXMub25TZXRGb3JtVmFsdWVzID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodmFsdWVzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLm9uU2V0Rm9ybVZhbHVlcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0YSBvIHTDrXR1bG8gZG8gcG9wdXBcclxuICAgKi9cclxuICBwcml2YXRlIHNldFRpdGxlUG9wdXAoKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICBpZiAodGhpcy5keW5hbWljRGlhbG9nQ29uZmlnKVxyXG4gICAgICAgIHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZy5oZWFkZXIgPSB0aGlzLmRhZG9zVGVsYT8udGl0dWxvRm9ybTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dWFsaXphIG8gdmFsaWRhZG9yIGRlIHVtIGNvbXBvbmVudGUgZG8gZm9ybUdyb3VwXHJcbiAgICogQHBhcmFtIGNvbnRyb05hbWUgLSBOb21lIGRvIGNvbnRyb2xlXHJcbiAgICogQHBhcmFtIHZhbGlkYXRvcnMgLSBSZWdyYSBkZSB2YWxpZGHDp8Ojb1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBzZXRWYWxpZGF0b3JzKGNvbnRyb05hbWU6IHN0cmluZywgdmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIHwgbnVsbCkge1xyXG4gICAgRm9ybVNlcnZpY2Uuc2V0VmFsaWRhdG9ycyh0aGlzLmZvcm1Hcm91cCwgY29udHJvTmFtZSwgdmFsaWRhdG9ycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXJhIG9zIG3DqXRvZG9zIGRlIHZhbGlkYcOnw7VlcyBkbyBmb3JtdWzDoXJpb1xyXG4gICAqIEByZXR1cm5zIC0gVHJ1ZS9GYWxzZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAgJiYgdGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgdmFsaWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0FjY29yZGlvbkV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbnZhbGlkRm9ybSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGFkb3NUZWxhPy5tZW5zYWdlbVZhbGlkYWNhbykge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5kaWFsb2coe1xyXG4gICAgICAgICAgdHlwZTogJ2FsZXJ0JyxcclxuICAgICAgICAgIG1lc3NhZ2U6ICdWZXJpZmlxdWUgb3MgY2FtcG9zIG9icmlnYXTDs3Jpb3MuJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWxpZDtcclxuICB9XHJcbn1cclxuIl19
1
+ import { Component } from "@angular/core";
2
+ import { FormGroup } from "@angular/forms";
3
+ import { combineLatest, filter, finalize } from "rxjs";
4
+ import { BaseComponentCrud } from "./base-component-crud";
5
+ import { FormService } from "../services/form.service";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "primeng/dynamicdialog";
8
+ import * as i2 from "../services/notification.service";
9
+ import * as i3 from "@angular/router";
10
+ export class BaseComponentCrudForm extends BaseComponentCrud {
11
+ constructor(dialogService, notificationService, activatedRoute, dynamicDialogRef, dynamicDialogConfig, router) {
12
+ super(dialogService, notificationService);
13
+ this.activatedRoute = activatedRoute;
14
+ this.dynamicDialogRef = dynamicDialogRef;
15
+ this.dynamicDialogConfig = dynamicDialogConfig;
16
+ this.router = router;
17
+ this.isAccordionExpanded = false;
18
+ this.isNewRegistry = false;
19
+ this.isSaveLoading = false;
20
+ this.isView = false;
21
+ this.formGroup = new FormGroup({});
22
+ this.actions = [];
23
+ this.popup = false;
24
+ this.registry = null;
25
+ this.onSetFormValues = false;
26
+ }
27
+ /**
28
+ * Método disparado para tratamento das notificações do backend
29
+ * @param err - Notificação
30
+ */
31
+ backendError(err) {
32
+ if (err) {
33
+ if (err.status == 404) {
34
+ this.notificationService.toastError(err.error.item2[0].message);
35
+ return;
36
+ }
37
+ else if (err.status == 400) {
38
+ // Erros de validação de domínio do backend
39
+ if (Array.isArray(err.error)) {
40
+ if (err.error?.length) {
41
+ if (err.error.length == 1 && err.error[0].key == '') {
42
+ this.notificationService.toastError(err.error[0].message);
43
+ return;
44
+ }
45
+ this.invalidForm(err.error);
46
+ return;
47
+ }
48
+ }
49
+ else if (err.error?.title) {
50
+ // Erro de json no backend
51
+ this.notificationService.toastError(err.error.title);
52
+ return;
53
+ }
54
+ }
55
+ else if (err.status == 415) {
56
+ if (err.error?.title) {
57
+ // Erro de json no backend
58
+ this.notificationService.toastError(err.error.title);
59
+ return;
60
+ }
61
+ }
62
+ // Qualquer outro tipo de erro que tenha mensagem
63
+ if (err.message) {
64
+ this.notificationService.toastError(err.message);
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Método disparado ao clicar no botão de cancelamento
70
+ */
71
+ cancel() {
72
+ this.notificationService.question({
73
+ type: 'question',
74
+ message: 'Deseja cancelar a operação?',
75
+ accept: () => {
76
+ this.navigateList();
77
+ },
78
+ });
79
+ }
80
+ /**
81
+ * Verifica se houveram alterações nos componentes do formControl
82
+ * @param controls - Nomes do controles no formGroup
83
+ * @returns Observable
84
+ */
85
+ detectFormControlChanges(controls) {
86
+ const controlList = [];
87
+ controls.forEach(controlName => controlList.push(this.formGroup.controls[controlName].valueChanges));
88
+ return combineLatest(controlList).pipe(filter(() => !this.onSetFormValues));
89
+ }
90
+ /**
91
+ * Método responsável por desabilitar um componente
92
+ * @param controlName - Nome do controle no formGroup
93
+ */
94
+ disableComponent(controlName) {
95
+ FormService.disableControl(this.formGroup, controlName);
96
+ }
97
+ /**
98
+ * Método responsável por limpar e desabilitar um componente
99
+ * @param controlName - Nome do controle no formGroup
100
+ * @param value - Valor default
101
+ */
102
+ disableAndClearComponent(controlName, value) {
103
+ FormService.disableAndClearControl(this.formGroup, controlName, value);
104
+ }
105
+ /**
106
+ * Método responsável por habilitar um componente
107
+ * @param controlName - Nome do controle no formGroup
108
+ */
109
+ enableComponent(controName) {
110
+ FormService.enableControl(this.formGroup, controName);
111
+ }
112
+ /**
113
+ * Método que retorna o valor de um componente
114
+ * @param controlName - Nome do controle no formGroup
115
+ * @returns - Valor
116
+ */
117
+ getFormValue(controlName) {
118
+ return FormService.getFormValue(this.formGroup, controlName);
119
+ }
120
+ /**
121
+ * Verifica se o componente possui erro
122
+ * @param controlName - Nome do controle no formGroup
123
+ */
124
+ hasControlError(controlName, errorCode) {
125
+ return FormService.hasControlError(this.formGroup, controlName, errorCode);
126
+ }
127
+ /**
128
+ * Seta inconsistências para o fomulário
129
+ * @param notification - Lista de notificações
130
+ */
131
+ invalidForm(notification) {
132
+ FormService.invalidForm(this.formGroup, notification);
133
+ }
134
+ /**
135
+ * Método responsável pelo carregamento da tela
136
+ * @param obs - Observable responsável pelo salvamento dos dados
137
+ */
138
+ loadData(obs) {
139
+ obs
140
+ //.pipe(loading())
141
+ .subscribe((data) => {
142
+ this.isNewRegistry = false;
143
+ this.registry = data;
144
+ this.setFormValues(this.registry);
145
+ this.loadGrids();
146
+ this.setTitlePopup();
147
+ });
148
+ }
149
+ loadGrids() { }
150
+ /**
151
+ * Método disparado para retornar a lista
152
+ */
153
+ navigateList(id = null) {
154
+ if (this.popup) {
155
+ this.dynamicDialogRef.close(id);
156
+ }
157
+ else if (this.dadosTela?.rotaListar) {
158
+ this.router.navigate([this.dadosTela.rotaListar]);
159
+ }
160
+ }
161
+ ngOnDestroy() {
162
+ if (this.dynamicDialogRef) {
163
+ this.dynamicDialogRef.close();
164
+ }
165
+ }
166
+ ngOnInit() {
167
+ this.configureForm();
168
+ this.popup = this.dynamicDialogConfig?.data?.popup || false;
169
+ this.activatedRoute.params.subscribe((params) => {
170
+ if (params['id']) {
171
+ this.loadForm(params['id']);
172
+ }
173
+ else if (this.dynamicDialogConfig?.data?.id) {
174
+ this.loadForm(this.dynamicDialogConfig.data.id);
175
+ }
176
+ else {
177
+ this.isNewRegistry = true;
178
+ this.loadGrids();
179
+ this.setTitlePopup();
180
+ }
181
+ });
182
+ }
183
+ /**
184
+ * Método disparado para salvar dados
185
+ * @param obs - Observable responsável pelo salvamento dos dados
186
+ */
187
+ saveData(obs) {
188
+ obs
189
+ .pipe((src) => {
190
+ this.isSaveLoading = true;
191
+ return src.pipe(finalize(() => {
192
+ this.isSaveLoading = false;
193
+ }));
194
+ })
195
+ .subscribe({
196
+ next: (res) => {
197
+ this.notificationService.toastSuccess(res.item2[0].message);
198
+ this.navigateList(res.item1);
199
+ },
200
+ error: (e) => {
201
+ this.backendError(e);
202
+ },
203
+ });
204
+ }
205
+ /**
206
+ * Método se atualiza o valor de um componente do formGroup
207
+ * @param controName - Nome do controle
208
+ * @param value - Valor para atualização
209
+ */
210
+ setControlValue(controName, value) {
211
+ FormService.setControlValue(this.formGroup, controName, value);
212
+ }
213
+ /**
214
+ * Atualiza valores dos componentes do formGroup
215
+ * @param values - Valores para atualização
216
+ */
217
+ setFormValues(values) {
218
+ this.onSetFormValues = true;
219
+ this.formGroup.patchValue(values, { emitEvent: false });
220
+ this.onSetFormValues = false;
221
+ }
222
+ /**
223
+ * Seta o título do popup
224
+ */
225
+ setTitlePopup() {
226
+ if (this.popup) {
227
+ if (this.dynamicDialogConfig)
228
+ this.dynamicDialogConfig.header = this.dadosTela?.tituloForm;
229
+ }
230
+ }
231
+ /**
232
+ * Atualiza o validador de um componente do formGroup
233
+ * @param controName - Nome do controle
234
+ * @param validators - Regra de validação
235
+ */
236
+ setValidators(controName, validators) {
237
+ FormService.setValidators(this.formGroup, controName, validators);
238
+ }
239
+ /**
240
+ * Dispara os métodos de validações do formulário
241
+ * @returns - True/False
242
+ */
243
+ validateForm() {
244
+ let valid = false;
245
+ if (this.formGroup && this.formGroup.valid) {
246
+ valid = true;
247
+ }
248
+ else {
249
+ this.isAccordionExpanded = true;
250
+ this.invalidForm();
251
+ if (this.dadosTela?.mensagemValidacao) {
252
+ this.notificationService.dialog({
253
+ type: 'alert',
254
+ message: 'Verifique os campos obrigatórios.',
255
+ });
256
+ }
257
+ }
258
+ return valid;
259
+ }
260
+ }
261
+ BaseComponentCrudForm.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: BaseComponentCrudForm, deps: [{ token: i1.DialogService }, { token: i2.NotificationService }, { token: i3.ActivatedRoute }, { token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
262
+ BaseComponentCrudForm.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: BaseComponentCrudForm, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: BaseComponentCrudForm, decorators: [{
264
+ type: Component,
265
+ args: [{
266
+ template: ''
267
+ }]
268
+ }], ctorParameters: function () { return [{ type: i1.DialogService }, { type: i2.NotificationService }, { type: i3.ActivatedRoute }, { type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }, { type: i3.Router }]; } });
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21wb25lbnQtY3J1ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2FwaS9iYXNlLWNvbXBvbmVudHMvYmFzZS1jb21wb25lbnQtY3J1ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxTQUFTLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQWMsYUFBYSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWF2RCxNQUFNLE9BQWdCLHFCQUFzQixTQUFRLGlCQUFpQjtJQWdCbkUsWUFDRSxhQUE0QixFQUM1QixtQkFBd0MsRUFDOUIsY0FBOEIsRUFDOUIsZ0JBQWtDLEVBQ2xDLG1CQUF3QyxFQUN4QyxNQUFjO1FBQ3hCLEtBQUssQ0FFRCxhQUFhLEVBQ2IsbUJBQW1CLENBQ3BCLENBQUM7UUFSTSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFwQmhCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsY0FBUyxHQUFjLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLFlBQU8sR0FBaUIsRUFBRSxDQUFDO1FB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QGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tIFwicHJpbWVuZy9keW5hbWljZGlhbG9nXCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIGZpbmFsaXplIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL2FjdGlvbi1pdGVtXCI7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50Q3J1ZCB9IGZyb20gXCIuL2Jhc2UtY29tcG9uZW50LWNydWRcIjtcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZVwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhZG9zVGVsYSB7XG4gIHN1YlRpdHVsb0Zvcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGl0dWxvRm9ybTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByb3RhTGlzdGFyOiBzdHJpbmc7XG4gIG1lbnNhZ2VtVmFsaWRhY2FvOiBib29sZWFuXG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbXBvbmVudENydWRGb3JtIGV4dGVuZHMgQmFzZUNvbXBvbmVudENydWQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHJvdGVjdGVkIGlzQWNjb3JkaW9uRXhwYW5kZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzTmV3UmVnaXN0cnkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzU2F2ZUxvYWRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzVmlldyA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBwcm90ZWN0ZWQgYWN0aW9uczogQWN0aW9uSXRlbVtdID0gW107XG5cbiAgcHJvdGVjdGVkIGRhZG9zVGVsYTogRGFkb3NUZWxhIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlZ2lzdHJ5OiBhbnkgPSBudWxsO1xuXG4gIHByaXZhdGUgb25TZXRGb3JtVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJvdGVjdGVkIGR5bmFtaWNEaWFsb2dSZWY6IER5bmFtaWNEaWFsb2dSZWYsXG4gICAgcHJvdGVjdGVkIGR5bmFtaWNEaWFsb2dDb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyKSB7XG4gICAgc3VwZXJcbiAgICAgIChcbiAgICAgICAgZGlhbG9nU2VydmljZSxcbiAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIGRpc3BhcmFkbyBwYXJhIGNvbmZpZ3VyYcOnw6NvIGRvIGZvcm1cbiAgICovXG4gIGFic3RyYWN0IGNvbmZpZ3VyZUZvcm0oKTogdm9pZDtcblxuICAvKipcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSBvIGNhcnJlZ2FtZW50byBkbyBmb3JtXG4gICAqIEBwYXJhbSBpZFxuICAgKi9cbiAgYWJzdHJhY3QgbG9hZEZvcm0oaWQ6IGFueSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIHBhcmEgc2FsdmFtZW50byBkb3MgZGFkb3NcbiAgICovXG4gIGFic3RyYWN0IHNhdmUoKTogdm9pZDtcblxuICAvKipcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSB0cmF0YW1lbnRvIGRhcyBub3RpZmljYcOnw7VlcyBkbyBiYWNrZW5kXG4gICAqIEBwYXJhbSBlcnIgLSBOb3RpZmljYcOnw6NvXG4gICAqL1xuICBwcm90ZWN0ZWQgYmFja2VuZEVycm9yKGVycjogYW55KTogdm9pZCB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdEVycm9yKGVyci5lcnJvci5pdGVtMlswXS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXJyLnN0YXR1cyA9PSA0MDApIHtcbiAgICAgICAgLy8gRXJyb3MgZGUgdmFsaWRhw6fDo28gZGUgZG9tw61uaW8gZG8gYmFja2VuZFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlcnIuZXJyb3IpKSB7XG4gICAgICAgICAgaWYgKGVyci5lcnJvcj8ubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIGlmIChlcnIuZXJyb3IubGVuZ3RoID09IDEgJiYgZXJyLmVycm9yWzBdLmtleSA9PSAnJykge1xuICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RFcnJvcihlcnIuZXJyb3JbMF0ubWVzc2FnZSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkRm9ybShlcnIuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnIuZXJyb3I/LnRpdGxlKSB7XG4gICAgICAgICAgLy8gRXJybyBkZSBqc29uIG5vIGJhY2tlbmRcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RFcnJvcihlcnIuZXJyb3IudGl0bGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXJyLnN0YXR1cyA9PSA0MTUpIHtcbiAgICAgICAgaWYgKGVyci5lcnJvcj8udGl0bGUpIHtcbiAgICAgICAgICAvLyBFcnJvIGRlIGpzb24gbm8gYmFja2VuZFxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdEVycm9yKGVyci5lcnJvci50aXRsZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFF1YWxxdWVyIG91dHJvIHRpcG8gZGUgZXJybyBxdWUgdGVuaGEgbWVuc2FnZW1cbiAgICAgIGlmIChlcnIubWVzc2FnZSkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIGFvIGNsaWNhciBubyBib3TDo28gZGUgY2FuY2VsYW1lbnRvXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsKCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5xdWVzdGlvbih7XG4gICAgICB0eXBlOiAncXVlc3Rpb24nLFxuICAgICAgbWVzc2FnZTogJ0Rlc2VqYSBjYW5jZWxhciBhIG9wZXJhw6fDo28/JyxcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICB0aGlzLm5hdmlnYXRlTGlzdCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzZSBob3V2ZXJhbSBhbHRlcmHDp8O1ZXMgbm9zIGNvbXBvbmVudGVzIGRvIGZvcm1Db250cm9sXG4gICAqIEBwYXJhbSBjb250cm9scyAtIE5vbWVzIGRvIGNvbnRyb2xlcyBubyBmb3JtR3JvdXBcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZVxuICAgKi9cbiAgcHJvdGVjdGVkIGRldGVjdEZvcm1Db250cm9sQ2hhbmdlcyhjb250cm9sczogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgY29udHJvbExpc3Q6IE9ic2VydmFibGU8YW55PltdID0gW107XG4gICAgY29udHJvbHMuZm9yRWFjaChjb250cm9sTmFtZSA9PiBjb250cm9sTGlzdC5wdXNoKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS52YWx1ZUNoYW5nZXMpKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChjb250cm9sTGlzdCkucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMub25TZXRGb3JtVmFsdWVzKSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyByZXNwb25zw6F2ZWwgcG9yIGRlc2FiaWxpdGFyIHVtIGNvbXBvbmVudGVcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIC0gTm9tZSBkbyBjb250cm9sZSBubyBmb3JtR3JvdXBcbiAgICovXG4gIHByb3RlY3RlZCBkaXNhYmxlQ29tcG9uZW50KGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcbiAgICBGb3JtU2VydmljZS5kaXNhYmxlQ29udHJvbCh0aGlzLmZvcm1Hcm91cCwgY29udHJvbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcmVzcG9uc8OhdmVsIHBvciBsaW1wYXIgZSBkZXNhYmlsaXRhciB1bSBjb21wb25lbnRlXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZSAtIE5vbWUgZG8gY29udHJvbGUgbm8gZm9ybUdyb3VwXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGRlZmF1bHRcbiAgICovXG4gIHByb3RlY3RlZCBkaXNhYmxlQW5kQ2xlYXJDb21wb25lbnQoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcbiAgICBGb3JtU2VydmljZS5kaXNhYmxlQW5kQ2xlYXJDb250cm9sKHRoaXMuZm9ybUdyb3VwLCBjb250cm9sTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcmVzcG9uc8OhdmVsIHBvciBoYWJpbGl0YXIgdW0gY29tcG9uZW50ZVxuICAgKiBAcGFyYW0gY29udHJvbE5hbWUgLSBOb21lIGRvIGNvbnRyb2xlIG5vIGZvcm1Hcm91cFxuICAgKi9cbiAgcHJvdGVjdGVkIGVuYWJsZUNvbXBvbmVudChjb250cm9OYW1lOiBzdHJpbmcpIHtcbiAgICBGb3JtU2VydmljZS5lbmFibGVDb250cm9sKHRoaXMuZm9ybUdyb3VwLCBjb250cm9OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHF1ZSByZXRvcm5hIG8gdmFsb3IgZGUgdW0gY29tcG9uZW50ZVxuICAgKiBAcGFyYW0gY29udHJvbE5hbWUgLSBOb21lIGRvIGNvbnRyb2xlIG5vIGZvcm1Hcm91cFxuICAgKiBAcmV0dXJucyAtIFZhbG9yXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Rm9ybVZhbHVlPFQ+KGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gRm9ybVNlcnZpY2UuZ2V0Rm9ybVZhbHVlPFQ+KHRoaXMuZm9ybUdyb3VwLCBjb250cm9sTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2UgbyBjb21wb25lbnRlIHBvc3N1aSBlcnJvXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZSAtIE5vbWUgZG8gY29udHJvbGUgbm8gZm9ybUdyb3VwXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFzQ29udHJvbEVycm9yKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGVycm9yQ29kZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBGb3JtU2VydmljZS5oYXNDb250cm9sRXJyb3IodGhpcy5mb3JtR3JvdXAsIGNvbnRyb2xOYW1lLCBlcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldGEgaW5jb25zaXN0w6puY2lhcyBwYXJhIG8gZm9tdWzDoXJpb1xuICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTGlzdGEgZGUgbm90aWZpY2HDp8O1ZXNcbiAgICovXG4gIHByb3RlY3RlZCBpbnZhbGlkRm9ybShub3RpZmljYXRpb24/OiBhbnkpIHtcbiAgICBGb3JtU2VydmljZS5pbnZhbGlkRm9ybSh0aGlzLmZvcm1Hcm91cCwgbm90aWZpY2F0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHJlc3BvbnPDoXZlbCBwZWxvIGNhcnJlZ2FtZW50byBkYSB0ZWxhXG4gICAqIEBwYXJhbSBvYnMgLSBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwZWxvIHNhbHZhbWVudG8gZG9zIGRhZG9zXG4gICAqL1xuICBwdWJsaWMgbG9hZERhdGE8VD4ob2JzOiBPYnNlcnZhYmxlPGFueT4pIHtcbiAgICBvYnNcbiAgICAgIC8vLnBpcGUobG9hZGluZygpKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNOZXdSZWdpc3RyeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gZGF0YSBhcyBUO1xuICAgICAgICB0aGlzLnNldEZvcm1WYWx1ZXModGhpcy5yZWdpc3RyeSk7XG4gICAgICAgIHRoaXMubG9hZEdyaWRzKCk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGVQb3B1cCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEdyaWRzKCkgeyB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gZGlzcGFyYWRvIHBhcmEgcmV0b3JuYXIgYSBsaXN0YVxuICAgKi9cbiAgcHJvdGVjdGVkIG5hdmlnYXRlTGlzdChpZDogYW55ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLnBvcHVwKSB7XG4gICAgICB0aGlzLmR5bmFtaWNEaWFsb2dSZWYuY2xvc2UoaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmRhZG9zVGVsYT8ucm90YUxpc3Rhcikge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGFkb3NUZWxhLnJvdGFMaXN0YXJdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZHluYW1pY0RpYWxvZ1JlZikge1xuICAgICAgdGhpcy5keW5hbWljRGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29uZmlndXJlRm9ybSgpO1xuXG4gICAgdGhpcy5wb3B1cCA9IHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZz8uZGF0YT8ucG9wdXAgfHwgZmFsc2U7XG5cbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogYW55KSA9PiB7XG4gICAgICBpZiAocGFyYW1zWydpZCddKSB7XG4gICAgICAgIHRoaXMubG9hZEZvcm0ocGFyYW1zWydpZCddKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZz8uZGF0YT8uaWQpIHtcbiAgICAgICAgdGhpcy5sb2FkRm9ybSh0aGlzLmR5bmFtaWNEaWFsb2dDb25maWcuZGF0YS5pZCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5pc05ld1JlZ2lzdHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkR3JpZHMoKTtcbiAgICAgICAgdGhpcy5zZXRUaXRsZVBvcHVwKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBkaXNwYXJhZG8gcGFyYSBzYWx2YXIgZGFkb3NcbiAgICogQHBhcmFtIG9icyAtIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBlbG8gc2FsdmFtZW50byBkb3MgZGFkb3NcbiAgICovXG4gIHByb3RlY3RlZCBzYXZlRGF0YShvYnM6IE9ic2VydmFibGU8YW55Pikge1xuICAgIG9ic1xuICAgICAgLnBpcGUoKHNyYzogT2JzZXJ2YWJsZTxhbnk+KSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZlTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHJldHVybiBzcmMucGlwZShmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NhdmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pKTtcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0U3VjY2VzcyhyZXMuaXRlbTJbMF0ubWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZUxpc3QocmVzLml0ZW0xKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYWNrZW5kRXJyb3IoZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHNlIGF0dWFsaXphIG8gdmFsb3IgZGUgdW0gY29tcG9uZW50ZSBkbyBmb3JtR3JvdXBcbiAgICogQHBhcmFtIGNvbnRyb05hbWUgLSBOb21lIGRvIGNvbnRyb2xlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIHBhcmEgYXR1YWxpemHDp8Ojb1xuICAgKi9cbiAgcHJvdGVjdGVkIHNldENvbnRyb2xWYWx1ZShjb250cm9OYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBGb3JtU2VydmljZS5zZXRDb250cm9sVmFsdWUodGhpcy5mb3JtR3JvdXAsIGNvbnRyb05hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHVhbGl6YSB2YWxvcmVzIGRvcyBjb21wb25lbnRlcyBkbyBmb3JtR3JvdXBcbiAgICogQHBhcmFtIHZhbHVlcyAtIFZhbG9yZXMgcGFyYSBhdHVhbGl6YcOnw6NvXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0Rm9ybVZhbHVlcyh2YWx1ZXM6IGFueSkge1xuICAgIHRoaXMub25TZXRGb3JtVmFsdWVzID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHZhbHVlcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMub25TZXRGb3JtVmFsdWVzID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0YSBvIHTDrXR1bG8gZG8gcG9wdXBcbiAgICovXG4gIHByaXZhdGUgc2V0VGl0bGVQb3B1cCgpIHtcbiAgICBpZiAodGhpcy5wb3B1cCkge1xuICAgICAgaWYgKHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZylcbiAgICAgICAgdGhpcy5keW5hbWljRGlhbG9nQ29uZmlnLmhlYWRlciA9IHRoaXMuZGFkb3NUZWxhPy50aXR1bG9Gb3JtO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHVhbGl6YSBvIHZhbGlkYWRvciBkZSB1bSBjb21wb25lbnRlIGRvIGZvcm1Hcm91cFxuICAgKiBAcGFyYW0gY29udHJvTmFtZSAtIE5vbWUgZG8gY29udHJvbGVcbiAgICogQHBhcmFtIHZhbGlkYXRvcnMgLSBSZWdyYSBkZSB2YWxpZGHDp8Ojb1xuICAgKi9cbiAgcHJvdGVjdGVkIHNldFZhbGlkYXRvcnMoY29udHJvTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW10gfCBudWxsKSB7XG4gICAgRm9ybVNlcnZpY2Uuc2V0VmFsaWRhdG9ycyh0aGlzLmZvcm1Hcm91cCwgY29udHJvTmFtZSwgdmFsaWRhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGFyYSBvcyBtw6l0b2RvcyBkZSB2YWxpZGHDp8O1ZXMgZG8gZm9ybXVsw6FyaW9cbiAgICogQHJldHVybnMgLSBUcnVlL0ZhbHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVGb3JtKCk6IGJvb2xlYW4ge1xuICAgIGxldCB2YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwICYmIHRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICB2YWxpZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBY2NvcmRpb25FeHBhbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLmludmFsaWRGb3JtKCk7XG5cbiAgICAgIGlmICh0aGlzLmRhZG9zVGVsYT8ubWVuc2FnZW1WYWxpZGFjYW8pIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmRpYWxvZyh7XG4gICAgICAgICAgdHlwZTogJ2FsZXJ0JyxcbiAgICAgICAgICBtZXNzYWdlOiAnVmVyaWZpcXVlIG9zIGNhbXBvcyBvYnJpZ2F0w7NyaW9zLicsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxufVxuIl19