@smartsoft001/crud-shell-angular 1.2.71 → 1.2.75

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 (66) hide show
  1. package/{esm2020 → esm2022}/lib/+state/crud.effects.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/+state/crud.facade.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/components/components.module.mjs +51 -51
  4. package/{esm2020 → esm2022}/lib/components/export/export.component.mjs +4 -4
  5. package/esm2022/lib/components/filter/base/base.component.mjs +152 -0
  6. package/{esm2020 → esm2022}/lib/components/filter/check/check.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/components/filter/date/date.component.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/components/filter/date-time/date-time.component.mjs +4 -4
  9. package/{esm2020 → esm2022}/lib/components/filter/date-with-edit/date-with-edit.component.mjs +4 -4
  10. package/{esm2020 → esm2022}/lib/components/filter/filter.component.mjs +4 -4
  11. package/{esm2020 → esm2022}/lib/components/filter/flag/flag.component.mjs +4 -4
  12. package/{esm2020 → esm2022}/lib/components/filter/int/int.component.mjs +4 -4
  13. package/{esm2020 → esm2022}/lib/components/filter/radio/radio.component.mjs +4 -4
  14. package/esm2022/lib/components/filter/text/text.component.mjs +16 -0
  15. package/{esm2020 → esm2022}/lib/components/filters/filters.component.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/components/filters-config/filters-config.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/components/group/group.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/components/multiselect/multiselect.component.mjs +4 -4
  19. package/esm2022/lib/crud-full.module.mjs +103 -0
  20. package/{esm2020 → esm2022}/lib/crud.config.mjs +7 -7
  21. package/{esm2020 → esm2022}/lib/crud.module.mjs +33 -33
  22. package/{esm2020 → esm2022}/lib/factories/list-pagination/list-pagination.factory.mjs +4 -4
  23. package/esm2022/lib/pages/item/base/base.component.mjs +44 -0
  24. package/esm2022/lib/pages/item/item.component.mjs +395 -0
  25. package/{esm2020 → esm2022}/lib/pages/item/standard/standard.component.mjs +4 -4
  26. package/esm2022/lib/pages/list/base/base.component.mjs +23 -0
  27. package/{esm2020 → esm2022}/lib/pages/list/list.component.mjs +6 -6
  28. package/{esm2020 → esm2022}/lib/pages/list/standard/standard.component.mjs +6 -6
  29. package/{esm2020 → esm2022}/lib/pipes/form-options/form-options.pipe.mjs +4 -4
  30. package/{esm2020 → esm2022}/lib/pipes/pipes.module.mjs +5 -5
  31. package/{esm2020 → esm2022}/lib/services/crud/crud.service.mjs +4 -4
  32. package/{esm2020 → esm2022}/lib/services/list-group/list-group.service.mjs +4 -4
  33. package/{esm2020 → esm2022}/lib/services/page/page.service.mjs +4 -4
  34. package/{esm2020 → esm2022}/lib/services/search/search.service.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/services/socket/socket.service.mjs +7 -7
  36. package/{fesm2020 → fesm2022}/smartsoft001-crud-shell-angular.mjs +237 -237
  37. package/{fesm2020 → fesm2022}/smartsoft001-crud-shell-angular.mjs.map +1 -1
  38. package/lib/components/filter/base/base.component.d.ts +1 -1
  39. package/lib/components/filter/filter.component.d.ts +1 -1
  40. package/lib/components/filters/filters.component.d.ts +1 -1
  41. package/lib/components/group/group.component.d.ts +1 -1
  42. package/lib/models/interfaces.d.ts +1 -1
  43. package/lib/models/interfaces.d.ts.map +1 -1
  44. package/lib/pages/item/base/base.component.d.ts +1 -1
  45. package/lib/pages/list/base/base.component.d.ts +1 -1
  46. package/package.json +8 -14
  47. package/esm2020/lib/components/filter/base/base.component.mjs +0 -152
  48. package/esm2020/lib/components/filter/text/text.component.mjs +0 -16
  49. package/esm2020/lib/crud-full.module.mjs +0 -103
  50. package/esm2020/lib/pages/item/base/base.component.mjs +0 -44
  51. package/esm2020/lib/pages/item/item.component.mjs +0 -395
  52. package/esm2020/lib/pages/list/base/base.component.mjs +0 -23
  53. package/fesm2015/smartsoft001-crud-shell-angular.mjs +0 -2654
  54. package/fesm2015/smartsoft001-crud-shell-angular.mjs.map +0 -1
  55. /package/{esm2020 → esm2022}/index.mjs +0 -0
  56. /package/{esm2020 → esm2022}/lib/+state/crud.actions.mjs +0 -0
  57. /package/{esm2020 → esm2022}/lib/+state/crud.reducer.mjs +0 -0
  58. /package/{esm2020 → esm2022}/lib/+state/crud.selectors.mjs +0 -0
  59. /package/{esm2020 → esm2022}/lib/components/filter/index.mjs +0 -0
  60. /package/{esm2020 → esm2022}/lib/components/index.mjs +0 -0
  61. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  62. /package/{esm2020 → esm2022}/lib/models/interfaces.mjs +0 -0
  63. /package/{esm2020 → esm2022}/lib/pages/index.mjs +0 -0
  64. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/providers/model-possibilities/model-possibilities.provider.mjs +0 -0
  66. /package/{esm2020 → esm2022}/smartsoft001-crud-shell-angular.mjs +0 -0
@@ -1,395 +0,0 @@
1
- import { ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, NgModuleRef, QueryList, TemplateRef, ViewChild, ViewChildren, ViewContainerRef } from "@angular/core";
2
- import { ActivatedRoute, Router } from "@angular/router";
3
- import { BehaviorSubject } from "rxjs";
4
- import { Location } from "@angular/common";
5
- import { TranslateService } from "@ngx-translate/core";
6
- import { AuthService, CreateDynamicComponent, DetailsService, DynamicComponentLoader, DynamicContentDirective, StyleService, ToastService, } from "@smartsoft001/angular";
7
- import { getModelOptions } from "@smartsoft001/models";
8
- import { SpecificationService } from "@smartsoft001/utils";
9
- import { CrudFacade } from "../../+state/crud.facade";
10
- import { CrudFullConfig } from "../../crud.config";
11
- import { CrudService } from "../../services/crud/crud.service";
12
- import { IonContent } from "@ionic/angular";
13
- import { UntypedFormArray, UntypedFormControl, UntypedFormGroup } from "@angular/forms";
14
- import { ItemStandardComponent } from "./standard/standard.component";
15
- import { PageService } from "../../services/page/page.service";
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/router";
18
- import * as i2 from "../../+state/crud.facade";
19
- import * as i3 from "../../services/crud/crud.service";
20
- import * as i4 from "@smartsoft001/angular";
21
- import * as i5 from "@ngx-translate/core";
22
- import * as i6 from "../../crud.config";
23
- import * as i7 from "@angular/common";
24
- import * as i8 from "../../services/page/page.service";
25
- import * as i9 from "./standard/standard.component";
26
- export class ItemComponent extends CreateDynamicComponent('crud-item-page') {
27
- constructor(router, activeRoute, facade, service, route, dynamicComponentLoader, translateService, config, location, cd, authService, styleService, elementRef, toastService, pageService, moduleRef, componentFactoryResolver, detailsService) {
28
- super(cd, moduleRef, componentFactoryResolver);
29
- this.router = router;
30
- this.activeRoute = activeRoute;
31
- this.facade = facade;
32
- this.service = service;
33
- this.route = route;
34
- this.dynamicComponentLoader = dynamicComponentLoader;
35
- this.translateService = translateService;
36
- this.config = config;
37
- this.location = location;
38
- this.cd = cd;
39
- this.styleService = styleService;
40
- this.elementRef = elementRef;
41
- this.toastService = toastService;
42
- this.pageService = pageService;
43
- this.moduleRef = moduleRef;
44
- this.componentFactoryResolver = componentFactoryResolver;
45
- this.detailsService = detailsService;
46
- this.pageOptions = {
47
- title: "",
48
- showBackButton: true,
49
- hideMenuButton: true,
50
- };
51
- this.formValid = false;
52
- this.standardComponents = new QueryList();
53
- this.dynamicContents = new QueryList();
54
- this.selected$ = this.facade.selected$;
55
- }
56
- set mode(val) {
57
- this._mode = val;
58
- this.refreshDynamicInstance();
59
- }
60
- get mode() {
61
- return this._mode;
62
- }
63
- refreshProperties() {
64
- this.baseInstance.detailsOptions = this.detailsOptions;
65
- this.baseInstance.mode = this.mode;
66
- this.baseInstance.uniqueProvider = this.uniqueProvider;
67
- this.baseInstance.onPartialChange.pipe(this.takeUntilDestroy).subscribe(val => this.onPartialChange(val));
68
- this.baseInstance.onChange.pipe(this.takeUntilDestroy).subscribe(val => this.onChange(val));
69
- this.baseInstance.onValidChange.pipe(this.takeUntilDestroy).subscribe(val => this.onValidChange(val));
70
- }
71
- async ngOnInit() {
72
- this.detailsService.init();
73
- this.styleService.init(this.elementRef);
74
- this.pageService.checkPermissions();
75
- if (this.router.routerState.snapshot.url.split('?')[0].endsWith("/add")) {
76
- this.mode = "create";
77
- await this.generateComponents('add');
78
- }
79
- else {
80
- this.mode = this.config.details ? "details" : "update";
81
- if (this.mode === 'update') {
82
- await this.generateComponents('edit');
83
- }
84
- this.activeRoute.params
85
- .pipe(this.takeUntilDestroy)
86
- .subscribe(({ id }) => {
87
- this.facade.select(id);
88
- this.id = id;
89
- });
90
- this.activeRoute.queryParams
91
- .pipe(this.takeUntilDestroy)
92
- .subscribe(({ edit }) => {
93
- if (edit) {
94
- this.mode = "update";
95
- this.generateComponents('edit');
96
- }
97
- });
98
- }
99
- this.uniqueProvider = async (values) => {
100
- const filter = {
101
- query: [],
102
- };
103
- Object.keys(values).forEach((key) => {
104
- filter.query.push({
105
- key: key,
106
- value: values[key],
107
- type: "=",
108
- });
109
- });
110
- if (this.id) {
111
- filter.query.push({
112
- key: "id",
113
- value: this.id,
114
- type: "!=",
115
- });
116
- }
117
- const { totalCount } = await this.service.getList(filter).toPromise();
118
- return !totalCount;
119
- };
120
- if (this.config.details) {
121
- const compiledComponents = await this.dynamicComponentLoader.getComponentsWithFactories({
122
- components: [
123
- ...(this.config.details &&
124
- this.config.details["components"] &&
125
- this.config.details["components"].top
126
- ? [this.config.details["components"].top]
127
- : []),
128
- ...(this.config.details &&
129
- this.config.details["components"] &&
130
- this.config.details["components"].bottom
131
- ? [this.config.details["components"].bottom]
132
- : []),
133
- ],
134
- });
135
- this.detailsOptions = {
136
- type: this.config.type,
137
- item$: this.facade.selected$,
138
- cellPipe: this.config.details ? this.config.details.cellPipe : null,
139
- componentFactories: {
140
- top: this.config.details &&
141
- this.config.details["components"] &&
142
- this.config.details["components"].top
143
- ? compiledComponents.find((cc) => cc.component === this.config.details["components"].top).factory
144
- : null,
145
- bottom: this.config.details &&
146
- this.config.details["components"] &&
147
- this.config.details["components"].bottom
148
- ? compiledComponents.find((cc) => cc.component === this.config.details["components"].bottom).factory
149
- : null,
150
- },
151
- };
152
- }
153
- this.initPageOptions();
154
- this.facade.selected$.pipe(this.takeUntilDestroy).subscribe(item => {
155
- this.item = item;
156
- this.initPageOptions();
157
- this.cd.detectChanges();
158
- });
159
- this.refreshDynamicInstance();
160
- }
161
- async generateComponents(mode) {
162
- const compiledComponents = await this.dynamicComponentLoader.getComponentsWithFactories({
163
- components: [
164
- ...(this.config[mode] &&
165
- this.config[mode]["components"] &&
166
- this.config[mode]["components"].top
167
- ? [this.config[mode]["components"].top]
168
- : []),
169
- ...(this.config[mode] &&
170
- this.config[mode]["components"] &&
171
- this.config[mode]["components"].bottom
172
- ? [this.config[mode]["components"].bottom]
173
- : []),
174
- ],
175
- });
176
- const topComponentFactory = compiledComponents.find((cc) => cc.component === this.config[mode]["components"]?.top)?.factory;
177
- const bottomComponentFactory = compiledComponents.find((cc) => cc.component === this.config[mode]["components"]?.bottom)?.factory;
178
- if (!this.topTpl.get(0) && topComponentFactory) {
179
- this.topTpl.createComponent(topComponentFactory);
180
- }
181
- if (!this.bottomTpl.get(0) && bottomComponentFactory) {
182
- this.bottomTpl.createComponent(bottomComponentFactory);
183
- }
184
- }
185
- onPartialChange(val) {
186
- this.formPartialValue = val;
187
- }
188
- onChange(val) {
189
- this.formValue = val;
190
- }
191
- onValidChange(val) {
192
- this.formValid = val;
193
- }
194
- initPageOptions() {
195
- this.pageOptions = {
196
- ...this.pageOptions,
197
- title: this.getTitle(),
198
- endButtons: this.getButtons(),
199
- };
200
- }
201
- getButtons() {
202
- const options = getModelOptions(this.config.type);
203
- switch (this.mode) {
204
- case "create":
205
- return [
206
- {
207
- icon: "add",
208
- text: "add",
209
- handler: () => {
210
- if (this.checkFirstInvalid()) {
211
- return;
212
- }
213
- this.facade.create(this.formValue);
214
- this.location.back();
215
- },
216
- },
217
- ];
218
- case "update":
219
- return [
220
- ...(this.config.details
221
- ? [
222
- {
223
- icon: "close",
224
- text: "cancel",
225
- handler: () => {
226
- this.mode = "details";
227
- this.initPageOptions();
228
- this.topTpl.clear();
229
- this.bottomTpl.clear();
230
- },
231
- disabled$: new BehaviorSubject(false),
232
- },
233
- ]
234
- : []),
235
- {
236
- icon: "save",
237
- text: "save",
238
- handler: () => {
239
- if (this.checkFirstInvalid()) {
240
- return;
241
- }
242
- this.formPartialValue.id = this.id;
243
- this.facade.updatePartial(this.formPartialValue);
244
- if (this.config.details) {
245
- this.mode = "details";
246
- this.initPageOptions();
247
- }
248
- else {
249
- this.location.back();
250
- }
251
- },
252
- },
253
- ];
254
- case "details":
255
- return this.config.edit && (!options?.update?.enabled || SpecificationService.valid(this.item, options?.update?.enabled))
256
- ? [
257
- {
258
- icon: "create",
259
- text: "edit",
260
- handler: () => {
261
- this.mode = "update";
262
- this.generateComponents('edit');
263
- this.initPageOptions();
264
- },
265
- disabled$: new BehaviorSubject(false),
266
- },
267
- ]
268
- : [];
269
- }
270
- }
271
- getTitle() {
272
- const options = getModelOptions(this.config.type);
273
- const prefix = options.titleKey && this.item ? this.removeParagraph(this.item[options.titleKey]) + ' - ' : '';
274
- switch (this.mode) {
275
- case "create":
276
- return "add";
277
- case "update":
278
- return prefix + this.translateService.instant("change");
279
- case "details":
280
- return prefix + this.translateService.instant("details");
281
- }
282
- }
283
- removeParagraph(val) {
284
- if (!val || val.indexOf('<p>') !== 0)
285
- return val;
286
- const div = document.createElement("div");
287
- div.innerHTML = val;
288
- const item = div.querySelectorAll("p").item(0);
289
- return item.innerHTML;
290
- }
291
- checkFirstInvalid() {
292
- this.cd.detectChanges();
293
- const form = this.template === 'default'
294
- ? this.standardComponents.first.formComponents.first.form
295
- : this.baseInstance.formComponents.first.form;
296
- this.cd.detectChanges();
297
- if (form.valid)
298
- return false;
299
- const invalidFields = [];
300
- this.getInvalidFields(form, invalidFields, '');
301
- this.toastService.info({
302
- title: this.translateService.instant('INPUT.ERRORS.requires'),
303
- message: invalidFields.slice(0, 3).join('<br/>')
304
- });
305
- return true;
306
- }
307
- getInvalidFields(control, invalidFields, baseField, key = null) {
308
- if (control.valid)
309
- return;
310
- const field = key ? baseField + ' > ' + this.translateService.instant('MODEL.' + key) : baseField;
311
- if (control.errors?.customMessage) {
312
- invalidFields.push(field + ` (${control.errors.customMessage})`);
313
- return;
314
- }
315
- if (control instanceof UntypedFormControl) {
316
- invalidFields.push(field);
317
- }
318
- if (control instanceof UntypedFormGroup) {
319
- Object.keys(control.controls).forEach(groupKey => {
320
- this.getInvalidFields(control.controls[groupKey], invalidFields, field, groupKey);
321
- });
322
- }
323
- if (control instanceof UntypedFormArray) {
324
- control.controls.forEach((c, index) => {
325
- this.getInvalidFields(c, invalidFields, field + `(${index + 1})`);
326
- });
327
- }
328
- }
329
- }
330
- /** @nocollapse */ ItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: ItemComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.CrudFacade }, { token: i3.CrudService }, { token: i1.ActivatedRoute }, { token: i4.DynamicComponentLoader }, { token: i5.TranslateService }, { token: i6.CrudFullConfig }, { token: i7.Location }, { token: i0.ChangeDetectorRef }, { token: i4.AuthService }, { token: i4.StyleService }, { token: i0.ElementRef }, { token: i4.ToastService }, { token: i8.PageService }, { token: i0.NgModuleRef }, { token: i0.ComponentFactoryResolver }, { token: i4.DetailsService }], target: i0.ɵɵFactoryTarget.Component });
331
- /** @nocollapse */ ItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: ItemComponent, selector: "smart-crud-item-page", viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "contentTpl", first: true, predicate: ["contentTpl"], descendants: true, read: TemplateRef }, { propertyName: "topTpl", first: true, predicate: ["topTpl"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "bottomTpl", first: true, predicate: ["bottomTpl"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "standardComponents", predicate: ItemStandardComponent, descendants: true, read: ItemStandardComponent }, { propertyName: "dynamicContents", predicate: DynamicContentDirective, descendants: true, read: DynamicContentDirective }], usesInheritance: true, ngImport: i0, template: `
332
- <smart-page [options]="pageOptions">
333
- <div #topTpl class="top-content"></div>
334
- <smart-crud-item-standard-page *ngIf="template === 'default'"
335
- [detailsOptions]="detailsOptions"
336
- [mode]="mode"
337
- [uniqueProvider]="uniqueProvider"
338
- (onPartialChange)="onPartialChange($event)"
339
- (onChange)="onChange($event)"
340
- (onValidChange)="onValidChange($event)"
341
- >
342
- <ng-container [ngTemplateOutlet]="contentTpl"></ng-container>
343
- </smart-crud-item-standard-page>
344
- <ng-template #contentTpl>
345
- <ng-content></ng-content>
346
- </ng-template>
347
- <div class="dynamic-content"></div>
348
- <div #bottomTpl class="bottom-content"></div>
349
- </smart-page>
350
- `, isInline: true, dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.PageComponent, selector: "smart-page", inputs: ["options"] }, { kind: "directive", type: i4.DynamicContentDirective, selector: ".dynamic-content" }, { kind: "component", type: i9.ItemStandardComponent, selector: "smart-crud-item-standard-page" }] });
351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: ItemComponent, decorators: [{
352
- type: Component,
353
- args: [{
354
- selector: "smart-crud-item-page",
355
- template: `
356
- <smart-page [options]="pageOptions">
357
- <div #topTpl class="top-content"></div>
358
- <smart-crud-item-standard-page *ngIf="template === 'default'"
359
- [detailsOptions]="detailsOptions"
360
- [mode]="mode"
361
- [uniqueProvider]="uniqueProvider"
362
- (onPartialChange)="onPartialChange($event)"
363
- (onChange)="onChange($event)"
364
- (onValidChange)="onValidChange($event)"
365
- >
366
- <ng-container [ngTemplateOutlet]="contentTpl"></ng-container>
367
- </smart-crud-item-standard-page>
368
- <ng-template #contentTpl>
369
- <ng-content></ng-content>
370
- </ng-template>
371
- <div class="dynamic-content"></div>
372
- <div #bottomTpl class="bottom-content"></div>
373
- </smart-page>
374
- `
375
- }]
376
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.CrudFacade }, { type: i3.CrudService }, { type: i1.ActivatedRoute }, { type: i4.DynamicComponentLoader }, { type: i5.TranslateService }, { type: i6.CrudFullConfig }, { type: i7.Location }, { type: i0.ChangeDetectorRef }, { type: i4.AuthService }, { type: i4.StyleService }, { type: i0.ElementRef }, { type: i4.ToastService }, { type: i8.PageService }, { type: i0.NgModuleRef }, { type: i0.ComponentFactoryResolver }, { type: i4.DetailsService }]; }, propDecorators: { standardComponents: [{
377
- type: ViewChildren,
378
- args: [ItemStandardComponent, { read: ItemStandardComponent }]
379
- }], content: [{
380
- type: ViewChild,
381
- args: [IonContent, { static: true }]
382
- }], contentTpl: [{
383
- type: ViewChild,
384
- args: ["contentTpl", { read: TemplateRef, static: false }]
385
- }], topTpl: [{
386
- type: ViewChild,
387
- args: ["topTpl", { read: ViewContainerRef, static: true }]
388
- }], bottomTpl: [{
389
- type: ViewChild,
390
- args: ["bottomTpl", { read: ViewContainerRef, static: true }]
391
- }], dynamicContents: [{
392
- type: ViewChildren,
393
- args: [DynamicContentDirective, { read: DynamicContentDirective }]
394
- }] } });
395
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NydWQvc2hlbGwvYW5ndWxhci9zcmMvbGliL3BhZ2VzL2l0ZW0vaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQUUsd0JBQXdCLEVBQ25DLFVBQVUsRUFBRSxXQUFXLEVBRXZCLFNBQVMsRUFBRSxXQUFXLEVBQ3RCLFNBQVMsRUFDVCxZQUFZLEVBQUUsZ0JBQWdCLEVBQy9CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUNMLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQ25ELHNCQUFzQixFQUFFLHVCQUF1QixFQUdqQyxZQUFZLEVBQUUsWUFBWSxHQUN6QyxNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFrQixnQkFBZ0Is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RUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk3RCxNQUFNO3NCQURMLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTdELFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJaEUsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBFbGVtZW50UmVmLCBOZ01vZHVsZVJlZixcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbiwgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcblxuaW1wb3J0IHtcbiAgQXV0aFNlcnZpY2UsIENyZWF0ZUR5bmFtaWNDb21wb25lbnQsIERldGFpbHNTZXJ2aWNlLFxuICBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBEeW5hbWljQ29udGVudERpcmVjdGl2ZSwgSUNlbGxQaXBlLFxuICBJRGV0YWlsc09wdGlvbnMsXG4gIElJY29uQnV0dG9uT3B0aW9ucyxcbiAgSVBhZ2VPcHRpb25zLCBTdHlsZVNlcnZpY2UsIFRvYXN0U2VydmljZSxcbn0gZnJvbSBcIkBzbWFydHNvZnQwMDEvYW5ndWxhclwiO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gXCJAc21hcnRzb2Z0MDAxL2RvbWFpbi1jb3JlXCI7XG5pbXBvcnQge2dldE1vZGVsT3B0aW9uc30gZnJvbSBcIkBzbWFydHNvZnQwMDEvbW9kZWxzXCI7XG5pbXBvcnQgeyBTcGVjaWZpY2F0aW9uU2VydmljZSB9IGZyb20gXCJAc21hcnRzb2Z0MDAxL3V0aWxzXCI7XG5cbmltcG9ydCB7IENydWRGYWNhZGUgfSBmcm9tIFwiLi4vLi4vK3N0YXRlL2NydWQuZmFjYWRlXCI7XG5pbXBvcnQgeyBDcnVkRnVsbENvbmZpZyB9IGZyb20gXCIuLi8uLi9jcnVkLmNvbmZpZ1wiO1xuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY3J1ZC9jcnVkLnNlcnZpY2VcIjtcbmltcG9ydCB7IElDcnVkRmlsdGVyIH0gZnJvbSBcIi4uLy4uL21vZGVscy9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJb25Db250ZW50IH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCI7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIlxuaW1wb3J0IHtJdGVtU3RhbmRhcmRDb21wb25lbnR9IGZyb20gXCIuL3N0YW5kYXJkL3N0YW5kYXJkLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ3J1ZEl0ZW1QYWdlQmFzZUNvbXBvbmVudCB9IGZyb20gXCIuL2Jhc2UvYmFzZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFBhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3BhZ2UvcGFnZS5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzbWFydC1jcnVkLWl0ZW0tcGFnZVwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzbWFydC1wYWdlIFtvcHRpb25zXT1cInBhZ2VPcHRpb25zXCI+XG4gICAgICA8ZGl2ICN0b3BUcGwgY2xhc3M9XCJ0b3AtY29udGVudFwiPjwvZGl2PlxuICAgICAgPHNtYXJ0LWNydWQtaXRlbS1zdGFuZGFyZC1wYWdlICpuZ0lmPVwidGVtcGxhdGUgPT09ICdkZWZhdWx0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbHNPcHRpb25zXT1cImRldGFpbHNPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdW5pcXVlUHJvdmlkZXJdPVwidW5pcXVlUHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblBhcnRpYWxDaGFuZ2UpPVwib25QYXJ0aWFsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWxpZENoYW5nZSk9XCJvblZhbGlkQ2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc21hcnQtY3J1ZC1pdGVtLXN0YW5kYXJkLXBhZ2U+XG4gICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUcGw+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1jb250ZW50XCI+PC9kaXY+XG4gICAgICA8ZGl2ICNib3R0b21UcGwgY2xhc3M9XCJib3R0b20tY29udGVudFwiPjwvZGl2PlxuICAgIDwvc21hcnQtcGFnZT5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtQ29tcG9uZW50PFQgZXh0ZW5kcyBJRW50aXR5PHN0cmluZz4+XG4gICAgZXh0ZW5kcyBDcmVhdGVEeW5hbWljQ29tcG9uZW50PENydWRJdGVtUGFnZUJhc2VDb21wb25lbnQ8YW55Pj4oJ2NydWQtaXRlbS1wYWdlJylcbiAgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIF9tb2RlOiBzdHJpbmc7XG5cbiAgcGFnZU9wdGlvbnM6IElQYWdlT3B0aW9ucyA9IHtcbiAgICB0aXRsZTogXCJcIixcbiAgICBzaG93QmFja0J1dHRvbjogdHJ1ZSxcbiAgICBoaWRlTWVudUJ1dHRvbjogdHJ1ZSxcbiAgfTtcbiAgZGV0YWlsc09wdGlvbnM6IElEZXRhaWxzT3B0aW9uczxUPjtcbiAgaWQ6IHN0cmluZztcbiAgZm9ybVZhbHVlOiBUO1xuICBmb3JtVmFsaWQgPSBmYWxzZTtcbiAgaXRlbTogVDtcbiAgZm9ybVBhcnRpYWxWYWx1ZTogUGFydGlhbDxUPjtcbiAgdW5pcXVlUHJvdmlkZXI6ICh2YWx1ZXM6IFJlY29yZDxrZXlvZiBULCBhbnk+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIHNldCBtb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbW9kZSA9IHZhbDtcbiAgICB0aGlzLnJlZnJlc2hEeW5hbWljSW5zdGFuY2UoKTtcbiAgfVxuICBnZXQgbW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cblxuICBzZWxlY3RlZCQ6IE9ic2VydmFibGU8VD47XG5cbiAgQFZpZXdDaGlsZHJlbihJdGVtU3RhbmRhcmRDb21wb25lbnQsIHsgcmVhZDogSXRlbVN0YW5kYXJkQ29tcG9uZW50IH0pIHN0YW5kYXJkQ29tcG9uZW50cyA9IG5ldyBRdWVyeUxpc3Q8SXRlbVN0YW5kYXJkQ29tcG9uZW50PGFueT4+KCk7XG4gIEBWaWV3Q2hpbGQoSW9uQ29udGVudCwgeyBzdGF0aWM6IHRydWUgfSkgY29udGVudDogSW9uQ29udGVudDtcblxuICBAVmlld0NoaWxkKFwiY29udGVudFRwbFwiLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gIGNvbnRlbnRUcGw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZChcInRvcFRwbFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICB0b3BUcGw6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQFZpZXdDaGlsZChcImJvdHRvbVRwbFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBib3R0b21UcGw6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihEeW5hbWljQ29udGVudERpcmVjdGl2ZSwgeyByZWFkOiBEeW5hbWljQ29udGVudERpcmVjdGl2ZSB9KVxuICBkeW5hbWljQ29udGVudHMgPSBuZXcgUXVlcnlMaXN0PER5bmFtaWNDb250ZW50RGlyZWN0aXZlPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBmYWNhZGU6IENydWRGYWNhZGU8VD4sXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBDcnVkU2VydmljZTxUPixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRMb2FkZXI6IER5bmFtaWNDb21wb25lbnRMb2FkZXI8VD4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb25maWc6IENydWRGdWxsQ29uZmlnPFQ+LFxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHN0eWxlU2VydmljZTogU3R5bGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFnZVNlcnZpY2U6IFBhZ2VTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBkZXRhaWxzU2VydmljZTogRGV0YWlsc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoY2QsIG1vZHVsZVJlZiwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTtcblxuICAgIHRoaXMuc2VsZWN0ZWQkID0gdGhpcy5mYWNhZGUuc2VsZWN0ZWQkO1xuICB9XG5cbiAgcmVmcmVzaFByb3BlcnRpZXMoKSB7XG4gICAgdGhpcy5iYXNlSW5zdGFuY2UuZGV0YWlsc09wdGlvbnMgPSB0aGlzLmRldGFpbHNPcHRpb25zO1xuICAgIHRoaXMuYmFzZUluc3RhbmNlLm1vZGUgPSB0aGlzLm1vZGU7XG4gICAgdGhpcy5iYXNlSW5zdGFuY2UudW5pcXVlUHJvdmlkZXIgPSB0aGlzLnVuaXF1ZVByb3ZpZGVyO1xuICAgIHRoaXMuYmFzZUluc3RhbmNlLm9uUGFydGlhbENoYW5nZS5waXBlKHRoaXMudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLm9uUGFydGlhbENoYW5nZSh2YWwpKTtcbiAgICB0aGlzLmJhc2VJbnN0YW5jZS5vbkNoYW5nZS5waXBlKHRoaXMudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLm9uQ2hhbmdlKHZhbCkpO1xuICAgIHRoaXMuYmFzZUluc3RhbmNlLm9uVmFsaWRDaGFuZ2UucGlwZSh0aGlzLnRha2VVbnRpbERlc3Ryb3kpLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5vblZhbGlkQ2hhbmdlKHZhbCkpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZXRhaWxzU2VydmljZS5pbml0KCk7XG4gICAgdGhpcy5zdHlsZVNlcnZpY2UuaW5pdCh0aGlzLmVsZW1lbnRSZWYpO1xuXG4gICAgdGhpcy5wYWdlU2VydmljZS5jaGVja1Blcm1pc3Npb25zKCk7XG5cbiAgICBpZiAodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsLnNwbGl0KCc/JylbMF0uZW5kc1dpdGgoXCIvYWRkXCIpKSB7XG4gICAgICB0aGlzLm1vZGUgPSBcImNyZWF0ZVwiO1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbXBvbmVudHMoJ2FkZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGUgPSB0aGlzLmNvbmZpZy5kZXRhaWxzID8gXCJkZXRhaWxzXCIgOiBcInVwZGF0ZVwiO1xuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAndXBkYXRlJykge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlQ29tcG9uZW50cygnZWRpdCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtc1xuICAgICAgICAucGlwZSh0aGlzLnRha2VVbnRpbERlc3Ryb3kpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgaWQgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuZmFjYWRlLnNlbGVjdChpZCk7XG4gICAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc1xuICAgICAgICAgIC5waXBlKHRoaXMudGFrZVVudGlsRGVzdHJveSlcbiAgICAgICAgICAuc3Vic2NyaWJlKCh7IGVkaXQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVkaXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5tb2RlID0gXCJ1cGRhdGVcIjtcbiAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbXBvbmVudHMoJ2VkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnVuaXF1ZVByb3ZpZGVyID0gYXN5bmMgKHZhbHVlcykgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyOiBJQ3J1ZEZpbHRlciA9IHtcbiAgICAgICAgcXVlcnk6IFtdLFxuICAgICAgfTtcblxuICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgZmlsdGVyLnF1ZXJ5LnB1c2goe1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZXNba2V5XSxcbiAgICAgICAgICB0eXBlOiBcIj1cIixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgZmlsdGVyLnF1ZXJ5LnB1c2goe1xuICAgICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgICAgIHR5cGU6IFwiIT1cIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHRvdGFsQ291bnQgfSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRMaXN0KGZpbHRlcikudG9Qcm9taXNlKCk7XG5cbiAgICAgIHJldHVybiAhdG90YWxDb3VudDtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRldGFpbHMpIHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkQ29tcG9uZW50cyA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudExvYWRlci5nZXRDb21wb25lbnRzV2l0aEZhY3RvcmllcyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmNvbmZpZy5kZXRhaWxzICYmXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5kZXRhaWxzW1wiY29tcG9uZW50c1wiXSAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWcuZGV0YWlsc1tcImNvbXBvbmVudHNcIl0udG9wXG4gICAgICAgICAgICAgID8gW3RoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLnRvcF1cbiAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5jb25maWcuZGV0YWlscyAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWcuZGV0YWlsc1tcImNvbXBvbmVudHNcIl0gJiZcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLmJvdHRvbVxuICAgICAgICAgICAgICAgID8gW3RoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLmJvdHRvbV1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmRldGFpbHNPcHRpb25zID0ge1xuICAgICAgICB0eXBlOiB0aGlzLmNvbmZpZy50eXBlLFxuICAgICAgICBpdGVtJDogdGhpcy5mYWNhZGUuc2VsZWN0ZWQkLFxuICAgICAgICBjZWxsUGlwZTogdGhpcy5jb25maWcuZGV0YWlscyA/ICh0aGlzLmNvbmZpZy5kZXRhaWxzIGFzIHtjZWxsUGlwZT86IElDZWxsUGlwZTxUPn0pLmNlbGxQaXBlIDogbnVsbCxcbiAgICAgICAgY29tcG9uZW50RmFjdG9yaWVzOiB7XG4gICAgICAgICAgdG9wOlxuICAgICAgICAgICAgdGhpcy5jb25maWcuZGV0YWlscyAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWcuZGV0YWlsc1tcImNvbXBvbmVudHNcIl0gJiZcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLnRvcFxuICAgICAgICAgICAgICA/IGNvbXBpbGVkQ29tcG9uZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgKGNjKSA9PiBjYy5jb21wb25lbnQgPT09IHRoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLnRvcFxuICAgICAgICAgICAgICAgICkuZmFjdG9yeVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgYm90dG9tOlxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5kZXRhaWxzICYmXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdICYmXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmRldGFpbHNbXCJjb21wb25lbnRzXCJdLmJvdHRvbVxuICAgICAgICAgICAgICAgICAgPyBjb21waWxlZENvbXBvbmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgIChjYykgPT4gY2MuY29tcG9uZW50ID09PSB0aGlzLmNvbmZpZy5kZXRhaWxzW1wiY29tcG9uZW50c1wiXS5ib3R0b21cbiAgICAgICAgICAgICAgICAgICkuZmFjdG9yeVxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRQYWdlT3B0aW9ucygpO1xuXG4gICAgdGhpcy5mYWNhZGUuc2VsZWN0ZWQkLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95KS5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgICAgdGhpcy5pbml0UGFnZU9wdGlvbnMoKTtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoRHluYW1pY0luc3RhbmNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ29tcG9uZW50cyhtb2RlOiAnYWRkJyB8ICdlZGl0Jykge1xuICAgIGNvbnN0IGNvbXBpbGVkQ29tcG9uZW50cyA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudExvYWRlci5nZXRDb21wb25lbnRzV2l0aEZhY3RvcmllcyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmNvbmZpZ1ttb2RlXSAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWdbbW9kZV1bXCJjb21wb25lbnRzXCJdICYmXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1ttb2RlXVtcImNvbXBvbmVudHNcIl0udG9wXG4gICAgICAgICAgICAgICAgPyBbdGhpcy5jb25maWdbbW9kZV1bXCJjb21wb25lbnRzXCJdLnRvcF1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgIC4uLih0aGlzLmNvbmZpZ1ttb2RlXSAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWdbbW9kZV1bXCJjb21wb25lbnRzXCJdICYmXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1ttb2RlXVtcImNvbXBvbmVudHNcIl0uYm90dG9tXG4gICAgICAgICAgICAgICAgPyBbdGhpcy5jb25maWdbbW9kZV1bXCJjb21wb25lbnRzXCJdLmJvdHRvbV1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHRvcENvbXBvbmVudEZhY3RvcnkgPSBjb21waWxlZENvbXBvbmVudHMuZmluZChcbiAgICAgICAgKGNjKSA9PiBjYy5jb21wb25lbnQgPT09IHRoaXMuY29uZmlnW21vZGVdW1wiY29tcG9uZW50c1wiXT8udG9wXG4gICAgKT8uZmFjdG9yeTtcblxuICAgIGNvbnN0IGJvdHRvbUNvbXBvbmVudEZhY3RvcnkgPSBjb21waWxlZENvbXBvbmVudHMuZmluZChcbiAgICAgICAgKGNjKSA9PiBjYy5jb21wb25lbnQgPT09IHRoaXMuY29uZmlnW21vZGVdW1wiY29tcG9uZW50c1wiXT8uYm90dG9tXG4gICAgKT8uZmFjdG9yeTtcblxuICAgIGlmICghdGhpcy50b3BUcGwuZ2V0KDApICYmIHRvcENvbXBvbmVudEZhY3RvcnkpIHtcbiAgICAgIHRoaXMudG9wVHBsLmNyZWF0ZUNvbXBvbmVudCh0b3BDb21wb25lbnRGYWN0b3J5KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYm90dG9tVHBsLmdldCgwKSAmJiBib3R0b21Db21wb25lbnRGYWN0b3J5KSB7XG4gICAgICB0aGlzLmJvdHRvbVRwbC5jcmVhdGVDb21wb25lbnQoYm90dG9tQ29tcG9uZW50RmFjdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWFsQ2hhbmdlKHZhbDogUGFydGlhbDxUPikge1xuICAgIHRoaXMuZm9ybVBhcnRpYWxWYWx1ZSA9IHZhbDtcbiAgfVxuXG4gIG9uQ2hhbmdlKHZhbDogVCkge1xuICAgIHRoaXMuZm9ybVZhbHVlID0gdmFsO1xuICB9XG5cbiAgb25WYWxpZENoYW5nZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZvcm1WYWxpZCA9IHZhbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2VPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZU9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLnBhZ2VPcHRpb25zLFxuICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUoKSxcbiAgICAgIGVuZEJ1dHRvbnM6IHRoaXMuZ2V0QnV0dG9ucygpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJ1dHRvbnMoKTogQXJyYXk8SUljb25CdXR0b25PcHRpb25zPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGdldE1vZGVsT3B0aW9ucyh0aGlzLmNvbmZpZy50eXBlKTtcblxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIFwiY3JlYXRlXCI6XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWNvbjogXCJhZGRcIixcbiAgICAgICAgICAgIHRleHQ6IFwiYWRkXCIsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrRmlyc3RJbnZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmZhY2FkZS5jcmVhdGUodGhpcy5mb3JtVmFsdWUpO1xuICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi4odGhpcy5jb25maWcuZGV0YWlsc1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWNvbjogXCJjbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogXCJjYW5jZWxcIixcbiAgICAgICAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlID0gXCJkZXRhaWxzXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9wVHBsLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tVHBsLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpY29uOiBcInNhdmVcIixcbiAgICAgICAgICAgIHRleHQ6IFwic2F2ZVwiLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0ZpcnN0SW52YWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5mb3JtUGFydGlhbFZhbHVlLmlkID0gdGhpcy5pZDtcbiAgICAgICAgICAgICAgdGhpcy5mYWNhZGUudXBkYXRlUGFydGlhbCh0aGlzLmZvcm1QYXJ0aWFsVmFsdWUgYXMgYW55KTtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGV0YWlscykge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZSA9IFwiZGV0YWlsc1wiO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VPcHRpb25zKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgXCJkZXRhaWxzXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5lZGl0ICYmIChcbiAgICAgICAgICAgICFvcHRpb25zPy51cGRhdGU/LmVuYWJsZWQgfHwgU3BlY2lmaWNhdGlvblNlcnZpY2UudmFsaWQodGhpcy5pdGVtLCBvcHRpb25zPy51cGRhdGU/LmVuYWJsZWQpXG4gICAgICAgIClcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGljb246IFwiY3JlYXRlXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCJlZGl0XCIsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlID0gXCJ1cGRhdGVcIjtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDb21wb25lbnRzKCdlZGl0Jyk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0TW9kZWxPcHRpb25zKHRoaXMuY29uZmlnLnR5cGUpO1xuXG4gICAgY29uc3QgcHJlZml4ID0gb3B0aW9ucy50aXRsZUtleSAmJiB0aGlzLml0ZW0gPyB0aGlzLnJlbW92ZVBhcmFncmFwaCh0aGlzLml0ZW1bb3B0aW9ucy50aXRsZUtleV0pICsgJyAtICcgOiAnJztcblxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIFwiY3JlYXRlXCI6XG4gICAgICAgIHJldHVybiBcImFkZFwiO1xuICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICByZXR1cm4gcHJlZml4ICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJjaGFuZ2VcIik7XG4gICAgICBjYXNlIFwiZGV0YWlsc1wiOlxuICAgICAgICByZXR1cm4gcHJlZml4ICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXCJkZXRhaWxzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGFyYWdyYXBoKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCB8fCB2YWwuaW5kZXhPZignPHA+JykgIT09IDApIHJldHVybiB2YWw7XG5cbiAgICBjb25zdCBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuaW5uZXJIVE1MPXZhbDtcblxuICAgIGNvbnN0IGl0ZW0gPSBkaXYucXVlcnlTZWxlY3RvckFsbChcInBcIikuaXRlbSgwKTtcblxuICAgIHJldHVybiBpdGVtLmlubmVySFRNTDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGaXJzdEludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCBmb3JtID0gdGhpcy50ZW1wbGF0ZSA9PT0gJ2RlZmF1bHQnXG4gICAgICAgID8gdGhpcy5zdGFuZGFyZENvbXBvbmVudHMuZmlyc3QuZm9ybUNvbXBvbmVudHMuZmlyc3QuZm9ybVxuICAgICAgICA6IHRoaXMuYmFzZUluc3RhbmNlLmZvcm1Db21wb25lbnRzLmZpcnN0LmZvcm07XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGlmIChmb3JtLnZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpbnZhbGlkRmllbGRzID0gW107XG5cbiAgICB0aGlzLmdldEludmFsaWRGaWVsZHMoZm9ybSwgaW52YWxpZEZpZWxkcywgJycpO1xuXG4gICAgdGhpcy50b2FzdFNlcnZpY2UuaW5mbyh7XG4gICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0lOUFVULkVSUk9SUy5yZXF1aXJlcycpLFxuICAgICAgbWVzc2FnZTogaW52YWxpZEZpZWxkcy5zbGljZSgwLCAzKS5qb2luKCc8YnIvPicpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW52YWxpZEZpZWxkcyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGludmFsaWRGaWVsZHM6IGFueVtdLCBiYXNlRmllbGQ6IHN0cmluZywga2V5ID0gbnVsbCkge1xuICAgIGlmIChjb250cm9sLnZhbGlkKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWVsZCA9IGtleSA/IGJhc2VGaWVsZCArICcgPiAnICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ01PREVMLicgKyBrZXkpIDogYmFzZUZpZWxkO1xuXG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzPy5jdXN0b21NZXNzYWdlKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLnB1c2goZmllbGQgKyBgICgke2NvbnRyb2wuZXJyb3JzLmN1c3RvbU1lc3NhZ2V9KWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Db250cm9sKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLnB1c2goZmllbGQpO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgICAgT2JqZWN0LmtleXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaChncm91cEtleSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW52YWxpZEZpZWxkcyhjb250cm9sLmNvbnRyb2xzW2dyb3VwS2V5XSwgaW52YWxpZEZpZWxkcywgZmllbGQsIGdyb3VwS2V5KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgICB0aGlzLmdldEludmFsaWRGaWVsZHMoYywgaW52YWxpZEZpZWxkcywgZmllbGQgKyBgKCR7aW5kZXggKyAxfSlgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,23 +0,0 @@
1
- import { Directive, Input, ViewChild, ViewContainerRef } from "@angular/core";
2
- import { BaseComponent, } from "@smartsoft001/angular";
3
- import { CrudFullConfig } from "../../../crud.config";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../../crud.config";
6
- export class CrudListPageBaseComponent extends BaseComponent {
7
- constructor(config) {
8
- super();
9
- this.config = config;
10
- }
11
- }
12
- CrudListPageBaseComponent.smartType = "crud-list-page";
13
- /** @nocollapse */ CrudListPageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CrudListPageBaseComponent, deps: [{ token: i1.CrudFullConfig }], target: i0.ɵɵFactoryTarget.Directive });
14
- /** @nocollapse */ CrudListPageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: CrudListPageBaseComponent, inputs: { listOptions: "listOptions" }, viewQueries: [{ propertyName: "contentTpl", first: true, predicate: ["contentTpl"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0 });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CrudListPageBaseComponent, decorators: [{
16
- type: Directive
17
- }], ctorParameters: function () { return [{ type: i1.CrudFullConfig }]; }, propDecorators: { contentTpl: [{
18
- type: ViewChild,
19
- args: ["contentTpl", { read: ViewContainerRef, static: true }]
20
- }], listOptions: [{
21
- type: Input
22
- }] } });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NydWQvc2hlbGwvYW5ndWxhci9zcmMvbGliL3BhZ2VzL2xpc3QvYmFzZS9iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDSCxhQUFhLEdBR2hCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDOzs7QUFHcEQsTUFBTSxPQUFnQix5QkFBcUQsU0FBUSxhQUFhO0lBUzVGLFlBQ1csTUFBeUI7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFGRCxXQUFNLEdBQU4sTUFBTSxDQUFtQjtJQUdwQyxDQUFDOztBQVpNLG1DQUFTLEdBQXlCLGdCQUFnQixDQUFDO3lJQUR4Qyx5QkFBeUI7NkhBQXpCLHlCQUF5Qix1SkFHVixnQkFBZ0I7MkZBSC9CLHlCQUF5QjtrQkFEOUMsU0FBUztxR0FLTixVQUFVO3NCQURULFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWpFLFdBQVc7c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7XG4gICAgQmFzZUNvbXBvbmVudCxcbiAgICBEeW5hbWljQ29tcG9uZW50VHlwZSxcbiAgICBJTGlzdE9wdGlvbnMsXG59IGZyb20gXCJAc21hcnRzb2Z0MDAxL2FuZ3VsYXJcIjtcbmltcG9ydCB7SUVudGl0eX0gZnJvbSBcIkBzbWFydHNvZnQwMDEvZG9tYWluLWNvcmVcIjtcbmltcG9ydCB7Q3J1ZEZ1bGxDb25maWd9IGZyb20gXCIuLi8uLi8uLi9jcnVkLmNvbmZpZ1wiO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcnVkTGlzdFBhZ2VCYXNlQ29tcG9uZW50PFQgZXh0ZW5kcyBJRW50aXR5PHN0cmluZz4+IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHNtYXJ0VHlwZTogRHluYW1pY0NvbXBvbmVudFR5cGUgPSBcImNydWQtbGlzdC1wYWdlXCI7XG5cbiAgICBAVmlld0NoaWxkKFwiY29udGVudFRwbFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIGNvbnRlbnRUcGw6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICBASW5wdXQoKVxuICAgIGxpc3RPcHRpb25zOiBJTGlzdE9wdGlvbnM8VD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNvbmZpZzogQ3J1ZEZ1bGxDb25maWc8VD4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufSJdfQ==