@paperless/angular 0.1.0-alpha.436 → 0.1.0-alpha.438

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 (87) hide show
  1. package/esm2022/lib/base/form.component.mjs +103 -0
  2. package/esm2022/lib/base/upload.component.mjs +58 -0
  3. package/esm2022/lib/base/value-accessor.mjs +44 -0
  4. package/esm2022/lib/directives/p-datepicker.directive.mjs +37 -0
  5. package/esm2022/lib/directives/p-page-size-select.directive.mjs +42 -0
  6. package/esm2022/lib/directives/p-pagination.directive.mjs +42 -0
  7. package/esm2022/lib/directives/p-select.directive.mjs +37 -0
  8. package/{esm2020 → esm2022}/lib/modules/overlay/overlay.module.mjs +15 -15
  9. package/esm2022/lib/modules/overlay/overlay.ref.mjs +14 -0
  10. package/esm2022/lib/modules/overlay/services/overlay.service.mjs +77 -0
  11. package/esm2022/lib/modules/table/base/table.component.mjs +203 -0
  12. package/esm2022/lib/modules/table/components/table/table.component.mjs +730 -0
  13. package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +215 -0
  14. package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +40 -0
  15. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-custom-filter.directive.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-filter-modal.directive.mjs +4 -4
  17. package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  18. package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  19. package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +122 -0
  20. package/esm2022/lib/modules/table/directives/p-table.directive.mjs +78 -0
  21. package/{esm2020 → esm2022}/lib/modules/table/table.module.mjs +5 -5
  22. package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +39 -0
  23. package/esm2022/lib/modules/toast/directives/toast.directive.mjs +51 -0
  24. package/esm2022/lib/modules/toast/services/toast.service.mjs +51 -0
  25. package/{esm2020 → esm2022}/lib/modules/toast/toast.module.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/paperless.module.mjs +5 -5
  27. package/esm2022/lib/pipes/currency.pipe.mjs +21 -0
  28. package/esm2022/lib/pipes/date.pipe.mjs +21 -0
  29. package/esm2022/lib/pipes/safe.pipe.mjs +34 -0
  30. package/esm2022/lib/stencil/components.mjs +1554 -0
  31. package/esm2022/lib/stencil.module.mjs +17 -0
  32. package/{fesm2020 → fesm2022}/paperless-angular.mjs +799 -570
  33. package/fesm2022/paperless-angular.mjs.map +1 -0
  34. package/package.json +6 -12
  35. package/paperless.css +48 -0
  36. package/esm2020/lib/base/form.component.mjs +0 -105
  37. package/esm2020/lib/base/upload.component.mjs +0 -57
  38. package/esm2020/lib/base/value-accessor.mjs +0 -42
  39. package/esm2020/lib/directives/p-datepicker.directive.mjs +0 -37
  40. package/esm2020/lib/directives/p-page-size-select.directive.mjs +0 -42
  41. package/esm2020/lib/directives/p-pagination.directive.mjs +0 -42
  42. package/esm2020/lib/directives/p-select.directive.mjs +0 -37
  43. package/esm2020/lib/modules/overlay/overlay.ref.mjs +0 -12
  44. package/esm2020/lib/modules/overlay/services/overlay.service.mjs +0 -74
  45. package/esm2020/lib/modules/table/base/table.component.mjs +0 -201
  46. package/esm2020/lib/modules/table/components/table/table.component.mjs +0 -679
  47. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -167
  48. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +0 -37
  49. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
  50. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +0 -60
  51. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -121
  52. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +0 -78
  53. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -36
  54. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +0 -51
  55. package/esm2020/lib/modules/toast/services/toast.service.mjs +0 -53
  56. package/esm2020/lib/pipes/currency.pipe.mjs +0 -20
  57. package/esm2020/lib/pipes/date.pipe.mjs +0 -20
  58. package/esm2020/lib/pipes/safe.pipe.mjs +0 -33
  59. package/esm2020/lib/stencil/components.mjs +0 -1440
  60. package/esm2020/lib/stencil.module.mjs +0 -17
  61. package/fesm2015/paperless-angular.mjs +0 -3673
  62. package/fesm2015/paperless-angular.mjs.map +0 -1
  63. package/fesm2020/paperless-angular.mjs.map +0 -1
  64. /package/{esm2020 → esm2022}/lib/animations/fade.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/animations/index.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/animations/slide.mjs +0 -0
  67. /package/{esm2020 → esm2022}/lib/base/index.mjs +0 -0
  68. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  69. /package/{esm2020 → esm2022}/lib/modules/index.mjs +0 -0
  70. /package/{esm2020 → esm2022}/lib/modules/overlay/index.mjs +0 -0
  71. /package/{esm2020 → esm2022}/lib/modules/overlay/services/index.mjs +0 -0
  72. /package/{esm2020 → esm2022}/lib/modules/table/base/index.mjs +0 -0
  73. /package/{esm2020 → esm2022}/lib/modules/table/components/index.mjs +0 -0
  74. /package/{esm2020 → esm2022}/lib/modules/table/components/table/constants.mjs +0 -0
  75. /package/{esm2020 → esm2022}/lib/modules/table/directives/index.mjs +0 -0
  76. /package/{esm2020 → esm2022}/lib/modules/table/index.mjs +0 -0
  77. /package/{esm2020 → esm2022}/lib/modules/table/utils.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/toast/components/index.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/toast/directives/index.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/toast/index.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/toast/services/index.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/toast/types.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/stencil/angular-component-lib/utils.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/stencil/index.mjs +0 -0
  86. /package/{esm2020 → esm2022}/paperless-angular.mjs +0 -0
  87. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,203 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component } from '@angular/core';
3
+ import { FormControl, FormGroup } from '@angular/forms';
4
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
5
+ import { timer } from 'rxjs';
6
+ import { debounce, filter, map, pairwise, startWith } from 'rxjs/operators';
7
+ import { BaseFormComponent } from '../../../base/form.component';
8
+ import { createFormFilters } from '../utils';
9
+ import * as i0 from "@angular/core";
10
+ let BaseTableComponent = class BaseTableComponent extends BaseFormComponent {
11
+ quickFilters = [];
12
+ filterForm = new FormGroup({});
13
+ filterFormQuickFilterKey;
14
+ defaultFilterFormValues = {};
15
+ pageSizeDefault = 12;
16
+ tableOptions;
17
+ _defaultTableValues = {
18
+ pageSize: this.pageSizeDefault,
19
+ page: 1,
20
+ quickFilter: null,
21
+ query: '',
22
+ filters: [],
23
+ selectedRows: [],
24
+ };
25
+ defaultTableValues = {};
26
+ get pageSize() {
27
+ if (!this.tableOptions) {
28
+ return this._defaultTableValues.pageSize;
29
+ }
30
+ return this.tableOptions.value.pageSize;
31
+ }
32
+ get page() {
33
+ if (!this.tableOptions) {
34
+ return this._defaultTableValues.page;
35
+ }
36
+ return this.tableOptions.value.page;
37
+ }
38
+ get quickFilter() {
39
+ if (!this.tableOptions) {
40
+ return this._defaultTableValues.quickFilter;
41
+ }
42
+ return this.tableOptions.value.quickFilter;
43
+ }
44
+ set quickFilter(quickFilter) {
45
+ this.tableValues = {
46
+ quickFilter,
47
+ };
48
+ }
49
+ get query() {
50
+ if (!this.tableOptions) {
51
+ return this._defaultTableValues.query;
52
+ }
53
+ return this.tableOptions.value.query;
54
+ }
55
+ set query(query) {
56
+ this.tableValues = {
57
+ query,
58
+ };
59
+ }
60
+ get filters() {
61
+ if (!this.tableOptions) {
62
+ return this._defaultTableValues.filters;
63
+ }
64
+ return this.tableOptions.value.filters;
65
+ }
66
+ set filters(filters) {
67
+ this.tableValues = {
68
+ filters,
69
+ };
70
+ }
71
+ get selectedRows() {
72
+ if (!this.tableOptions) {
73
+ return this._defaultTableValues.selectedRows;
74
+ }
75
+ return this.tableOptions.value.selectedRows;
76
+ }
77
+ set selectedRows(selectedRows) {
78
+ this.tableValues = {
79
+ selectedRows,
80
+ };
81
+ }
82
+ // setter
83
+ get parsedDefaultTableValues() {
84
+ return {
85
+ ...this._defaultTableValues,
86
+ ...this.defaultTableValues,
87
+ pageSize: this.defaultTableValues?.pageSize || this.pageSizeDefault,
88
+ };
89
+ }
90
+ get tableValues() {
91
+ return this.tableOptions?.value ?? {};
92
+ }
93
+ set tableValues(values) {
94
+ this._setTableValues({
95
+ ...this.tableValues,
96
+ ...values,
97
+ });
98
+ }
99
+ constructor() {
100
+ super();
101
+ }
102
+ ngOnInit() {
103
+ this.tableOptions = new FormControl({
104
+ pageSize: this.parsedDefaultTableValues.pageSize,
105
+ page: this.parsedDefaultTableValues.page,
106
+ quickFilter: this.parsedDefaultTableValues.quickFilter,
107
+ query: this.parsedDefaultTableValues.query,
108
+ filters: this.parsedDefaultTableValues.filters,
109
+ selectedRows: this.parsedDefaultTableValues.selectedRows,
110
+ });
111
+ this.tableOptions.valueChanges
112
+ .pipe(untilDestroyed(this), startWith(this.tableOptions.value), pairwise(), map(([previous, next]) => this._getChanges(previous, next)), filter((changes) => !!changes), debounce((changes) => {
113
+ if (changes?.query && Object.keys(changes)?.length === 1) {
114
+ return timer(300);
115
+ }
116
+ return timer(0);
117
+ }), filter((changes) => !(changes?.selected &&
118
+ Object.keys(changes)?.length === 1)))
119
+ .subscribe((changes) => {
120
+ if (changes?.page) {
121
+ this._refresh();
122
+ return;
123
+ }
124
+ this._resetPageOrRefresh();
125
+ });
126
+ this._refresh();
127
+ }
128
+ resetTable(emitEvent = true, forceRefresh = false) {
129
+ this._setTableValues(this.parsedDefaultTableValues, emitEvent);
130
+ if (forceRefresh) {
131
+ this._refresh();
132
+ }
133
+ }
134
+ applyFormFilters(values = null) {
135
+ values = values ?? this.filterForm.value;
136
+ const { filters, quickFilter } = createFormFilters(values, this.quickFilters, this.filterFormQuickFilterKey);
137
+ if (quickFilter) {
138
+ this.quickFilter = quickFilter;
139
+ }
140
+ this.filters = filters;
141
+ }
142
+ resetFormFilters(resetQuickFilter = false) {
143
+ const values = this.filterForm.value;
144
+ const defaultQuickFilter = this.quickFilters.find((f) => f.default);
145
+ for (const key of Object.keys(values)) {
146
+ if (key === this.filterFormQuickFilterKey) {
147
+ if (resetQuickFilter) {
148
+ values[key] = defaultQuickFilter.value;
149
+ }
150
+ continue;
151
+ }
152
+ values[key] = this.defaultFilterFormValues[key] ?? null;
153
+ }
154
+ this.filterForm.setValue(values);
155
+ this.applyFormFilters(values);
156
+ }
157
+ _refresh() {
158
+ console.warn('Not implemented');
159
+ }
160
+ _resetPageOrRefresh() {
161
+ if (!this.tableOptions) {
162
+ return;
163
+ }
164
+ if (this.page !== 1) {
165
+ this.tableOptions.get('page')?.setValue(1);
166
+ return;
167
+ }
168
+ this._refresh();
169
+ }
170
+ _setTableValues(data, emitEvent = true) {
171
+ this.tableOptions?.setValue({
172
+ ...this.tableOptions.value,
173
+ ...data,
174
+ }, { emitEvent });
175
+ }
176
+ _getChanges(previous, next) {
177
+ const changes = {};
178
+ let key;
179
+ for (key in next) {
180
+ if (key === 'selectedRows') {
181
+ continue;
182
+ }
183
+ if (JSON.stringify(previous[key]) !== JSON.stringify(next[key])) {
184
+ // @ts-ignore
185
+ changes[key] = next[key];
186
+ }
187
+ }
188
+ return Object.keys(changes).length ? changes : null;
189
+ }
190
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
191
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: BaseTableComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: ``, isInline: true });
192
+ };
193
+ BaseTableComponent = __decorate([
194
+ UntilDestroy({ checkProperties: true })
195
+ ], BaseTableComponent);
196
+ export { BaseTableComponent };
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, decorators: [{
198
+ type: Component,
199
+ args: [{
200
+ template: ``,
201
+ }]
202
+ }], ctorParameters: function () { return []; } });
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9iYXNlL3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFvQnRDLElBQWUsa0JBQWtCLEdBQWpDLE1BQWUsa0JBQ2xCLFNBQVEsaUJBQWlCO0lBR2YsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUU1QixVQUFVLEdBQW1CLElBQUksU0FBUyxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELHdCQUF3QixDQUFVO0lBQ2xDLHVCQUF1QixHQUFRLEVBQUUsQ0FBQztJQUVsQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLFlBQVksQ0FBNkI7SUFFeEMsbUJBQW1CLEdBQWlCO1FBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUM5QixJQUFJLEVBQUUsQ0FBQztRQUNQLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxZQUFZLEVBQUUsRUFBRTtL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LEVBQUUsQ0FBQztRQUUxQyxJQUFJLEdBQXVCLENBQUM7UUFDNUIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2QsSUFBSSxHQUFHLEtBQUssY0FBYyxFQUFFO2dCQUN4QixTQUFTO2FBQ1o7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDN0QsYUFBYTtnQkFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RCxDQUFDO3VHQXJQaUIsa0JBQWtCOzJGQUFsQixrQkFBa0IsMkVBRjFCLEVBQUU7O0FBRU0sa0JBQWtCO0lBSnZDLFlBQVksQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztHQUlsQixrQkFBa0IsQ0FzUHZDO1NBdFBxQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIdkMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsRUFBRTtpQkFDZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBRdWlja0ZpbHRlciB9IGZyb20gJ0BwYXBlcmxlc3MvY29yZSc7XG5pbXBvcnQgeyB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGZpbHRlciwgbWFwLCBwYWlyd2lzZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFzZUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2Zvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUZvcm1GaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBUYWJsZVF1aWNrRmlsdGVyID0gUXVpY2tGaWx0ZXIgJiB7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBtZXRyaWNOYW1lPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZU9wdGlvbnMge1xuICAgIHBhZ2VTaXplOiBudW1iZXI7XG4gICAgcGFnZTogbnVtYmVyO1xuICAgIHF1aWNrRmlsdGVyOiBUYWJsZVF1aWNrRmlsdGVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIGZpbHRlcnM6IGFueVtdO1xuICAgIHNlbGVjdGVkUm93czogYW55W107XG59XG5cbkBVbnRpbERlc3Ryb3koeyBjaGVja1Byb3BlcnRpZXM6IHRydWUgfSlcbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiBgYCxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVRhYmxlQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0XG57XG4gICAgcHJvdGVjdGVkIHF1aWNrRmlsdGVyczogYW55W10gPSBbXTtcblxuICAgIHB1YmxpYyBmaWx0ZXJGb3JtOiBGb3JtR3JvdXA8YW55PiA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG4gICAgcHVibGljIGZpbHRlckZvcm1RdWlja0ZpbHRlcktleT86IHN0cmluZztcbiAgICBwdWJsaWMgZGVmYXVsdEZpbHRlckZvcm1WYWx1ZXM6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIHBhZ2VTaXplRGVmYXVsdCA9IDEyO1xuICAgIHB1YmxpYyB0YWJsZU9wdGlvbnM/OiBGb3JtQ29udHJvbDxUYWJsZU9wdGlvbnM+O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFRhYmxlVmFsdWVzOiBUYWJsZU9wdGlvbnMgPSB7XG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplRGVmYXVsdCxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcXVpY2tGaWx0ZXI6IG51bGwsXG4gICAgICAgIHF1ZXJ5OiAnJyxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHNlbGVjdGVkUm93czogW10sXG4gICAgfTtcbiAgICBwdWJsaWMgZGVmYXVsdFRhYmxlVmFsdWVzOiBQYXJ0aWFsPFRhYmxlT3B0aW9ucz4gPSB7fTtcblxuICAgIGdldCBwYWdlU2l6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5wYWdlU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5wYWdlU2l6ZTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5wYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnBhZ2U7XG4gICAgfVxuXG4gICAgZ2V0IHF1aWNrRmlsdGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnF1aWNrRmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnF1aWNrRmlsdGVyO1xuICAgIH1cbiAgICBzZXQgcXVpY2tGaWx0ZXIocXVpY2tGaWx0ZXI6IFRhYmxlUXVpY2tGaWx0ZXIgfCBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBxdWlja0ZpbHRlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgcXVlcnkoKSB7XG4gICAgICAgIGlmICghdGhpcy50YWJsZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMucXVlcnk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZU9wdGlvbnMudmFsdWUucXVlcnk7XG4gICAgfVxuICAgIHNldCBxdWVyeShxdWVyeTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5maWx0ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLmZpbHRlcnM7XG4gICAgfVxuICAgIHNldCBmaWx0ZXJzKGZpbHRlcnM6IGFueVtdKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZFJvd3MoKSB7XG4gICAgICAgIGlmICghdGhpcy50YWJsZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMuc2VsZWN0ZWRSb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnNlbGVjdGVkUm93cztcbiAgICB9XG4gICAgc2V0IHNlbGVjdGVkUm93cyhzZWxlY3RlZFJvd3M6IGFueVtdKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZFJvd3MsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc2V0dGVyXG4gICAgZ2V0IHBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcyxcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdFRhYmxlVmFsdWVzLFxuICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuZGVmYXVsdFRhYmxlVmFsdWVzPy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplRGVmYXVsdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgdGFibGVWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucz8udmFsdWUgPz8ge307XG4gICAgfVxuXG4gICAgc2V0IHRhYmxlVmFsdWVzKHZhbHVlczogUGFydGlhbDxUYWJsZU9wdGlvbnM+KSB7XG4gICAgICAgIHRoaXMuX3NldFRhYmxlVmFsdWVzKHtcbiAgICAgICAgICAgIC4uLnRoaXMudGFibGVWYWx1ZXMsXG4gICAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucyA9IG5ldyBGb3JtQ29udHJvbDxUYWJsZU9wdGlvbnM+KHtcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcy5wYWdlU2l6ZSxcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFyc2VkRGVmYXVsdFRhYmxlVmFsdWVzLnBhZ2UsXG4gICAgICAgICAgICBxdWlja0ZpbHRlcjogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMucXVpY2tGaWx0ZXIsXG4gICAgICAgICAgICBxdWVyeTogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMucXVlcnksXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzOiB0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcy5zZWxlY3RlZFJvd3MsXG4gICAgICAgIH0pIGFzIEZvcm1Db250cm9sPFRhYmxlT3B0aW9ucz47XG5cbiAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgodGhpcy50YWJsZU9wdGlvbnMudmFsdWUpLFxuICAgICAgICAgICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgICAgICAgICAgbWFwKChbcHJldmlvdXMsIG5leHRdKSA9PiB0aGlzLl9nZXRDaGFuZ2VzKHByZXZpb3VzLCBuZXh0KSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKChjaGFuZ2VzOiBhbnkpID0+ICEhY2hhbmdlcyksXG4gICAgICAgICAgICAgICAgZGVib3VuY2UoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZXM/LnF1ZXJ5ICYmIE9iamVjdC5rZXlzKGNoYW5nZXMpPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lcigzMDApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVyKDApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZXM6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcz8uc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKT8ubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogVGFibGVPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXM/LnBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQYWdlT3JSZWZyZXNoKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmVzZXRUYWJsZShlbWl0RXZlbnQgPSB0cnVlLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zZXRUYWJsZVZhbHVlcyh0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcywgZW1pdEV2ZW50KTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUZvcm1GaWx0ZXJzKHZhbHVlczogYW55ID0gbnVsbCkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgPz8gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IHsgZmlsdGVycywgcXVpY2tGaWx0ZXIgfSA9IGNyZWF0ZUZvcm1GaWx0ZXJzKFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlcnMsXG4gICAgICAgICAgICB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChxdWlja0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlciA9IHF1aWNrRmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB9XG5cbiAgICByZXNldEZvcm1GaWx0ZXJzKHJlc2V0UXVpY2tGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXM6IGFueSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFF1aWNrRmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcnMuZmluZCgoZikgPT4gZi5kZWZhdWx0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNldFF1aWNrRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1trZXldID0gZGVmYXVsdFF1aWNrRmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB0aGlzLmRlZmF1bHRGaWx0ZXJGb3JtVmFsdWVzW2tleV0gPz8gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5zZXRWYWx1ZSh2YWx1ZXMpO1xuICAgICAgICB0aGlzLmFwcGx5Rm9ybUZpbHRlcnModmFsdWVzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JlZnJlc2goKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRQYWdlT3JSZWZyZXNoKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucy5nZXQoJ3BhZ2UnKT8uc2V0VmFsdWUoMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0VGFibGVWYWx1ZXMoZGF0YTogUGFydGlhbDxUYWJsZU9wdGlvbnM+LCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMudGFibGVPcHRpb25zPy5zZXRWYWx1ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRhYmxlT3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50IH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDaGFuZ2VzKHByZXZpb3VzOiBUYWJsZU9wdGlvbnMsIG5leHQ6IFRhYmxlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBQYXJ0aWFsPFRhYmxlT3B0aW9ucz4gPSB7fTtcblxuICAgICAgICBsZXQga2V5OiBrZXlvZiBUYWJsZU9wdGlvbnM7XG4gICAgICAgIGZvciAoa2V5IGluIG5leHQpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzZWxlY3RlZFJvd3MnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShwcmV2aW91c1trZXldKSAhPT0gSlNPTi5zdHJpbmdpZnkobmV4dFtrZXldKSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjaGFuZ2VzW2tleV0gPSBuZXh0W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoID8gY2hhbmdlcyA6IG51bGw7XG4gICAgfVxufVxuIl19