@swimlane/ngx-datatable 20.1.0 → 21.0.0-alpha.1

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 (139) hide show
  1. package/CHANGELOG.md +720 -0
  2. package/README.md +25 -4
  3. package/assets/app.css +4 -3
  4. package/assets/icons-reference.html +5 -1
  5. package/assets/icons.css +3 -2
  6. package/{fesm2020 → fesm2022}/swimlane-ngx-datatable.mjs +3404 -2536
  7. package/fesm2022/swimlane-ngx-datatable.mjs.map +1 -0
  8. package/index.css +224 -169
  9. package/index.scss +13 -3
  10. package/lib/components/body/body-cell.component.d.ts +28 -23
  11. package/lib/components/body/body-group-header-template.directive.d.ts +3 -4
  12. package/lib/components/body/body-group-header.directive.d.ts +14 -9
  13. package/lib/components/body/body-row-def.component.d.ts +34 -0
  14. package/lib/components/body/body-row-wrapper.component.d.ts +34 -22
  15. package/lib/components/body/body-row.component.d.ts +28 -34
  16. package/lib/components/body/body.component.d.ts +88 -69
  17. package/lib/components/body/ghost-loader/ghost-loader.component.d.ts +12 -0
  18. package/lib/components/body/progress-bar.component.d.ts +1 -1
  19. package/lib/components/body/scroller.component.d.ts +4 -7
  20. package/lib/components/body/selection.component.d.ts +21 -25
  21. package/lib/components/body/summary/summary-row.component.d.ts +4 -3
  22. package/lib/components/columns/column-cell.directive.d.ts +4 -3
  23. package/lib/components/columns/column-ghost-cell.directive.d.ts +6 -0
  24. package/lib/components/columns/column-header.directive.d.ts +3 -4
  25. package/lib/components/columns/column.directive.d.ts +43 -18
  26. package/lib/components/columns/tree.directive.d.ts +1 -2
  27. package/lib/components/datatable.component.d.ts +142 -76
  28. package/lib/components/footer/footer-template.directive.d.ts +3 -4
  29. package/lib/components/footer/footer.component.d.ts +3 -2
  30. package/lib/components/footer/footer.directive.d.ts +6 -4
  31. package/lib/components/footer/pager.component.d.ts +6 -4
  32. package/lib/components/header/header-cell.component.d.ts +18 -18
  33. package/lib/components/header/header.component.d.ts +41 -36
  34. package/lib/components/row-detail/row-detail-template.directive.d.ts +3 -4
  35. package/lib/components/row-detail/row-detail.directive.d.ts +9 -8
  36. package/lib/directives/disable-row.directive.d.ts +22 -0
  37. package/lib/directives/draggable.directive.d.ts +11 -8
  38. package/lib/directives/long-press.directive.d.ts +16 -5
  39. package/lib/directives/orderable.directive.d.ts +21 -10
  40. package/lib/directives/resizeable.directive.d.ts +7 -5
  41. package/lib/directives/visibility.directive.d.ts +2 -3
  42. package/lib/ngx-datatable.module.d.ts +29 -30
  43. package/lib/services/scrollbar-helper.service.d.ts +0 -1
  44. package/lib/types/internal.types.d.ts +31 -0
  45. package/lib/types/public.types.d.ts +142 -0
  46. package/lib/types/table-column.type.d.ts +39 -66
  47. package/lib/utils/column-helper.d.ts +2 -2
  48. package/lib/utils/column-prop-getters.d.ts +1 -1
  49. package/lib/utils/column.d.ts +7 -14
  50. package/lib/utils/keys.d.ts +6 -6
  51. package/lib/utils/math.d.ts +4 -3
  52. package/lib/utils/selection.d.ts +2 -2
  53. package/lib/utils/sort.d.ts +5 -5
  54. package/lib/utils/table-token.d.ts +7 -0
  55. package/lib/utils/tree.d.ts +2 -2
  56. package/package.json +9 -17
  57. package/public-api.d.ts +4 -11
  58. package/themes/_ghost.scss +22 -0
  59. package/themes/_rows.scss +22 -0
  60. package/themes/bootstrap.css +117 -65
  61. package/themes/bootstrap.scss +27 -3
  62. package/themes/dark.css +101 -70
  63. package/themes/dark.scss +12 -0
  64. package/themes/material.css +344 -260
  65. package/themes/material.scss +52 -11
  66. package/esm2020/lib/components/body/body-cell.component.mjs +0 -432
  67. package/esm2020/lib/components/body/body-group-header-template.directive.mjs +0 -16
  68. package/esm2020/lib/components/body/body-group-header.directive.mjs +0 -62
  69. package/esm2020/lib/components/body/body-row-wrapper.component.mjs +0 -140
  70. package/esm2020/lib/components/body/body-row.component.mjs +0 -262
  71. package/esm2020/lib/components/body/body.component.mjs +0 -863
  72. package/esm2020/lib/components/body/progress-bar.component.mjs +0 -27
  73. package/esm2020/lib/components/body/scroller.component.mjs +0 -91
  74. package/esm2020/lib/components/body/selection.component.mjs +0 -150
  75. package/esm2020/lib/components/body/summary/summary-row.component.mjs +0 -105
  76. package/esm2020/lib/components/columns/column-cell.directive.mjs +0 -14
  77. package/esm2020/lib/components/columns/column-header.directive.mjs +0 -14
  78. package/esm2020/lib/components/columns/column.directive.mjs +0 -98
  79. package/esm2020/lib/components/columns/tree.directive.mjs +0 -14
  80. package/esm2020/lib/components/datatable.component.mjs +0 -1008
  81. package/esm2020/lib/components/footer/footer-template.directive.mjs +0 -14
  82. package/esm2020/lib/components/footer/footer.component.mjs +0 -128
  83. package/esm2020/lib/components/footer/footer.directive.mjs +0 -35
  84. package/esm2020/lib/components/footer/pager.component.mjs +0 -181
  85. package/esm2020/lib/components/header/header-cell.component.mjs +0 -243
  86. package/esm2020/lib/components/header/header.component.mjs +0 -376
  87. package/esm2020/lib/components/row-detail/row-detail-template.directive.mjs +0 -16
  88. package/esm2020/lib/components/row-detail/row-detail.directive.mjs +0 -63
  89. package/esm2020/lib/directives/draggable.directive.mjs +0 -108
  90. package/esm2020/lib/directives/long-press.directive.mjs +0 -117
  91. package/esm2020/lib/directives/orderable.directive.mjs +0 -136
  92. package/esm2020/lib/directives/resizeable.directive.mjs +0 -93
  93. package/esm2020/lib/directives/visibility.directive.mjs +0 -63
  94. package/esm2020/lib/events.mjs +0 -7
  95. package/esm2020/lib/ngx-datatable.module.mjs +0 -139
  96. package/esm2020/lib/services/column-changes.service.mjs +0 -24
  97. package/esm2020/lib/services/dimensions-helper.service.mjs +0 -17
  98. package/esm2020/lib/services/scrollbar-helper.service.mjs +0 -37
  99. package/esm2020/lib/types/click.type.mjs +0 -6
  100. package/esm2020/lib/types/column-mode.type.mjs +0 -7
  101. package/esm2020/lib/types/contextmenu.type.mjs +0 -6
  102. package/esm2020/lib/types/selection.type.mjs +0 -9
  103. package/esm2020/lib/types/sort-direction.type.mjs +0 -6
  104. package/esm2020/lib/types/sort-prop-dir.type.mjs +0 -2
  105. package/esm2020/lib/types/sort.type.mjs +0 -6
  106. package/esm2020/lib/types/table-column.type.mjs +0 -2
  107. package/esm2020/lib/utils/camel-case.mjs +0 -28
  108. package/esm2020/lib/utils/column-helper.mjs +0 -95
  109. package/esm2020/lib/utils/column-prop-getters.mjs +0 -96
  110. package/esm2020/lib/utils/column.mjs +0 -69
  111. package/esm2020/lib/utils/elm-from-point.mjs +0 -38
  112. package/esm2020/lib/utils/id.mjs +0 -8
  113. package/esm2020/lib/utils/keys.mjs +0 -10
  114. package/esm2020/lib/utils/math.mjs +0 -146
  115. package/esm2020/lib/utils/prefixes.mjs +0 -38
  116. package/esm2020/lib/utils/row-height-cache.mjs +0 -138
  117. package/esm2020/lib/utils/selection.mjs +0 -40
  118. package/esm2020/lib/utils/sort.mjs +0 -127
  119. package/esm2020/lib/utils/throttle.mjs +0 -60
  120. package/esm2020/lib/utils/translate.mjs +0 -25
  121. package/esm2020/lib/utils/tree.mjs +0 -103
  122. package/esm2020/public-api.mjs +0 -64
  123. package/esm2020/swimlane-ngx-datatable.mjs +0 -5
  124. package/fesm2015/swimlane-ngx-datatable.mjs +0 -5979
  125. package/fesm2015/swimlane-ngx-datatable.mjs.map +0 -1
  126. package/fesm2020/swimlane-ngx-datatable.mjs.map +0 -1
  127. package/lib/events.d.ts +0 -3
  128. package/lib/services/dimensions-helper.service.d.ts +0 -10
  129. package/lib/types/click.type.d.ts +0 -4
  130. package/lib/types/column-mode.type.d.ts +0 -5
  131. package/lib/types/contextmenu.type.d.ts +0 -4
  132. package/lib/types/selection.type.d.ts +0 -7
  133. package/lib/types/sort-direction.type.d.ts +0 -4
  134. package/lib/types/sort-prop-dir.type.d.ts +0 -6
  135. package/lib/types/sort.type.d.ts +0 -4
  136. package/lib/utils/elm-from-point.d.ts +0 -8
  137. package/lib/utils/prefixes.d.ts +0 -1
  138. package/lib/utils/translate.d.ts +0 -1
  139. /package/{swimlane-ngx-datatable.d.ts → index.d.ts} +0 -0
@@ -1,243 +0,0 @@
1
- import { Component, Input, EventEmitter, Output, HostBinding, HostListener, ChangeDetectionStrategy } from '@angular/core';
2
- import { SelectionType } from '../../types/selection.type';
3
- import { nextSortDir } from '../../utils/sort';
4
- import { SortDirection } from '../../types/sort-direction.type';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- export class DataTableHeaderCellComponent {
8
- constructor(cd) {
9
- this.cd = cd;
10
- this.sort = new EventEmitter();
11
- this.select = new EventEmitter();
12
- this.columnContextmenu = new EventEmitter(false);
13
- this.sortFn = this.onSort.bind(this);
14
- this.selectFn = this.select.emit.bind(this.select);
15
- this.cellContext = {
16
- column: this.column,
17
- sortDir: this.sortDir,
18
- sortFn: this.sortFn,
19
- allRowsSelected: this.allRowsSelected,
20
- selectFn: this.selectFn
21
- };
22
- }
23
- set allRowsSelected(value) {
24
- this._allRowsSelected = value;
25
- this.cellContext.allRowsSelected = value;
26
- }
27
- get allRowsSelected() {
28
- return this._allRowsSelected;
29
- }
30
- set column(column) {
31
- this._column = column;
32
- this.cellContext.column = column;
33
- this.cd.markForCheck();
34
- }
35
- get column() {
36
- return this._column;
37
- }
38
- set sorts(val) {
39
- this._sorts = val;
40
- this.sortDir = this.calcSortDir(val);
41
- this.cellContext.sortDir = this.sortDir;
42
- this.sortClass = this.calcSortClass(this.sortDir);
43
- this.cd.markForCheck();
44
- }
45
- get sorts() {
46
- return this._sorts;
47
- }
48
- get columnCssClasses() {
49
- let cls = 'datatable-header-cell';
50
- if (this.column.sortable)
51
- cls += ' sortable';
52
- if (this.column.resizeable)
53
- cls += ' resizeable';
54
- if (this.column.headerClass) {
55
- if (typeof this.column.headerClass === 'string') {
56
- cls += ' ' + this.column.headerClass;
57
- }
58
- else if (typeof this.column.headerClass === 'function') {
59
- const res = this.column.headerClass({
60
- column: this.column
61
- });
62
- if (typeof res === 'string') {
63
- cls += res;
64
- }
65
- else if (typeof res === 'object') {
66
- const keys = Object.keys(res);
67
- for (const k of keys) {
68
- if (res[k] === true)
69
- cls += ` ${k}`;
70
- }
71
- }
72
- }
73
- }
74
- const sortDir = this.sortDir;
75
- if (sortDir) {
76
- cls += ` sort-active sort-${sortDir}`;
77
- }
78
- return cls;
79
- }
80
- get name() {
81
- // guaranteed to have a value by setColumnDefaults() in column-helper.ts
82
- return this.column.headerTemplate === undefined ? this.column.name : undefined;
83
- }
84
- get minWidth() {
85
- return this.column.minWidth;
86
- }
87
- get maxWidth() {
88
- return this.column.maxWidth;
89
- }
90
- get width() {
91
- return this.column.width;
92
- }
93
- get isCheckboxable() {
94
- return this.column.checkboxable && this.column.headerCheckboxable && this.selectionType === SelectionType.checkbox;
95
- }
96
- onContextmenu($event) {
97
- this.columnContextmenu.emit({ event: $event, column: this.column });
98
- }
99
- ngOnInit() {
100
- this.sortClass = this.calcSortClass(this.sortDir);
101
- }
102
- calcSortDir(sorts) {
103
- if (sorts && this.column) {
104
- const sort = sorts.find((s) => {
105
- return s.prop === this.column.prop;
106
- });
107
- if (sort)
108
- return sort.dir;
109
- }
110
- }
111
- onSort() {
112
- if (!this.column.sortable)
113
- return;
114
- const newValue = nextSortDir(this.sortType, this.sortDir);
115
- this.sort.emit({
116
- column: this.column,
117
- prevValue: this.sortDir,
118
- newValue
119
- });
120
- }
121
- calcSortClass(sortDir) {
122
- if (!this.cellContext.column.sortable)
123
- return;
124
- if (sortDir === SortDirection.asc) {
125
- return `sort-btn sort-asc ${this.sortAscendingIcon}`;
126
- }
127
- else if (sortDir === SortDirection.desc) {
128
- return `sort-btn sort-desc ${this.sortDescendingIcon}`;
129
- }
130
- else {
131
- return `sort-btn ${this.sortUnsetIcon}`;
132
- }
133
- }
134
- }
135
- DataTableHeaderCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DataTableHeaderCellComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
136
- DataTableHeaderCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: DataTableHeaderCellComponent, selector: "datatable-header-cell", inputs: { sortType: "sortType", sortAscendingIcon: "sortAscendingIcon", sortDescendingIcon: "sortDescendingIcon", sortUnsetIcon: "sortUnsetIcon", isTarget: "isTarget", targetMarkerTemplate: "targetMarkerTemplate", targetMarkerContext: "targetMarkerContext", allRowsSelected: "allRowsSelected", selectionType: "selectionType", column: "column", headerHeight: "headerHeight", sorts: "sorts" }, outputs: { sort: "sort", select: "select", columnContextmenu: "columnContextmenu" }, host: { listeners: { "contextmenu": "onContextmenu($event)" }, properties: { "style.height.px": "this.headerHeight", "class": "this.columnCssClasses", "attr.title": "this.name", "style.minWidth.px": "this.minWidth", "style.maxWidth.px": "this.maxWidth", "style.width.px": "this.width" }, classAttribute: "datatable-header-cell" }, ngImport: i0, template: `
137
- <div class="datatable-header-cell-template-wrap">
138
- <ng-template
139
- *ngIf="isTarget"
140
- [ngTemplateOutlet]="targetMarkerTemplate"
141
- [ngTemplateOutletContext]="targetMarkerContext"
142
- >
143
- </ng-template>
144
- <label *ngIf="isCheckboxable" class="datatable-checkbox">
145
- <input type="checkbox" [checked]="allRowsSelected" (change)="select.emit(!allRowsSelected)" />
146
- </label>
147
- <span *ngIf="!column.headerTemplate" class="datatable-header-cell-wrapper">
148
- <span class="datatable-header-cell-label draggable" (click)="onSort()" [innerHTML]="name"> </span>
149
- </span>
150
- <ng-template
151
- *ngIf="column.headerTemplate"
152
- [ngTemplateOutlet]="column.headerTemplate"
153
- [ngTemplateOutletContext]="cellContext"
154
- >
155
- </ng-template>
156
- <span (click)="onSort()" [class]="sortClass"> </span>
157
- </div>
158
- `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DataTableHeaderCellComponent, decorators: [{
160
- type: Component,
161
- args: [{
162
- selector: 'datatable-header-cell',
163
- template: `
164
- <div class="datatable-header-cell-template-wrap">
165
- <ng-template
166
- *ngIf="isTarget"
167
- [ngTemplateOutlet]="targetMarkerTemplate"
168
- [ngTemplateOutletContext]="targetMarkerContext"
169
- >
170
- </ng-template>
171
- <label *ngIf="isCheckboxable" class="datatable-checkbox">
172
- <input type="checkbox" [checked]="allRowsSelected" (change)="select.emit(!allRowsSelected)" />
173
- </label>
174
- <span *ngIf="!column.headerTemplate" class="datatable-header-cell-wrapper">
175
- <span class="datatable-header-cell-label draggable" (click)="onSort()" [innerHTML]="name"> </span>
176
- </span>
177
- <ng-template
178
- *ngIf="column.headerTemplate"
179
- [ngTemplateOutlet]="column.headerTemplate"
180
- [ngTemplateOutletContext]="cellContext"
181
- >
182
- </ng-template>
183
- <span (click)="onSort()" [class]="sortClass"> </span>
184
- </div>
185
- `,
186
- host: {
187
- class: 'datatable-header-cell'
188
- },
189
- changeDetection: ChangeDetectionStrategy.OnPush
190
- }]
191
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { sortType: [{
192
- type: Input
193
- }], sortAscendingIcon: [{
194
- type: Input
195
- }], sortDescendingIcon: [{
196
- type: Input
197
- }], sortUnsetIcon: [{
198
- type: Input
199
- }], isTarget: [{
200
- type: Input
201
- }], targetMarkerTemplate: [{
202
- type: Input
203
- }], targetMarkerContext: [{
204
- type: Input
205
- }], allRowsSelected: [{
206
- type: Input
207
- }], selectionType: [{
208
- type: Input
209
- }], column: [{
210
- type: Input
211
- }], headerHeight: [{
212
- type: HostBinding,
213
- args: ['style.height.px']
214
- }, {
215
- type: Input
216
- }], sorts: [{
217
- type: Input
218
- }], sort: [{
219
- type: Output
220
- }], select: [{
221
- type: Output
222
- }], columnContextmenu: [{
223
- type: Output
224
- }], columnCssClasses: [{
225
- type: HostBinding,
226
- args: ['class']
227
- }], name: [{
228
- type: HostBinding,
229
- args: ['attr.title']
230
- }], minWidth: [{
231
- type: HostBinding,
232
- args: ['style.minWidth.px']
233
- }], maxWidth: [{
234
- type: HostBinding,
235
- args: ['style.maxWidth.px']
236
- }], width: [{
237
- type: HostBinding,
238
- args: ['style.width.px']
239
- }], onContextmenu: [{
240
- type: HostListener,
241
- args: ['contextmenu', ['$event']]
242
- }] } });
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLWNlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3dpbWxhbmUvbmd4LWRhdGF0YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci1jZWxsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUNOLFdBQVcsRUFDWCxZQUFZLEVBQ1osdUJBQXVCLEVBRXhCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFnQ2hFLE1BQU0sT0FBTyw0QkFBNEI7SUF3SHZDLFlBQW9CLEVBQXFCO1FBQXJCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBeEUvQixTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksWUFBWSxDQUFxQyxLQUFLLENBQUMsQ0FBQztRQTREMUYsV0FBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR2hDLGFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBUTVDLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIs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O2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFRRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVPLE1BQU07c0JBQWxCLEtBQUs7Z0JBWU4sWUFBWTtzQkFGWCxXQUFXO3VCQUFDLGlCQUFpQjs7c0JBQzdCLEtBQUs7Z0JBR08sS0FBSztzQkFBakIsS0FBSztnQkFZSSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFHSCxnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsT0FBTztnQkFrQ2hCLElBQUk7c0JBRFAsV0FBVzt1QkFBQyxZQUFZO2dCQU9yQixRQUFRO3NCQURYLFdBQVc7dUJBQUMsbUJBQW1CO2dCQU01QixRQUFRO3NCQURYLFdBQVc7dUJBQUMsbUJBQW1CO2dCQU01QixLQUFLO3NCQURSLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQThCN0IsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTb3J0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzL3NvcnQudHlwZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvc2VsZWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS1jb2x1bW4udHlwZSc7XG5pbXBvcnQgeyBuZXh0U29ydERpciB9IGZyb20gJy4uLy4uL3V0aWxzL3NvcnQnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3NvcnQtZGlyZWN0aW9uLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhdGFibGUtaGVhZGVyLWNlbGwnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJkYXRhdGFibGUtaGVhZGVyLWNlbGwtdGVtcGxhdGUtd3JhcFwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICpuZ0lmPVwiaXNUYXJnZXRcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0YXJnZXRNYXJrZXJUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ0YXJnZXRNYXJrZXJDb250ZXh0XCJcbiAgICAgID5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bGFiZWwgKm5nSWY9XCJpc0NoZWNrYm94YWJsZVwiIGNsYXNzPVwiZGF0YXRhYmxlLWNoZWNrYm94XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIiAoY2hhbmdlKT1cInNlbGVjdC5lbWl0KCFhbGxSb3dzU2VsZWN0ZWQpXCIgLz5cbiAgICAgIDwvbGFiZWw+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIiBjbGFzcz1cImRhdGF0YWJsZS1oZWFkZXItY2VsbC13cmFwcGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YXRhYmxlLWhlYWRlci1jZWxsLWxhYmVsIGRyYWdnYWJsZVwiIChjbGljayk9XCJvblNvcnQoKVwiIFtpbm5lckhUTUxdPVwibmFtZVwiPiA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgKm5nSWY9XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiY2VsbENvbnRleHRcIlxuICAgICAgPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxzcGFuIChjbGljayk9XCJvblNvcnQoKVwiIFtjbGFzc109XCJzb3J0Q2xhc3NcIj4gPC9zcGFuPlxuICAgIDwvZGl2PlxuICBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdkYXRhdGFibGUtaGVhZGVyLWNlbGwnXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUhlYWRlckNlbGxDb21wb25lbnQge1xuICBASW5wdXQoKSBzb3J0VHlwZTogU29ydFR5cGU7XG4gIEBJbnB1dCgpIHNvcnRBc2NlbmRpbmdJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNvcnREZXNjZW5kaW5nSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzb3J0VW5zZXRJY29uOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgaXNUYXJnZXQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRhcmdldE1hcmtlclRlbXBsYXRlOiBhbnk7XG4gIEBJbnB1dCgpIHRhcmdldE1hcmtlckNvbnRleHQ6IGFueTtcblxuICBfYWxsUm93c1NlbGVjdGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHNldCBhbGxSb3dzU2VsZWN0ZWQodmFsdWUpIHtcbiAgICB0aGlzLl9hbGxSb3dzU2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmNlbGxDb250ZXh0LmFsbFJvd3NTZWxlY3RlZCA9IHZhbHVlO1xuICB9XG4gIGdldCBhbGxSb3dzU2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbFJvd3NTZWxlY3RlZDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGU6IFNlbGVjdGlvblR5cGU7XG5cbiAgQElucHV0KCkgc2V0IGNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5fY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMuY2VsbENvbnRleHQuY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgY29sdW1uKCk6IFRhYmxlQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQucHgnKVxuICBASW5wdXQoKVxuICBoZWFkZXJIZWlnaHQ6IG51bWJlcjtcblxuICBASW5wdXQoKSBzZXQgc29ydHModmFsOiBhbnlbXSkge1xuICAgIHRoaXMuX3NvcnRzID0gdmFsO1xuICAgIHRoaXMuc29ydERpciA9IHRoaXMuY2FsY1NvcnREaXIodmFsKTtcbiAgICB0aGlzLmNlbGxDb250ZXh0LnNvcnREaXIgPSB0aGlzLnNvcnREaXI7XG4gICAgdGhpcy5zb3J0Q2xhc3MgPSB0aGlzLmNhbGNTb3J0Q2xhc3ModGhpcy5zb3J0RGlyKTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHNvcnRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydHM7XG4gIH1cblxuICBAT3V0cHV0KCkgc29ydDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY29sdW1uQ29udGV4dG1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IGNvbHVtbjogYW55IH0+KGZhbHNlKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGNvbHVtbkNzc0NsYXNzZXMoKTogYW55IHtcbiAgICBsZXQgY2xzID0gJ2RhdGF0YWJsZS1oZWFkZXItY2VsbCc7XG5cbiAgICBpZiAodGhpcy5jb2x1bW4uc29ydGFibGUpIGNscyArPSAnIHNvcnRhYmxlJztcbiAgICBpZiAodGhpcy5jb2x1bW4ucmVzaXplYWJsZSkgY2xzICs9ICcgcmVzaXplYWJsZSc7XG4gICAgaWYgKHRoaXMuY29sdW1uLmhlYWRlckNsYXNzKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29sdW1uLmhlYWRlckNsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICBjbHMgKz0gJyAnICsgdGhpcy5jb2x1bW4uaGVhZGVyQ2xhc3M7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNvbHVtbi5oZWFkZXJDbGFzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLmNvbHVtbi5oZWFkZXJDbGFzcyh7XG4gICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjbHMgKz0gcmVzO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlcyk7XG4gICAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmIChyZXNba10gPT09IHRydWUpIGNscyArPSBgICR7a31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnREaXIgPSB0aGlzLnNvcnREaXI7XG4gICAgaWYgKHNvcnREaXIpIHtcbiAgICAgIGNscyArPSBgIHNvcnQtYWN0aXZlIHNvcnQtJHtzb3J0RGlyfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNscztcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50aXRsZScpXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gZ3VhcmFudGVlZCB0byBoYXZlIGEgdmFsdWUgYnkgc2V0Q29sdW1uRGVmYXVsdHMoKSBpbiBjb2x1bW4taGVscGVyLnRzXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uLmhlYWRlclRlbXBsYXRlID09PSB1bmRlZmluZWQgPyB0aGlzLmNvbHVtbi5uYW1lIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5taW5XaWR0aC5weCcpXG4gIGdldCBtaW5XaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbi5taW5XaWR0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUubWF4V2lkdGgucHgnKVxuICBnZXQgbWF4V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW4ubWF4V2lkdGg7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLnB4JylcbiAgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uLndpZHRoO1xuICB9XG5cbiAgZ2V0IGlzQ2hlY2tib3hhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbi5jaGVja2JveGFibGUgJiYgdGhpcy5jb2x1bW4uaGVhZGVyQ2hlY2tib3hhYmxlICYmIHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gU2VsZWN0aW9uVHlwZS5jaGVja2JveDtcbiAgfVxuXG4gIHNvcnRGbiA9IHRoaXMub25Tb3J0LmJpbmQodGhpcyk7XG4gIHNvcnRDbGFzczogc3RyaW5nO1xuICBzb3J0RGlyOiBTb3J0RGlyZWN0aW9uO1xuICBzZWxlY3RGbiA9IHRoaXMuc2VsZWN0LmVtaXQuYmluZCh0aGlzLnNlbGVjdCk7XG5cbiAgY2VsbENvbnRleHQ6IGFueTtcblxuICBwcml2YXRlIF9jb2x1bW46IFRhYmxlQ29sdW1uO1xuICBwcml2YXRlIF9zb3J0czogYW55W107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB0aGlzLmNlbGxDb250ZXh0ID0ge1xuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgIHNvcnREaXI6IHRoaXMuc29ydERpcixcbiAgICAgIHNvcnRGbjogdGhpcy5zb3J0Rm4sXG4gICAgICBhbGxSb3dzU2VsZWN0ZWQ6IHRoaXMuYWxsUm93c1NlbGVjdGVkLFxuICAgICAgc2VsZWN0Rm46IHRoaXMuc2VsZWN0Rm5cbiAgICB9O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY29udGV4dG1lbnUnLCBbJyRldmVudCddKVxuICBvbkNvbnRleHRtZW51KCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uQ29udGV4dG1lbnUuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIGNvbHVtbjogdGhpcy5jb2x1bW4gfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNvcnRDbGFzcyA9IHRoaXMuY2FsY1NvcnRDbGFzcyh0aGlzLnNvcnREaXIpO1xuICB9XG5cbiAgY2FsY1NvcnREaXIoc29ydHM6IGFueVtdKTogYW55IHtcbiAgICBpZiAoc29ydHMgJiYgdGhpcy5jb2x1bW4pIHtcbiAgICAgIGNvbnN0IHNvcnQgPSBzb3J0cy5maW5kKChzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHMucHJvcCA9PT0gdGhpcy5jb2x1bW4ucHJvcDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc29ydCkgcmV0dXJuIHNvcnQuZGlyO1xuICAgIH1cbiAgfVxuXG4gIG9uU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uLnNvcnRhYmxlKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IG5leHRTb3J0RGlyKHRoaXMuc29ydFR5cGUsIHRoaXMuc29ydERpcik7XG4gICAgdGhpcy5zb3J0LmVtaXQoe1xuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgIHByZXZWYWx1ZTogdGhpcy5zb3J0RGlyLFxuICAgICAgbmV3VmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGNTb3J0Q2xhc3Moc29ydERpcjogU29ydERpcmVjdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNlbGxDb250ZXh0LmNvbHVtbi5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGlmIChzb3J0RGlyID09PSBTb3J0RGlyZWN0aW9uLmFzYykge1xuICAgICAgcmV0dXJuIGBzb3J0LWJ0biBzb3J0LWFzYyAke3RoaXMuc29ydEFzY2VuZGluZ0ljb259YDtcbiAgICB9IGVsc2UgaWYgKHNvcnREaXIgPT09IFNvcnREaXJlY3Rpb24uZGVzYykge1xuICAgICAgcmV0dXJuIGBzb3J0LWJ0biBzb3J0LWRlc2MgJHt0aGlzLnNvcnREZXNjZW5kaW5nSWNvbn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYHNvcnQtYnRuICR7dGhpcy5zb3J0VW5zZXRJY29ufWA7XG4gICAgfVxuICB9XG59XG4iXX0=