atr-components 0.2.417 → 2.0.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 (136) hide show
  1. package/atr-components.module.d.ts +9 -9
  2. package/atr-public-api.d.ts +53 -53
  3. package/core/animations/animations.d.ts +1 -1
  4. package/core/animations/fly-in.d.ts +1 -1
  5. package/core/animations/scroll-screen.d.ts +1 -1
  6. package/core/auth/auth.guard.d.ts +11 -11
  7. package/core/base/atr-common.d.ts +347 -347
  8. package/core/directive/error-img.directive.d.ts +10 -10
  9. package/core/directive/hq-spin.directive.d.ts +13 -13
  10. package/core/directive/role.directive.d.ts +16 -16
  11. package/core/interceptor/base.interceptor.d.ts +17 -17
  12. package/core/ngz-module/cus-zorro-antd.module.d.ts +75 -75
  13. package/core/pipe/china-num.pipe.d.ts +7 -7
  14. package/core/pipe/count.pipe.d.ts +7 -7
  15. package/core/pipe/day.pipe.d.ts +8 -8
  16. package/core/pipe/defaultVal.pipe.d.ts +7 -7
  17. package/core/pipe/dicts.pipe.d.ts +10 -10
  18. package/core/pipe/image-pipe.pipe.d.ts +8 -8
  19. package/core/pipe/is-empty.pipe.d.ts +7 -7
  20. package/core/pipe/is-not-empty.pipe.d.ts +7 -7
  21. package/core/pipe/oss.pipe.d.ts +7 -7
  22. package/core/pipe/ossStatic.pipe.d.ts +7 -7
  23. package/core/pipe/pipe-module.module.d.ts +21 -21
  24. package/core/pipe/remove-html.pipe.d.ts +10 -10
  25. package/core/pipe/safe-compute.pipe.d.ts +7 -7
  26. package/core/pipe/safe-html.pipe.d.ts +10 -10
  27. package/core/pipe/safe-url.pipe.d.ts +10 -10
  28. package/core/routereuse/atr-reuse-strategy.d.ts +19 -19
  29. package/core/services/dict/dict.service.d.ts +20 -20
  30. package/core/services/http.service.d.ts +31 -31
  31. package/core/services/menu.service.d.ts +29 -29
  32. package/core/services/upload-oss.service.d.ts +14 -14
  33. package/core/utils/ToolsUtil.d.ts +180 -180
  34. package/core/utils/localstorage.util.d.ts +15 -15
  35. package/core/utils/sessionstorage.util.d.ts +15 -15
  36. package/{esm2020 → esm2022}/atr-components.mjs +4 -4
  37. package/esm2022/atr-components.module.mjs +36 -0
  38. package/{esm2020 → esm2022}/atr-public-api.mjs +54 -54
  39. package/{esm2020 → esm2022}/core/animations/animations.mjs +9 -9
  40. package/{esm2020 → esm2022}/core/animations/fly-in.mjs +18 -18
  41. package/{esm2020 → esm2022}/core/animations/scroll-screen.mjs +22 -22
  42. package/{esm2020 → esm2022}/core/auth/auth.guard.mjs +37 -37
  43. package/esm2022/core/base/atr-common.mjs +47 -0
  44. package/{esm2020 → esm2022}/core/directive/error-img.directive.mjs +31 -31
  45. package/{esm2020 → esm2022}/core/directive/hq-spin.directive.mjs +48 -48
  46. package/esm2022/core/directive/role.directive.mjs +69 -0
  47. package/{esm2020 → esm2022}/core/interceptor/base.interceptor.mjs +165 -165
  48. package/{esm2020 → esm2022}/core/ngz-module/cus-zorro-antd.module.mjs +292 -292
  49. package/{esm2020 → esm2022}/core/pipe/china-num.pipe.mjs +36 -36
  50. package/{esm2020 → esm2022}/core/pipe/count.pipe.mjs +34 -34
  51. package/{esm2020 → esm2022}/core/pipe/day.pipe.mjs +24 -24
  52. package/{esm2020 → esm2022}/core/pipe/defaultVal.pipe.mjs +23 -23
  53. package/{esm2020 → esm2022}/core/pipe/dicts.pipe.mjs +28 -28
  54. package/{esm2020 → esm2022}/core/pipe/image-pipe.pipe.mjs +17 -17
  55. package/{esm2020 → esm2022}/core/pipe/is-empty.pipe.mjs +20 -20
  56. package/{esm2020 → esm2022}/core/pipe/is-not-empty.pipe.mjs +17 -17
  57. package/{esm2020 → esm2022}/core/pipe/oss.pipe.mjs +17 -17
  58. package/{esm2020 → esm2022}/core/pipe/ossStatic.pipe.mjs +17 -17
  59. package/esm2022/core/pipe/pipe-module.module.mjs +38 -0
  60. package/{esm2020 → esm2022}/core/pipe/remove-html.pipe.mjs +21 -21
  61. package/{esm2020 → esm2022}/core/pipe/safe-compute.pipe.mjs +23 -23
  62. package/{esm2020 → esm2022}/core/pipe/safe-html.pipe.mjs +20 -20
  63. package/{esm2020 → esm2022}/core/pipe/safe-url.pipe.mjs +20 -20
  64. package/esm2022/core/routereuse/atr-reuse-strategy.mjs +79 -0
  65. package/esm2022/core/services/dict/dict.service.mjs +152 -0
  66. package/{esm2020 → esm2022}/core/services/http.service.mjs +306 -306
  67. package/{esm2020 → esm2022}/core/services/menu.service.mjs +130 -130
  68. package/{esm2020 → esm2022}/core/services/upload-oss.service.mjs +74 -74
  69. package/esm2022/core/utils/ToolsUtil.mjs +622 -0
  70. package/{esm2020 → esm2022}/core/utils/localstorage.util.mjs +94 -94
  71. package/{esm2020 → esm2022}/core/utils/sessionstorage.util.mjs +72 -72
  72. package/{esm2020 → esm2022}/lib/hello/hello.component.mjs +15 -15
  73. package/esm2022/lib/hello/hello.module.mjs +20 -0
  74. package/esm2022/lib/shared/atr-shared.module.mjs +204 -0
  75. package/esm2022/lib/shared/echarts/echarts.component.mjs +77 -0
  76. package/esm2022/lib/shared/form/form.component.mjs +574 -0
  77. package/esm2022/lib/shared/img-canvas/img-canvas.component.mjs +132 -0
  78. package/esm2022/lib/shared/local-upload/local-upload.component.mjs +68 -0
  79. package/esm2022/lib/shared/quill-editor/quill-editor.component.mjs +248 -0
  80. package/esm2022/lib/shared/select-icons/select-icons.component.mjs +90 -0
  81. package/{esm2020 → esm2022}/lib/shared/select-tree/select-tree.component.mjs +55 -55
  82. package/{esm2020 → esm2022}/lib/shared/service/busi.service.mjs +69 -69
  83. package/{esm2020 → esm2022}/lib/shared/share.service.mjs +107 -107
  84. package/esm2022/lib/shared/table/table-form-item/table-form-item.component.mjs +96 -0
  85. package/esm2022/lib/shared/table/table-td/table-td.component.mjs +165 -0
  86. package/esm2022/lib/shared/table/table.component.mjs +749 -0
  87. package/{esm2020 → esm2022}/lib/shared/upload/upload.component.mjs +274 -274
  88. package/{esm2020 → esm2022}/lib/shared/validators/atr-validtors.mjs +8 -8
  89. package/esm2022/lib/shared/video/video.component.mjs +16 -0
  90. package/esm2022/lib/shared/view-form/view-form.component.mjs +181 -0
  91. package/{fesm2020 → fesm2022}/atr-components.mjs +5311 -5312
  92. package/fesm2022/atr-components.mjs.map +1 -0
  93. package/{atr-components.d.ts → index.d.ts} +5 -5
  94. package/lib/hello/hello.component.d.ts +8 -8
  95. package/lib/hello/hello.module.d.ts +8 -8
  96. package/lib/shared/atr-shared.module.d.ts +36 -33
  97. package/lib/shared/echarts/echarts.component.d.ts +34 -34
  98. package/lib/shared/form/form.component.d.ts +45 -45
  99. package/lib/shared/img-canvas/img-canvas.component.d.ts +28 -28
  100. package/lib/shared/local-upload/local-upload.component.d.ts +22 -22
  101. package/lib/shared/quill-editor/quill-editor.component.d.ts +45 -45
  102. package/lib/shared/select-icons/select-icons.component.d.ts +24 -24
  103. package/lib/shared/select-tree/select-tree.component.d.ts +23 -23
  104. package/lib/shared/service/busi.service.d.ts +20 -20
  105. package/lib/shared/share.service.d.ts +14 -14
  106. package/lib/shared/table/table-form-item/table-form-item.component.d.ts +25 -25
  107. package/lib/shared/table/table-td/table-td.component.d.ts +26 -26
  108. package/lib/shared/table/table.component.d.ts +94 -94
  109. package/lib/shared/upload/upload.component.d.ts +53 -53
  110. package/lib/shared/validators/atr-validtors.d.ts +2 -2
  111. package/lib/shared/video/video.component.d.ts +7 -7
  112. package/lib/shared/view-form/view-form.component.d.ts +28 -28
  113. package/package.json +14 -22
  114. package/esm2020/atr-components.module.mjs +0 -38
  115. package/esm2020/core/base/atr-common.mjs +0 -47
  116. package/esm2020/core/directive/role.directive.mjs +0 -69
  117. package/esm2020/core/pipe/pipe-module.module.mjs +0 -40
  118. package/esm2020/core/routereuse/atr-reuse-strategy.mjs +0 -79
  119. package/esm2020/core/services/dict/dict.service.mjs +0 -152
  120. package/esm2020/core/utils/ToolsUtil.mjs +0 -622
  121. package/esm2020/lib/hello/hello.module.mjs +0 -22
  122. package/esm2020/lib/shared/atr-shared.module.mjs +0 -199
  123. package/esm2020/lib/shared/echarts/echarts.component.mjs +0 -77
  124. package/esm2020/lib/shared/form/form.component.mjs +0 -574
  125. package/esm2020/lib/shared/img-canvas/img-canvas.component.mjs +0 -132
  126. package/esm2020/lib/shared/local-upload/local-upload.component.mjs +0 -68
  127. package/esm2020/lib/shared/quill-editor/quill-editor.component.mjs +0 -248
  128. package/esm2020/lib/shared/select-icons/select-icons.component.mjs +0 -90
  129. package/esm2020/lib/shared/table/table-form-item/table-form-item.component.mjs +0 -96
  130. package/esm2020/lib/shared/table/table-td/table-td.component.mjs +0 -165
  131. package/esm2020/lib/shared/table/table.component.mjs +0 -749
  132. package/esm2020/lib/shared/video/video.component.mjs +0 -15
  133. package/esm2020/lib/shared/view-form/view-form.component.mjs +0 -181
  134. package/fesm2015/atr-components.mjs +0 -5522
  135. package/fesm2015/atr-components.mjs.map +0 -1
  136. package/fesm2020/atr-components.mjs.map +0 -1
@@ -0,0 +1,749 @@
1
+ import { Component, Input, ViewChild, Output, EventEmitter, LOCALE_ID, Inject } from '@angular/core';
2
+ import { UntypedFormControl } from '@angular/forms';
3
+ import { formatDate } from '@angular/common';
4
+ import { moveItemInArray } from "@angular/cdk/drag-drop";
5
+ import { NzContextMenuService } from 'ng-zorro-antd/dropdown';
6
+ import { atr_static_datas } from "../../../core/base/atr-common";
7
+ import { DictService } from "../../../core/services/dict/dict.service";
8
+ import { HttpService } from "../../../core/services/http.service";
9
+ import { ToolsUtil } from "../../../core/utils/ToolsUtil";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/forms";
12
+ import * as i2 from "@angular/common";
13
+ import * as i3 from "ng-zorro-antd/button";
14
+ import * as i4 from "ng-zorro-antd/core/transition-patch";
15
+ import * as i5 from "ng-zorro-antd/core/wave";
16
+ import * as i6 from "ng-zorro-antd/checkbox";
17
+ import * as i7 from "ng-zorro-antd/dropdown";
18
+ import * as i8 from "ng-zorro-antd/grid";
19
+ import * as i9 from "ng-zorro-antd/form";
20
+ import * as i10 from "ng-zorro-antd/icon";
21
+ import * as i11 from "ng-zorro-antd/table";
22
+ import * as i12 from "ng-zorro-antd/resizable";
23
+ import * as i13 from "@angular/cdk/drag-drop";
24
+ import * as i14 from "./table-form-item/table-form-item.component";
25
+ import * as i15 from "./table-td/table-td.component";
26
+ import * as i16 from "../local-upload/local-upload.component";
27
+ import * as i17 from "../../../core/directive/role.directive";
28
+ import * as i18 from "../../../core/directive/hq-spin.directive";
29
+ export class AtrTableComponent {
30
+ constructor(fb, injector, locale, cd) {
31
+ this.fb = fb;
32
+ this.injector = injector;
33
+ this.locale = locale;
34
+ this.cd = cd;
35
+ this.isCollapse = true;
36
+ this.dicts = {};
37
+ this.pageIndex = 1;
38
+ this.total = 1;
39
+ this.pageSize = 10;
40
+ this.pageSizeOptions = [10, 20, 30, 40, 50];
41
+ this.loading = true;
42
+ this.allowDrag = false; //允许拖拽换位
43
+ this.showQueryTime = false;
44
+ this.tableDatas = [];
45
+ this.scrollSize = { x: "", y: "" };
46
+ //表格checkbox 配置
47
+ this.isAllDisplayDataChecked = false;
48
+ this.isIndeterminate = false;
49
+ this.numberOfChecked = 0;
50
+ this.mapOfCheckedId = {};
51
+ this.curChecked = -1;
52
+ this.imagePrefix = atr_static_datas.OSS_URL;
53
+ this.defaultParams = {};
54
+ this.isHideTable = false;
55
+ this.isAllLoad = false;
56
+ this.sortMap = {};
57
+ this.rowSpanMap = {}; //key:{德科牧场:{num:1}}
58
+ this.headerDefaultVal = {};
59
+ this.showPagination = true;
60
+ this.title = "";
61
+ this.queryHeaders = null;
62
+ this.tableAction = new EventEmitter();
63
+ this.queryBack = new EventEmitter();
64
+ this.headerAction = new EventEmitter();
65
+ this.queryTime = "";
66
+ }
67
+ isShowColor(data) {
68
+ if (this.queryOpts.color && this.queryOpts.color.operator && this.isShowBtn(data, this.queryOpts.color.operator)) {
69
+ return this.queryOpts.color.color;
70
+ }
71
+ return '';
72
+ }
73
+ dbclickData(data, rowNo) {
74
+ let action = {
75
+ name: 'dbclickData',
76
+ code: 'dbclickData',
77
+ type: "row"
78
+ };
79
+ action.data = data;
80
+ action.firstData = data;
81
+ this.tableAction.emit(action);
82
+ }
83
+ doActionByRow2(e) {
84
+ let { data, code, event: MouseEvent, index } = e;
85
+ if (event) {
86
+ event.preventDefault();
87
+ if (event.stopPropagation) {
88
+ event.stopPropagation();
89
+ }
90
+ }
91
+ let action = {
92
+ name: code,
93
+ code: code,
94
+ type: "row"
95
+ };
96
+ action.data = data;
97
+ action.firstData = data;
98
+ action.numberOfChecked = index;
99
+ this.tableAction.emit(action);
100
+ }
101
+ get httpService() {
102
+ return this.injector.get(HttpService);
103
+ }
104
+ get nzContextMenuService() {
105
+ return this.injector.get(NzContextMenuService);
106
+ }
107
+ setTableLoadding(loadding) {
108
+ this.loading = loadding;
109
+ }
110
+ onResize(width, col) {
111
+ this.queryOpts.tables = this.queryOpts.tables.map((e) => (e.name === col ? { ...e, width: `${width}px` } : e));
112
+ let x = 0;
113
+ for (let item of this.queryOpts.tables) {
114
+ if (item.isShow && item.width) {
115
+ x += ToolsUtil.pixelToNum(item.width);
116
+ }
117
+ }
118
+ if (x > 22) {
119
+ x = x - 22;
120
+ this.scrollSize.x = x + "px";
121
+ }
122
+ }
123
+ isEnable(operator) {
124
+ let isEnable = true;
125
+ if (!operator || operator == undefined || operator == "")
126
+ isEnable = false;
127
+ else {
128
+ let op = operator.split("|");
129
+ if (op.length > 2) {
130
+ let key = op[0];
131
+ if (!key) {
132
+ isEnable = false;
133
+ }
134
+ else {
135
+ isEnable = !this.compare(this.numberOfChecked, op[1], op[2]);
136
+ }
137
+ }
138
+ else
139
+ isEnable = false;
140
+ }
141
+ return isEnable;
142
+ }
143
+ isShowBtn(data, operator, action) {
144
+ let isShow = false;
145
+ if (!operator || operator == null || operator == "") {
146
+ isShow = true;
147
+ }
148
+ else if (operator.indexOf('&&') > 0) {
149
+ // a|eq|b &&c|eq|d
150
+ const ops = operator.split('&&');
151
+ if (ops.length > 1) {
152
+ // tslint:disable-next-line:prefer-for-of
153
+ for (let i = 0; i < ops.length; i++) {
154
+ isShow = true;
155
+ if (!this.checkIsShowBase(ops[i].split('|'), data)) {
156
+ isShow = false;
157
+ break;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ else if (operator.indexOf('||') > 0) {
163
+ // a|eq|b||c|eq|d
164
+ const ops = operator.split('&&');
165
+ if (ops.length > 1) {
166
+ for (let i = 0; i < ops.length; i++) {
167
+ isShow = false;
168
+ if (this.checkIsShowBase(ops[i].split('|'), data)) {
169
+ isShow = true;
170
+ break;
171
+ }
172
+ }
173
+ }
174
+ }
175
+ else {
176
+ let op = operator.split("|");
177
+ isShow = this.checkIsShowBase(op, data);
178
+ }
179
+ return isShow;
180
+ }
181
+ checkIsShowBase(op, data) {
182
+ let isShow = false;
183
+ if (op.length > 1) {
184
+ let value = data[op[0]];
185
+ if (!value) {
186
+ isShow = false;
187
+ }
188
+ else {
189
+ isShow = this.compare(value, op[1], op[2]);
190
+ }
191
+ }
192
+ else
193
+ isShow = false;
194
+ return isShow;
195
+ }
196
+ compare(value, operator, target) {
197
+ let isRight = false;
198
+ switch (operator) {
199
+ case 'eq':
200
+ if (value == target) {
201
+ isRight = true;
202
+ }
203
+ break;
204
+ case 'gh':
205
+ if (value >= target) {
206
+ isRight = true;
207
+ }
208
+ break;
209
+ case 'notEmpty':
210
+ isRight = false;
211
+ if (value) {
212
+ isRight = true;
213
+ }
214
+ break;
215
+ case 'empty':
216
+ isRight = false;
217
+ if (!value) {
218
+ isRight = true;
219
+ }
220
+ break;
221
+ default:
222
+ isRight = false;
223
+ break;
224
+ }
225
+ return isRight;
226
+ }
227
+ pushTableDatas(tableDatas) {
228
+ this.tableDatas = this.tableDatas.concat(tableDatas);
229
+ }
230
+ removeDatas(key, value) {
231
+ this.tableDatas.forEach((item, index) => {
232
+ if (item[key] === value) {
233
+ this.tableDatas.splice(index, 1);
234
+ }
235
+ });
236
+ }
237
+ doAction(code) {
238
+ let action = {
239
+ name: code,
240
+ code: code,
241
+ type: "rows"
242
+ };
243
+ let selectDatas = [];
244
+ if (this.tableDatas && this.tableDatas.length > 0) {
245
+ this.tableDatas.forEach((item) => {
246
+ if (this.mapOfCheckedId[item.id])
247
+ selectDatas.push(item);
248
+ });
249
+ }
250
+ action.datas = selectDatas;
251
+ if (selectDatas && selectDatas.length > 0) {
252
+ action.firstData = selectDatas[0];
253
+ }
254
+ action.numberOfChecked = selectDatas.length;
255
+ this.tableAction.emit(action);
256
+ }
257
+ doActionByRow(data, code, event) {
258
+ event.preventDefault();
259
+ if (event.stopPropagation) {
260
+ event.stopPropagation();
261
+ }
262
+ let action = {
263
+ name: code,
264
+ code: code,
265
+ type: "row"
266
+ };
267
+ action.data = data;
268
+ action.firstData = data;
269
+ action.numberOfChecked = 1;
270
+ this.tableAction.emit(action);
271
+ }
272
+ getAllCheckInfo() {
273
+ let ids = [];
274
+ for (const key of Object.keys(this.mapOfCheckedId)) {
275
+ if (this.mapOfCheckedId.hasOwnProperty(key) && this.mapOfCheckedId[key]) {
276
+ ids.push(key);
277
+ }
278
+ }
279
+ return ids;
280
+ }
281
+ getAllCheckDatas() {
282
+ let selectDatas = [];
283
+ this.tableDatas.forEach((item) => {
284
+ if (this.mapOfCheckedId[item.id])
285
+ selectDatas.push(item);
286
+ });
287
+ return selectDatas;
288
+ }
289
+ checkAll(value) {
290
+ this.tableDatas.forEach((item) => (this.mapOfCheckedId[item.id] = value));
291
+ this.refreshStatus();
292
+ }
293
+ refreshStatus() {
294
+ this.isAllDisplayDataChecked = this.tableDatas
295
+ .every((item) => this.mapOfCheckedId[item.id]);
296
+ this.isIndeterminate =
297
+ this.tableDatas.some((item) => this.mapOfCheckedId[item.id]) &&
298
+ !this.isAllDisplayDataChecked;
299
+ this.numberOfChecked = this.tableDatas.filter((item) => this.mapOfCheckedId[item.id]).length;
300
+ this.tableAction.emit({
301
+ code: 'refreshStatus', name: 'select',
302
+ type: "row", data: this.getAllCheckDatas()
303
+ });
304
+ }
305
+ selectRow(data, rowNo) {
306
+ // this.tableDatas.forEach(item => (this.mapOfCheckedId[data.id] = value));
307
+ this.curChecked = rowNo;
308
+ if (!this.queryOpts.checkBox?.isForbid) {
309
+ if (this.queryOpts.checkBox?.isShowCheckbox) {
310
+ this.mapOfCheckedId[data.id] = !this.mapOfCheckedId[data.id];
311
+ }
312
+ else {
313
+ this.mapOfCheckedId = {};
314
+ this.mapOfCheckedId[data.id] = true;
315
+ }
316
+ }
317
+ let action = {
318
+ name: 'select',
319
+ code: 'select',
320
+ type: "row"
321
+ };
322
+ action.data = data;
323
+ action.firstData = data;
324
+ action.numberOfChecked = 1;
325
+ this.tableAction.emit(action);
326
+ this.refreshStatus();
327
+ }
328
+ ngOnInit() {
329
+ this.atrForm = this.fb.group({});
330
+ let x = this.tableContent.nativeElement.offsetWidth - 22;
331
+ let y = this.tableContent.nativeElement.offsetHeight - 200;
332
+ this.scrollSize.x = (x > 0 ? x : 100) + "px";
333
+ this.scrollSize.y = (y > 0 ? y : 100) + "px";
334
+ // console.log(this.scrollSize)
335
+ this.initHeader();
336
+ if (this.queryOpts && this.queryOpts.tables) {
337
+ for (let table of this.queryOpts.tables) {
338
+ if (table.type == 'dict') {
339
+ this.getDictValue(table.dictCode);
340
+ }
341
+ if (table.sortKey) {
342
+ table.sortable = true;
343
+ this.sortMap[table.sortKey] = null;
344
+ }
345
+ else
346
+ table.sortable = false;
347
+ }
348
+ }
349
+ if (this.queryOpts && this.queryOpts.defaultParams) {
350
+ this.defaultParams = this.queryOpts.defaultParams;
351
+ }
352
+ if (!this.queryOpts.isAutoQuery) {
353
+ this.query();
354
+ }
355
+ else {
356
+ this.loading = false;
357
+ // this.cd.detectChanges();
358
+ }
359
+ }
360
+ initHeader() {
361
+ this.headerDefaultVal = {};
362
+ if (this.queryOpts && this.queryOpts.headers && this.queryOpts.headers.length > 0) {
363
+ this.queryOpts.headers.forEach((item, i) => {
364
+ item.span = item.span || 8;
365
+ if (!ToolsUtil.isNull(item.defaultVal)) {
366
+ this.headerDefaultVal[item.key] = item.defaultVal;
367
+ }
368
+ if (item.isShow != false) {
369
+ item.isShow = i < this.queryOpts.showNum;
370
+ }
371
+ this.atrForm.addControl(item.key, new UntypedFormControl());
372
+ let type = item.type;
373
+ switch (type) {
374
+ case "select":
375
+ this.getDictValue(item.dictCode);
376
+ break;
377
+ case "treeSelect":
378
+ case "cascader":
379
+ case "selectCus":
380
+ if (item.selectUrl && item.selectUrl.url) {
381
+ this.getDicList(item);
382
+ }
383
+ break;
384
+ }
385
+ });
386
+ }
387
+ }
388
+ getDicList(item) {
389
+ if (!item.selectUrl || !item.selectUrl.url) {
390
+ return;
391
+ }
392
+ let keys = item.selectUrl.convert.split(',');
393
+ this.httpService.post(item.selectUrl.url, {}, ToolsUtil.getHttpOptions()).subscribe(res => {
394
+ if (item.type == 'treeSelect') {
395
+ item.treeList = res.data.filter((child) => {
396
+ keys.forEach((v) => {
397
+ let vs = v.split("|");
398
+ child[vs[0]] = child[vs[1]];
399
+ });
400
+ // child.key = child.id;
401
+ // child.title = child.realName;
402
+ return true;
403
+ });
404
+ }
405
+ else if (item.type == 'selectCus') {
406
+ item.dictList = res.data.filter((child) => {
407
+ keys.forEach((v) => {
408
+ let vs = v.split("|");
409
+ child[vs[0]] = child[vs[1]];
410
+ });
411
+ // child.value = child.id;
412
+ // child.label = child.name;
413
+ return true;
414
+ });
415
+ }
416
+ });
417
+ }
418
+ ngAfterViewInit() {
419
+ setTimeout(() => {
420
+ let scrollSize = JSON.parse(JSON.stringify(this.scrollSize));
421
+ scrollSize.y = this.tableContent.nativeElement.offsetHeight - 100 + "px";
422
+ if (this.isHideTable) {
423
+ scrollSize.y = this.tableContent.nativeElement.offsetHeight - 60 + "px";
424
+ }
425
+ let width = 0;
426
+ if (this.queryOpts && this.queryOpts.tables) {
427
+ for (let table of this.queryOpts.tables) {
428
+ if (table.isShow && table.width) {
429
+ width += ToolsUtil.pixelToNum(table.width);
430
+ }
431
+ }
432
+ }
433
+ let w = this.tableContent.nativeElement.offsetWidth - 22;
434
+ if (width > w)
435
+ scrollSize.x = width + "px";
436
+ else
437
+ scrollSize.x = this.tableContent.nativeElement.offsetWidth - 22 + "px";
438
+ console.log(scrollSize);
439
+ this.scrollSize = scrollSize;
440
+ this.isAllLoad = true;
441
+ this.cd.detectChanges();
442
+ }, 100);
443
+ }
444
+ sort(sortName, value) {
445
+ for (const key in this.sortMap) {
446
+ this.sortMap[key] = key === sortName ? value : null;
447
+ }
448
+ // this.search(this.listOfSearchName, this.listOfSearchAddress);
449
+ console.log(this.sortMap);
450
+ this.query(true);
451
+ }
452
+ get dictService() {
453
+ return this.injector.get(DictService);
454
+ }
455
+ getDictValue(code) {
456
+ console.log("pppp");
457
+ this.dictService.getDictBycode(code).subscribe(result => {
458
+ if (result && result != null)
459
+ this.dicts[code] = result.dicts;
460
+ console.log(this.dicts);
461
+ }, error => {
462
+ this.dicts[code] = [];
463
+ });
464
+ }
465
+ toggleCollapse() {
466
+ this.isCollapse = !this.isCollapse;
467
+ // this.queryOpts.headers.forEach((c: any, index: any) => {
468
+ // c.isShow = this.isCollapse ? index < this.queryOpts.showNum : true;
469
+ // });
470
+ let action = {
471
+ name: '收起/展开',
472
+ code: 'collapse',
473
+ data: this.isCollapse,
474
+ value: this.isCollapse,
475
+ };
476
+ this.headerAction.emit(action);
477
+ }
478
+ resetForm() {
479
+ this.atrForm.reset();
480
+ for (const key in this.headerDefaultVal) {
481
+ this.atrForm.get(key)?.setValue(this.headerDefaultVal[key]);
482
+ }
483
+ this.headerAction.emit({
484
+ name: '重置',
485
+ code: 'resetForm',
486
+ });
487
+ }
488
+ selectChange(value, item) {
489
+ console.log(value);
490
+ let action = {
491
+ name: item.label,
492
+ code: item.key,
493
+ data: item,
494
+ value: value,
495
+ };
496
+ this.headerAction.emit(action);
497
+ }
498
+ clickIcon(value, item, $event) {
499
+ $event.stopPropagation();
500
+ console.log(value, item);
501
+ let action = {
502
+ name: item.name,
503
+ code: item.icon?.code ? item.icon?.code : "",
504
+ data: item,
505
+ value: value,
506
+ };
507
+ this.headerAction.emit(action);
508
+ }
509
+ getQueryParams(reset) {
510
+ if (reset) {
511
+ this.pageIndex = 1;
512
+ }
513
+ console.log(this.pageIndex);
514
+ let params = {
515
+ page: this.pageIndex,
516
+ limit: this.pageSize,
517
+ sort: this.getSortInfo()
518
+ };
519
+ params = Object.assign(params, this.defaultParams);
520
+ for (const key in this.atrForm.value) {
521
+ if (this.atrForm.value[key] && this.atrForm.value[key] != null && this.atrForm.value[key] != "") {
522
+ if (this.getHederType(key) == "dateRange") {
523
+ let begin = key + "Begin";
524
+ let end = key + "End";
525
+ let formate = 'yyyy-MM-dd 00:00:00';
526
+ let nzShowTime = this.getHederType(key, 'nzShowTime');
527
+ if (nzShowTime) {
528
+ formate = 'yyyy-MM-dd HH:mm:ss';
529
+ if (nzShowTime.nzFormat) {
530
+ formate = 'yyyy-MM-dd ' + nzShowTime.nzFormat;
531
+ }
532
+ }
533
+ params[begin] = formatDate(this.atrForm.value[key][0], formate, this.locale);
534
+ params[end] = formatDate(this.atrForm.value[key][1], formate, this.locale);
535
+ }
536
+ else if (this.getHederType(key) == "dayRange") {
537
+ let begin = key + "Begin";
538
+ let end = key + "End";
539
+ let formate = 'yyyy-MM-dd 00:00:00';
540
+ params[begin] = formatDate(this.atrForm.value[key][0], formate, this.locale);
541
+ params[end] = formatDate(this.atrForm.value[key][1], formate, this.locale);
542
+ }
543
+ else if (this.getHederType(key) == "sdate") {
544
+ params[key] = formatDate(this.atrForm.value[key], 'yyyy-MM-dd 00:00:00', this.locale);
545
+ }
546
+ else if (this.getHederType(key) == "treeSelect") {
547
+ let value = this.atrForm.value[key];
548
+ if (typeof value == 'string') {
549
+ params[key] = this.atrForm.value[key];
550
+ }
551
+ else {
552
+ params[key] = this.atrForm.value[key].join();
553
+ }
554
+ }
555
+ else if (this.getHederType(key) == "cascader" || this.getHederType(key, 'nzMode') == 'multiple') {
556
+ params[key] = this.atrForm.value[key].join();
557
+ }
558
+ else {
559
+ params[key] = this.atrForm.value[key];
560
+ }
561
+ }
562
+ }
563
+ console.log(params);
564
+ return params;
565
+ }
566
+ getHederType(cusKey, typeKey) {
567
+ let type = null;
568
+ for (let header of this.queryOpts.headers) {
569
+ if (cusKey == header.key) {
570
+ type = header[typeKey || 'type'];
571
+ break;
572
+ }
573
+ }
574
+ return type;
575
+ }
576
+ setDefaultParams(params, reset = true) {
577
+ this.defaultParams = params;
578
+ this.query(reset);
579
+ }
580
+ getSortInfo() {
581
+ let orderby = [];
582
+ for (const key in this.sortMap) {
583
+ if (this.sortMap[key] == 'ascend') {
584
+ orderby.push(key + "|" + "asc");
585
+ }
586
+ else if (this.sortMap[key] == 'descend') {
587
+ orderby.push(key + "|" + "desc");
588
+ }
589
+ }
590
+ let order = "";
591
+ if (orderby.length < 1 && this.queryOpts.sort) {
592
+ order = this.queryOpts.sort;
593
+ }
594
+ else
595
+ order = orderby.join(",");
596
+ return order;
597
+ }
598
+ query(reset = false) {
599
+ let params = this.getQueryParams(reset);
600
+ if (this.queryHeaders) {
601
+ params = Object.assign({}, this.queryHeaders, params);
602
+ console.log('查询条件', params);
603
+ }
604
+ if (this.queryOpts.url) {
605
+ this.loading = true;
606
+ this.queryTime = formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss', this.locale);
607
+ this.httpService.post(this.queryOpts.url, params, ToolsUtil.getHttpOptions()).subscribe(result => {
608
+ this.loading = false;
609
+ if (result.status == 200) {
610
+ let action = {};
611
+ action["result"] = result;
612
+ action["params"] = params;
613
+ this.queryBack.emit(action);
614
+ this.total = result?.page?.totalResult;
615
+ this.tableDatas = result.data;
616
+ this.getRowSpan();
617
+ this.mapOfCheckedId = {};
618
+ this.curChecked = -1;
619
+ this.refreshStatus();
620
+ }
621
+ }, error => {
622
+ this.loading = false;
623
+ });
624
+ }
625
+ else {
626
+ this.queryBack.emit({ name: '', code: 'query', data: params });
627
+ }
628
+ }
629
+ contextMenu($event, menu) {
630
+ console.log($event);
631
+ this.nzContextMenuService.create($event, menu);
632
+ }
633
+ log(value) {
634
+ console.log(value);
635
+ for (let table of this.queryOpts.tables) {
636
+ let flag = false;
637
+ for (let item of value) {
638
+ if (item == table.key) {
639
+ table.isShow = true;
640
+ flag = true;
641
+ }
642
+ }
643
+ if (!flag)
644
+ table.isShow = false;
645
+ }
646
+ console.log(this.queryOpts.tables);
647
+ }
648
+ checkShowTd(item, index) {
649
+ if (!item.isShow) {
650
+ return false;
651
+ }
652
+ if (item.isRowSpan) {
653
+ // 合并行,返回值与上一行相同则隐藏这一行;
654
+ if (index == 0) {
655
+ return true;
656
+ }
657
+ const key = item.key ? item.key : "";
658
+ const cur = this.tableDatas[index][key];
659
+ const pre = this.tableDatas[index - 1][key];
660
+ return !(cur == pre);
661
+ }
662
+ return item.isShow;
663
+ }
664
+ checkRowSpan(item, data) {
665
+ if (item.isRowSpan) {
666
+ return this.rowSpanMap[item.key ? item.key : ""][data[item.key ? item.key : ""]].num;
667
+ }
668
+ return 1;
669
+ }
670
+ getRowSpan() {
671
+ let isRowSpan = false;
672
+ this.queryOpts.tables.forEach((item) => {
673
+ if (item.isRowSpan) {
674
+ isRowSpan = true;
675
+ this.rowSpanMap[item.key] = {};
676
+ }
677
+ });
678
+ if (!isRowSpan) {
679
+ return;
680
+ }
681
+ let keys = Object.keys(this.rowSpanMap);
682
+ this.tableDatas.forEach((item) => {
683
+ keys.forEach(key => {
684
+ const value = item[key];
685
+ if (!this.rowSpanMap[key][value]) {
686
+ this.rowSpanMap[key][value] = {
687
+ num: 1
688
+ };
689
+ }
690
+ else {
691
+ this.rowSpanMap[key][value].num += 1;
692
+ }
693
+ });
694
+ });
695
+ }
696
+ drop(event) {
697
+ moveItemInArray(this.tableDatas, event.previousIndex, event.currentIndex);
698
+ let action = {
699
+ name: 'drag',
700
+ code: 'drag',
701
+ type: "rows"
702
+ };
703
+ action.datas = this.tableDatas;
704
+ if (this.tableDatas && this.tableDatas.length > 0) {
705
+ action.firstData = this.tableDatas[0];
706
+ }
707
+ action.numberOfChecked = 1;
708
+ this.tableAction.emit(action);
709
+ }
710
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AtrTableComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.Injector }, { token: LOCALE_ID }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
711
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: AtrTableComponent, selector: "atr-table", inputs: { pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", loading: "loading", allowDrag: "allowDrag", showQueryTime: "showQueryTime", isHideTable: "isHideTable", queryOpts: "queryOpts", showPagination: "showPagination", title: "title", queryHeaders: "queryHeaders" }, outputs: { tableAction: "tableAction", queryBack: "queryBack", headerAction: "headerAction" }, viewQueries: [{ propertyName: "tableContent", first: true, predicate: ["tableContent"], descendants: true, static: true }], ngImport: i0, template: "<form nz-form [formGroup]=\"atrForm\" class=\"ant-advanced-search-form\"\r\n *ngIf=\"queryOpts.headers.length >0 || queryOpts.actions.length >0\">\r\n <div nz-row [nzGutter]=\"24\" [hidden]=\"!isCollapse\">\r\n <ng-content select=\"[header-left-slot]\"></ng-content>\r\n <div nz-col [hidden]=\"!header.isShow \" *ngFor=\"let header of queryOpts.headers\"\r\n [nzSpan]=\"header.span\">\r\n <app-table-form-item\r\n [header]=\"header\"\r\n [ngModel]=\"header.defaultVal\"\r\n [dictList]=\"dicts[header.dictCode]\"\r\n [formControlName]=\"header.key\"\r\n (headerAction)=\"headerAction.emit($event)\"></app-table-form-item>\r\n </div>\r\n <ng-content select=\"[header-right-slot]\"></ng-content>\r\n </div>\r\n <div nz-row nzType=\"flex\">\r\n <div class=\"action-area\" nz-col [nzSpan]=\"16\">\r\n <ng-content select=\"[button-left-slot]\"></ng-content>\r\n <ng-container *ngFor=\"let action of queryOpts.actions\">\r\n <atr-local-upload *ngIf=\"action.gType == 'upload'\" [code]=\"action.code\" [url]=\"action.url\" [name]=\"action.name\"\r\n [withoutRole]=\"action.withoutRole\"\r\n style=\" display: inline-block;\"></atr-local-upload>\r\n <ng-container *ngIf=\"!action.gType\">\r\n <button nz-button [nzType]=\"'primary'\" nzSize=\"small\" (click)=\"doAction(action.code)\"\r\n *atrRole=\"action.withoutRole ? null:action.code\"\r\n [disabled]=\"isEnable(action.operator)\">{{action.name}}</button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-content select=\"[button-right-slot]\"></ng-content>\r\n </div>\r\n <div nz-col [nzSpan]=\"8\" class=\"search-area\" *ngIf=\"queryOpts.headers.length >0 && !queryOpts.isHideQuery\">\r\n <span *ngIf=\"showQueryTime&&queryTime\">\u6570\u636E\u67E5\u8BE2\u65F6\u95F4\uFF1A{{queryTime}}</span>\r\n <button nz-button nzSize=\"small\" [nzType]=\"'primary'\" (click)=\"query(true)\">\u67E5\u8BE2</button>\r\n <button nz-button nzSize=\"small\" (click)=\"resetForm()\">\u91CD\u7F6E</button>\r\n <a class=\"collapse\" (click)=\"toggleCollapse()\" *ngIf=\"queryOpts.headers.length > 0 \">\r\n {{isCollapse ? '\u6536\u8D77' : '\u5C55\u5F00'}}\r\n <i nz-icon [nzType]=\"isCollapse ? 'up' : 'down'\"></i>\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngIf=\"title\" class=\"title\">{{title}}</div>\r\n</form>\r\n<div class=\"search-result-list\" #tableContent [spinLoading]=\"loading\" HqSpin>\r\n <nz-table *ngIf=\"isAllLoad \" #basicTable class=\"main-table\"\r\n [nzScroll]=\"scrollSize\"\r\n nzSize=\"middle\"\r\n nzBordered\r\n [nzShowPagination]=\"showPagination\"\r\n nzShowSizeChanger\r\n [nzFrontPagination]=\"false\"\r\n [nzLoading]=\"loading\"\r\n [nzTotal]=\"total\"\r\n [(nzPageIndex)]=\"pageIndex\"\r\n [(nzPageSize)]=\"pageSize\"\r\n [nzPageSizeOptions]=\"pageSizeOptions\"\r\n [nzData]=\"tableDatas\"\r\n (nzPageIndexChange)=\"query()\"\r\n (nzPageSizeChange)=\"query(true)\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n >\r\n <ng-content select=\"[slot1]\"></ng-content>\r\n <ng-container *ngIf=\"!isHideTable\">\r\n <thead>\r\n <tr (contextmenu)=\"contextMenu($event,menu)\" class=\"header-tr\">\r\n\r\n <th *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n [nzLeft]=\"true\"\r\n class=\"left-zindex-header\"\r\n nzShowCheckbox\r\n style=\"z-index: 90!important;\"\r\n nzWidth=\"30px\"\r\n nzAlign=\"center\"\r\n [(nzChecked)]=\"isAllDisplayDataChecked\"\r\n [nzIndeterminate]=\"isIndeterminate\"\r\n (nzCheckedChange)=\"checkAll($event)\"\r\n ></th>\r\n <th [nzLeft]=\"true\" class=\"left-zindex-header\" *ngIf=\"queryOpts.isIndex\" nzWidth=\"30px\" nzAlign=\"center\">#</th>\r\n <th [nzLeft]=\"true\" class=\"left-zindex-header\" *ngIf=\"queryOpts.checkBox?.isRadio\" nzWidth=\"30px\"\r\n nzAlign=\"center\">#\r\n </th>\r\n <ng-container *ngFor=\"let item of queryOpts.tables; \">\r\n <th *ngIf=\"item.isShow \"\r\n [nzShowSort]=item.sortable\r\n nz-resizable\r\n nzPreview\r\n nzBounds=\"window\"\r\n [(nzSortOrder)]=\"sortMap[item.sortKey]\"\r\n (nzSortOrderChange)=\"sort(item.sortKey, $event)\"\r\n [nzWidth]=\"item.width\"\r\n [nzMaxWidth]=\"256\"\r\n [nzMinWidth]=\"60\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex-header':item.isLeft ? true : false}\"\r\n (nzResizeEnd)=\"onResize($event, item.name)\">\r\n {{item.name}}<!-- {width}: { width: number }, col: string-->\r\n <nz-resize-handle nzDirection=\"right\">\r\n <div class=\"resize-trigger\"></div>\r\n </nz-resize-handle>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n\r\n\r\n <tbody *ngIf=\"!allowDrag\">\r\n\r\n <tr *ngFor=\"let data of basicTable.data;index as i\" class=\"t-tr\" (click)=\"selectRow(data,i)\"\r\n [ngStyle]=\"{'color':isShowColor(data)}\"\r\n [ngClass]=\"{'selected': i == curChecked}\" (dblclick)=\"dbclickData(data,i)\">\r\n\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isRadio\" nzShowCheckbox (nzCheckedChange)=\"selectRow(data,i)\"\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"></td>\r\n <td [nzLeft]=\"true\"\r\n *ngIf=\"queryOpts.isIndex\" nzAlign=\"center\" style=\"padding:12px 0;\" nzBreakWord>{{i + 1}}</td>\r\n <ng-container *ngFor=\"let item of queryOpts.tables;\">\r\n\r\n <td [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n nzBreakWord\r\n [rowSpan]=\"checkRowSpan(item,data)\"\r\n *ngIf=\"checkShowTd(item,i) \">\r\n <app-table-td [data]=\"data\"\r\n [item]=\"item\"\r\n [i]=\"i\"\r\n (doActionByRowAction)=\"doActionByRow2($event)\"\r\n ></app-table-td>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n\r\n </tbody>\r\n <tbody *ngIf=\"allowDrag\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n <tr cdkDrag *ngFor=\"let data of basicTable.data;index as i\" class=\"t-tr\" (click)=\"selectRow(data,i)\"\r\n [ngClass]=\"{'selected': i == curChecked}\">\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n <!--\r\n <td [nzLeft]=\"item.isLeft ? true : false\" [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\" [nzRight]=\"item.isRight ? true : false\"\r\n *ngIf=\"queryOpts.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n -->\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isRadio\" nzShowCheckbox (nzCheckedChange)=\"selectRow(data,i)\"\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"></td>\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.isIndex\" nzAlign=\"center\" style=\"padding:12px 0;\" nzBreakWord>{{i + 1}}</td>\r\n\r\n <ng-container *ngFor=\"let item of queryOpts.tables;\">\r\n\r\n <td [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n nzBreakWord\r\n [rowSpan]=\"checkRowSpan(item,data)\"\r\n *ngIf=\"checkShowTd(item,i) \">\r\n <app-table-td [data]=\"data\"\r\n [item]=\"item\"\r\n [i]=\"i\"\r\n (doActionByRowAction)=\"doActionByRow2($event)\"\r\n ></app-table-td>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-template #totalTemplate let-total>\u5171 {{ total }} \u6761\u8BB0\u5F55</ng-template>\r\n </nz-table>\r\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\r\n <div class=\"tabel-colunmn\">\r\n <nz-checkbox-wrapper style=\"width: 100%;margin-top: 30px;\" (nzOnChange)=\"log($event)\">\r\n <div nz-row>\r\n <div nz-col nzSpan=\"24\" *ngFor=\"let item of queryOpts.tables\">\r\n <label nz-checkbox nzValue=\"{{item.key}}\" [ngModel]=\"item.isShow\">{{item.name}}</label>\r\n </div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <div class=\"tabel-colunmn-header\">\u8BF7\u9009\u62E9\u5217\u8868\u663E\u793A\u5185\u5BB9</div>\r\n </div>\r\n </nz-dropdown-menu>\r\n</div>\r\n\r\n", styles: [":host{width:100%;height:100%;display:flex;flex-direction:column}:host ::ng-deep .ant-modal{top:50px;padding:0}:host .ant-advanced-search-form{padding:10px 6px 6px;background:#fbfbfb;border:1px solid #d9d9d9;border-radius:6px;margin-bottom:5px}:host .select-icon:hover{color:#1890ff}:host ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:5px}:host ::ng-deep .ant-table-column-title{font-size:.65rem}:host ::ng-deep .ant-table-tbody>tr.ant-table-row:hover>td{background:#d0eeea}:host ::ng-deep .ant-modal-header,:host ::ng-deep .ant-modal-content{border-radius:4px}:host ::ng-deep .ant-table-tbody>tr.selected:hover>td{background-color:#cfe1d0!important}:host ::ng-deep .ant-table{height:100%}:host ::ng-deep nz-pagination{position:absolute;bottom:0;right:0}:host .search-result-list{padding:1px;border:1px dashed #e9e9e9;border-radius:6px;background-color:#fff;flex:1;text-align:center;position:relative}:host [nz-form-label]{overflow:visible}:host button{margin:2px 4px}:host .collapse{margin-left:6px;font-size:12px}:host .action-area{text-align:left}:host .search-area{text-align:right}:host ::ng-deep .main-table{position:absolute;inset:0}:host ::ng-deep .main-table .ant-spin-nested-loading{height:100%}:host ::ng-deep .main-table .ant-spin-container{height:100%}:host ::ng-deep .ant-table-tbody>tr.selected>td{background-color:#cfe1d0}:host ::ng-deep .ant-table-tbody>tr>td>img{display:block;width:40%;margin:0 auto}:host ::ng-deep .ant-table-body{-ms-overflow-style:none;overflow:-moz-scrollbars-none}:host ::ng-deep .ant-table-body::-webkit-scrollbar,:host ::ng-deep .ant-table-header::-webkit-scrollbar{width:6px!important;height:6px!important}:host ::ng-deep .ant-table-body::-webkit-scrollbar-track,:host ::ng-deep .ant-table-header::-webkit-scrollbar-track{width:6px!important;cursor:pointer}:host ::ng-deep .ant-table-body::-webkit-scrollbar-thumb,:host ::ng-deep .ant-table-header::-webkit-scrollbar-thumb{background:#1890ff;border-radius:3px;cursor:pointer}:host ::ng-deep .ant-table-bordered .ant-table-thead>tr>th{border-right:1px solid #ddd}:host ::ng-deep .ant-table-header{-ms-overflow-style:none;overflow:-moz-scrollbars-none;margin-bottom:-5px!important}:host ::ng-deep .ant-table-placeholder{border-bottom:none!important;border-top:none!important}:host .tabel-colunmn{display:block;width:160px;height:300px;background:#fff;border:1px solid #ddd;padding:10px;border-radius:5px;overflow-x:hidden;overflow-y:auto;position:relative}:host .tabel-colunmn-header{position:fixed;top:0;left:0;right:0;height:30px;z-index:999;line-height:30px;border-bottom:1px solid #ddd;text-align:left;font-size:13px;padding-left:10px}:host .t-tr{background:#fff}:host .t-tr:nth-child(odd){background:#f8f9fa}:host ::ng-deep .ant-table-thead>tr>th{background:#e7ebef!important;border-radius:0;word-break:break-all;white-space:pre-wrap}:host ::ng-deep .ant-table-tbody>tr>td{word-break:break-all;white-space:pre-wrap}:host ::ng-deep .ant-table-header{background:#e7ebef!important}:host td{font-size:.65rem}:host .resize-trigger{height:100%}:host .nz-resizable-preview{border-width:0;border-right-width:1px}:host ::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}:host ::ng-deep .ant-table-tbody>tr>td{padding:5px}:host ::ng-deep .ant-table{line-height:15px}:host ::ng-deep .ant-table-middle .ant-table-footer,:host .ant-table-middle .ant-table-tbody>tr>td,:host .ant-table-middle .ant-table-thead>tr>th,:host .ant-table-middle .ant-table-title{padding:5px}:host ::ng-deep .ant-table-tbody>tr>td>img{width:35px}:host ::ng-deep .ant-modal-body{padding:10px}:host ::ng-deep .ant-table.ant-table-bordered tbody>tr>td{font-size:13px}:host ::ng-deep th{z-index:80!important}:host .left-zindex-header{z-index:90!important}:host .left-zindex{z-index:80!important}:host ::ng-deep input,:host ::ng-deep .ant-select-single:not(.ant-select-customize-input) .ant-select-selector,:host ::ng-deep .ant-picker{border-radius:5px}:host .border-text{width:100%;height:36px;line-height:36px;display:flex}:host .border-text .border-text-line{display:inline-block;border-top:1px solid #cccccc;margin-top:18px}:host .border-text .border-text-line-left{width:10px;border-left:1px solid #cccccc}:host .border-text .border-text-line-right{flex:1;border-right:1px solid #cccccc}:host .border-text .border-text-span{margin-left:5px;margin-right:5px}:host ::ng-deep .tabel-colunmn-header{position:absolute!important;top:0!important}:host ::ng-deep .ant-table-cell-fix-left,:host .ant-table-cell-fix-right{position:sticky!important}.label-title{position:absolute;display:block;top:-7px;left:10px;background-color:#fff;color:#000;font-weight:600;font-size:12px;line-height:12px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i4.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i5.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i6.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "component", type: i6.NzCheckboxWrapperComponent, selector: "nz-checkbox-wrapper", outputs: ["nzOnChange"], exportAs: ["nzCheckboxWrapper"] }, { kind: "component", type: i7.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i8.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i8.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i9.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "directive", type: i10.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i11.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i11.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i11.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i11.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i11.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand", "nzExpandIcon"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i11.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i11.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i11.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i11.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i11.NzCellBreakWordDirective, selector: "th[nzBreakWord],td[nzBreakWord]", inputs: ["nzBreakWord"] }, { kind: "directive", type: i11.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i11.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "directive", type: i12.NzResizableDirective, selector: "[nz-resizable]", inputs: ["nzBounds", "nzMaxHeight", "nzMaxWidth", "nzMinHeight", "nzMinWidth", "nzGridColumnCount", "nzMaxColumn", "nzMinColumn", "nzLockAspectRatio", "nzPreview", "nzDisabled"], outputs: ["nzResize", "nzResizeEnd", "nzResizeStart"], exportAs: ["nzResizable"] }, { kind: "component", type: i12.NzResizeHandleComponent, selector: "nz-resize-handle, [nz-resize-handle]", inputs: ["nzDirection", "nzCursorType"], outputs: ["nzMouseDown"], exportAs: ["nzResizeHandle"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i14.TableFormItemComponent, selector: "app-table-form-item", inputs: ["header", "value", "dictList"], outputs: ["headerAction"] }, { kind: "component", type: i15.TableTdComponent, selector: "app-table-td", inputs: ["data", "item", "i"], outputs: ["doActionByRowAction"] }, { kind: "component", type: i16.LocalUploadComponent, selector: "atr-local-upload", inputs: ["beforeUpload", "url", "nzAccept", "name", "code", "withoutRole"], outputs: ["afterChange"] }, { kind: "directive", type: i17.AtrRoleDirective, selector: "[atrRole]", inputs: ["atrRole"] }, { kind: "directive", type: i18.HqSpinDirective, selector: "[HqSpin]", inputs: ["spinLoading", "text"] }] }); }
712
+ }
713
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AtrTableComponent, decorators: [{
714
+ type: Component,
715
+ args: [{ selector: 'atr-table', template: "<form nz-form [formGroup]=\"atrForm\" class=\"ant-advanced-search-form\"\r\n *ngIf=\"queryOpts.headers.length >0 || queryOpts.actions.length >0\">\r\n <div nz-row [nzGutter]=\"24\" [hidden]=\"!isCollapse\">\r\n <ng-content select=\"[header-left-slot]\"></ng-content>\r\n <div nz-col [hidden]=\"!header.isShow \" *ngFor=\"let header of queryOpts.headers\"\r\n [nzSpan]=\"header.span\">\r\n <app-table-form-item\r\n [header]=\"header\"\r\n [ngModel]=\"header.defaultVal\"\r\n [dictList]=\"dicts[header.dictCode]\"\r\n [formControlName]=\"header.key\"\r\n (headerAction)=\"headerAction.emit($event)\"></app-table-form-item>\r\n </div>\r\n <ng-content select=\"[header-right-slot]\"></ng-content>\r\n </div>\r\n <div nz-row nzType=\"flex\">\r\n <div class=\"action-area\" nz-col [nzSpan]=\"16\">\r\n <ng-content select=\"[button-left-slot]\"></ng-content>\r\n <ng-container *ngFor=\"let action of queryOpts.actions\">\r\n <atr-local-upload *ngIf=\"action.gType == 'upload'\" [code]=\"action.code\" [url]=\"action.url\" [name]=\"action.name\"\r\n [withoutRole]=\"action.withoutRole\"\r\n style=\" display: inline-block;\"></atr-local-upload>\r\n <ng-container *ngIf=\"!action.gType\">\r\n <button nz-button [nzType]=\"'primary'\" nzSize=\"small\" (click)=\"doAction(action.code)\"\r\n *atrRole=\"action.withoutRole ? null:action.code\"\r\n [disabled]=\"isEnable(action.operator)\">{{action.name}}</button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-content select=\"[button-right-slot]\"></ng-content>\r\n </div>\r\n <div nz-col [nzSpan]=\"8\" class=\"search-area\" *ngIf=\"queryOpts.headers.length >0 && !queryOpts.isHideQuery\">\r\n <span *ngIf=\"showQueryTime&&queryTime\">\u6570\u636E\u67E5\u8BE2\u65F6\u95F4\uFF1A{{queryTime}}</span>\r\n <button nz-button nzSize=\"small\" [nzType]=\"'primary'\" (click)=\"query(true)\">\u67E5\u8BE2</button>\r\n <button nz-button nzSize=\"small\" (click)=\"resetForm()\">\u91CD\u7F6E</button>\r\n <a class=\"collapse\" (click)=\"toggleCollapse()\" *ngIf=\"queryOpts.headers.length > 0 \">\r\n {{isCollapse ? '\u6536\u8D77' : '\u5C55\u5F00'}}\r\n <i nz-icon [nzType]=\"isCollapse ? 'up' : 'down'\"></i>\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngIf=\"title\" class=\"title\">{{title}}</div>\r\n</form>\r\n<div class=\"search-result-list\" #tableContent [spinLoading]=\"loading\" HqSpin>\r\n <nz-table *ngIf=\"isAllLoad \" #basicTable class=\"main-table\"\r\n [nzScroll]=\"scrollSize\"\r\n nzSize=\"middle\"\r\n nzBordered\r\n [nzShowPagination]=\"showPagination\"\r\n nzShowSizeChanger\r\n [nzFrontPagination]=\"false\"\r\n [nzLoading]=\"loading\"\r\n [nzTotal]=\"total\"\r\n [(nzPageIndex)]=\"pageIndex\"\r\n [(nzPageSize)]=\"pageSize\"\r\n [nzPageSizeOptions]=\"pageSizeOptions\"\r\n [nzData]=\"tableDatas\"\r\n (nzPageIndexChange)=\"query()\"\r\n (nzPageSizeChange)=\"query(true)\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n >\r\n <ng-content select=\"[slot1]\"></ng-content>\r\n <ng-container *ngIf=\"!isHideTable\">\r\n <thead>\r\n <tr (contextmenu)=\"contextMenu($event,menu)\" class=\"header-tr\">\r\n\r\n <th *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n [nzLeft]=\"true\"\r\n class=\"left-zindex-header\"\r\n nzShowCheckbox\r\n style=\"z-index: 90!important;\"\r\n nzWidth=\"30px\"\r\n nzAlign=\"center\"\r\n [(nzChecked)]=\"isAllDisplayDataChecked\"\r\n [nzIndeterminate]=\"isIndeterminate\"\r\n (nzCheckedChange)=\"checkAll($event)\"\r\n ></th>\r\n <th [nzLeft]=\"true\" class=\"left-zindex-header\" *ngIf=\"queryOpts.isIndex\" nzWidth=\"30px\" nzAlign=\"center\">#</th>\r\n <th [nzLeft]=\"true\" class=\"left-zindex-header\" *ngIf=\"queryOpts.checkBox?.isRadio\" nzWidth=\"30px\"\r\n nzAlign=\"center\">#\r\n </th>\r\n <ng-container *ngFor=\"let item of queryOpts.tables; \">\r\n <th *ngIf=\"item.isShow \"\r\n [nzShowSort]=item.sortable\r\n nz-resizable\r\n nzPreview\r\n nzBounds=\"window\"\r\n [(nzSortOrder)]=\"sortMap[item.sortKey]\"\r\n (nzSortOrderChange)=\"sort(item.sortKey, $event)\"\r\n [nzWidth]=\"item.width\"\r\n [nzMaxWidth]=\"256\"\r\n [nzMinWidth]=\"60\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex-header':item.isLeft ? true : false}\"\r\n (nzResizeEnd)=\"onResize($event, item.name)\">\r\n {{item.name}}<!-- {width}: { width: number }, col: string-->\r\n <nz-resize-handle nzDirection=\"right\">\r\n <div class=\"resize-trigger\"></div>\r\n </nz-resize-handle>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n\r\n\r\n <tbody *ngIf=\"!allowDrag\">\r\n\r\n <tr *ngFor=\"let data of basicTable.data;index as i\" class=\"t-tr\" (click)=\"selectRow(data,i)\"\r\n [ngStyle]=\"{'color':isShowColor(data)}\"\r\n [ngClass]=\"{'selected': i == curChecked}\" (dblclick)=\"dbclickData(data,i)\">\r\n\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isRadio\" nzShowCheckbox (nzCheckedChange)=\"selectRow(data,i)\"\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"></td>\r\n <td [nzLeft]=\"true\"\r\n *ngIf=\"queryOpts.isIndex\" nzAlign=\"center\" style=\"padding:12px 0;\" nzBreakWord>{{i + 1}}</td>\r\n <ng-container *ngFor=\"let item of queryOpts.tables;\">\r\n\r\n <td [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n nzBreakWord\r\n [rowSpan]=\"checkRowSpan(item,data)\"\r\n *ngIf=\"checkShowTd(item,i) \">\r\n <app-table-td [data]=\"data\"\r\n [item]=\"item\"\r\n [i]=\"i\"\r\n (doActionByRowAction)=\"doActionByRow2($event)\"\r\n ></app-table-td>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n\r\n </tbody>\r\n <tbody *ngIf=\"allowDrag\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n <tr cdkDrag *ngFor=\"let data of basicTable.data;index as i\" class=\"t-tr\" (click)=\"selectRow(data,i)\"\r\n [ngClass]=\"{'selected': i == curChecked}\">\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n <!--\r\n <td [nzLeft]=\"item.isLeft ? true : false\" [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\" [nzRight]=\"item.isRight ? true : false\"\r\n *ngIf=\"queryOpts.isShowCheckbox\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"\r\n (nzCheckedChange)=\"refreshStatus()\"\r\n ></td>\r\n -->\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.checkBox?.isRadio\" nzShowCheckbox (nzCheckedChange)=\"selectRow(data,i)\"\r\n [(nzChecked)]=\"mapOfCheckedId[data.id]\"></td>\r\n <td [nzLeft]=\"true\"\r\n class=\"left-zindex\"\r\n *ngIf=\"queryOpts.isIndex\" nzAlign=\"center\" style=\"padding:12px 0;\" nzBreakWord>{{i + 1}}</td>\r\n\r\n <ng-container *ngFor=\"let item of queryOpts.tables;\">\r\n\r\n <td [nzLeft]=\"item.isLeft ? true : false\"\r\n [ngClass]=\"{'left-zindex':item.isLeft ? true : false}\"\r\n [nzRight]=\"item.isRight ? true : false\"\r\n nzBreakWord\r\n [rowSpan]=\"checkRowSpan(item,data)\"\r\n *ngIf=\"checkShowTd(item,i) \">\r\n <app-table-td [data]=\"data\"\r\n [item]=\"item\"\r\n [i]=\"i\"\r\n (doActionByRowAction)=\"doActionByRow2($event)\"\r\n ></app-table-td>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-template #totalTemplate let-total>\u5171 {{ total }} \u6761\u8BB0\u5F55</ng-template>\r\n </nz-table>\r\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\r\n <div class=\"tabel-colunmn\">\r\n <nz-checkbox-wrapper style=\"width: 100%;margin-top: 30px;\" (nzOnChange)=\"log($event)\">\r\n <div nz-row>\r\n <div nz-col nzSpan=\"24\" *ngFor=\"let item of queryOpts.tables\">\r\n <label nz-checkbox nzValue=\"{{item.key}}\" [ngModel]=\"item.isShow\">{{item.name}}</label>\r\n </div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <div class=\"tabel-colunmn-header\">\u8BF7\u9009\u62E9\u5217\u8868\u663E\u793A\u5185\u5BB9</div>\r\n </div>\r\n </nz-dropdown-menu>\r\n</div>\r\n\r\n", styles: [":host{width:100%;height:100%;display:flex;flex-direction:column}:host ::ng-deep .ant-modal{top:50px;padding:0}:host .ant-advanced-search-form{padding:10px 6px 6px;background:#fbfbfb;border:1px solid #d9d9d9;border-radius:6px;margin-bottom:5px}:host .select-icon:hover{color:#1890ff}:host ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:5px}:host ::ng-deep .ant-table-column-title{font-size:.65rem}:host ::ng-deep .ant-table-tbody>tr.ant-table-row:hover>td{background:#d0eeea}:host ::ng-deep .ant-modal-header,:host ::ng-deep .ant-modal-content{border-radius:4px}:host ::ng-deep .ant-table-tbody>tr.selected:hover>td{background-color:#cfe1d0!important}:host ::ng-deep .ant-table{height:100%}:host ::ng-deep nz-pagination{position:absolute;bottom:0;right:0}:host .search-result-list{padding:1px;border:1px dashed #e9e9e9;border-radius:6px;background-color:#fff;flex:1;text-align:center;position:relative}:host [nz-form-label]{overflow:visible}:host button{margin:2px 4px}:host .collapse{margin-left:6px;font-size:12px}:host .action-area{text-align:left}:host .search-area{text-align:right}:host ::ng-deep .main-table{position:absolute;inset:0}:host ::ng-deep .main-table .ant-spin-nested-loading{height:100%}:host ::ng-deep .main-table .ant-spin-container{height:100%}:host ::ng-deep .ant-table-tbody>tr.selected>td{background-color:#cfe1d0}:host ::ng-deep .ant-table-tbody>tr>td>img{display:block;width:40%;margin:0 auto}:host ::ng-deep .ant-table-body{-ms-overflow-style:none;overflow:-moz-scrollbars-none}:host ::ng-deep .ant-table-body::-webkit-scrollbar,:host ::ng-deep .ant-table-header::-webkit-scrollbar{width:6px!important;height:6px!important}:host ::ng-deep .ant-table-body::-webkit-scrollbar-track,:host ::ng-deep .ant-table-header::-webkit-scrollbar-track{width:6px!important;cursor:pointer}:host ::ng-deep .ant-table-body::-webkit-scrollbar-thumb,:host ::ng-deep .ant-table-header::-webkit-scrollbar-thumb{background:#1890ff;border-radius:3px;cursor:pointer}:host ::ng-deep .ant-table-bordered .ant-table-thead>tr>th{border-right:1px solid #ddd}:host ::ng-deep .ant-table-header{-ms-overflow-style:none;overflow:-moz-scrollbars-none;margin-bottom:-5px!important}:host ::ng-deep .ant-table-placeholder{border-bottom:none!important;border-top:none!important}:host .tabel-colunmn{display:block;width:160px;height:300px;background:#fff;border:1px solid #ddd;padding:10px;border-radius:5px;overflow-x:hidden;overflow-y:auto;position:relative}:host .tabel-colunmn-header{position:fixed;top:0;left:0;right:0;height:30px;z-index:999;line-height:30px;border-bottom:1px solid #ddd;text-align:left;font-size:13px;padding-left:10px}:host .t-tr{background:#fff}:host .t-tr:nth-child(odd){background:#f8f9fa}:host ::ng-deep .ant-table-thead>tr>th{background:#e7ebef!important;border-radius:0;word-break:break-all;white-space:pre-wrap}:host ::ng-deep .ant-table-tbody>tr>td{word-break:break-all;white-space:pre-wrap}:host ::ng-deep .ant-table-header{background:#e7ebef!important}:host td{font-size:.65rem}:host .resize-trigger{height:100%}:host .nz-resizable-preview{border-width:0;border-right-width:1px}:host ::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}:host ::ng-deep .ant-table-tbody>tr>td{padding:5px}:host ::ng-deep .ant-table{line-height:15px}:host ::ng-deep .ant-table-middle .ant-table-footer,:host .ant-table-middle .ant-table-tbody>tr>td,:host .ant-table-middle .ant-table-thead>tr>th,:host .ant-table-middle .ant-table-title{padding:5px}:host ::ng-deep .ant-table-tbody>tr>td>img{width:35px}:host ::ng-deep .ant-modal-body{padding:10px}:host ::ng-deep .ant-table.ant-table-bordered tbody>tr>td{font-size:13px}:host ::ng-deep th{z-index:80!important}:host .left-zindex-header{z-index:90!important}:host .left-zindex{z-index:80!important}:host ::ng-deep input,:host ::ng-deep .ant-select-single:not(.ant-select-customize-input) .ant-select-selector,:host ::ng-deep .ant-picker{border-radius:5px}:host .border-text{width:100%;height:36px;line-height:36px;display:flex}:host .border-text .border-text-line{display:inline-block;border-top:1px solid #cccccc;margin-top:18px}:host .border-text .border-text-line-left{width:10px;border-left:1px solid #cccccc}:host .border-text .border-text-line-right{flex:1;border-right:1px solid #cccccc}:host .border-text .border-text-span{margin-left:5px;margin-right:5px}:host ::ng-deep .tabel-colunmn-header{position:absolute!important;top:0!important}:host ::ng-deep .ant-table-cell-fix-left,:host .ant-table-cell-fix-right{position:sticky!important}.label-title{position:absolute;display:block;top:-7px;left:10px;background-color:#fff;color:#000;font-weight:600;font-size:12px;line-height:12px}\n"] }]
716
+ }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.Injector }, { type: undefined, decorators: [{
717
+ type: Inject,
718
+ args: [LOCALE_ID]
719
+ }] }, { type: i0.ChangeDetectorRef }], propDecorators: { pageSize: [{
720
+ type: Input
721
+ }], pageSizeOptions: [{
722
+ type: Input
723
+ }], loading: [{
724
+ type: Input
725
+ }], allowDrag: [{
726
+ type: Input
727
+ }], showQueryTime: [{
728
+ type: Input
729
+ }], isHideTable: [{
730
+ type: Input
731
+ }], queryOpts: [{
732
+ type: Input
733
+ }], showPagination: [{
734
+ type: Input
735
+ }], title: [{
736
+ type: Input
737
+ }], queryHeaders: [{
738
+ type: Input
739
+ }], tableAction: [{
740
+ type: Output
741
+ }], queryBack: [{
742
+ type: Output
743
+ }], headerAction: [{
744
+ type: Output
745
+ }], tableContent: [{
746
+ type: ViewChild,
747
+ args: ['tableContent', { static: true }]
748
+ }] } });
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NoYXJlZC90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUVMLFNBQVMsRUFFVCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFDVCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQWMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUEwQixNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBd0QsTUFBTSwrQkFBK0IsQ0FBQztBQUN0SCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPeEQsTUFBTSxPQUFPLGlCQUFpQjtJQXdDNUIsWUFBb0IsRUFBc0IsRUFBVSxRQUFrQixFQUE2QixNQUFjLEVBQVUsRUFBcUI7UUFBNUgsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQTZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxPQUFFLEdBQUYsRUFBRSxD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XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBMT0NBTEVfSUQsXHJcbiAgSW5qZWN0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7VW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtmb3JtYXREYXRlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge0Nka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXl9IGZyb20gXCJAYW5ndWxhci9jZGsvZHJhZy1kcm9wXCI7XHJcbmltcG9ydCB7TnpDb250ZXh0TWVudVNlcnZpY2UsIE56RHJvcGRvd25NZW51Q29tcG9uZW50fSBmcm9tICduZy16b3Jyby1hbnRkL2Ryb3Bkb3duJztcclxuaW1wb3J0IHthdHJfc3RhdGljX2RhdGFzLCBBdHJRdWVyeUhlYWRlciwgQXRyUXVleXJPcHQsIGpzb24sIFRhYmxlLCBUYWJsZUFjdGlvbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvYmFzZS9hdHItY29tbW9uXCI7XHJcbmltcG9ydCB7RGljdFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2RpY3QvZGljdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7SHR0cFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2h0dHAuc2VydmljZVwiO1xyXG5pbXBvcnQge1Rvb2xzVXRpbH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdXRpbHMvVG9vbHNVdGlsXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F0ci10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdHJUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgYXRyRm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IGFueTtcclxuICBpc0NvbGxhcHNlID0gdHJ1ZTtcclxuICBkaWN0czogYW55ID0ge307XHJcbiAgcGFnZUluZGV4ID0gMTtcclxuICB0b3RhbCA9IDE7XHJcblxyXG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gMTA7XHJcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFsgMTAsIDIwLCAzMCwgNDAsIDUwIF07XHJcblxyXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGFsbG93RHJhZyA9IGZhbHNlOy8v5YWB6K645ouW5ou95o2i5L2NXHJcbiAgQElucHV0KCkgc2hvd1F1ZXJ5VGltZSA9IGZhbHNlO1xyXG4gIHRhYmxlRGF0YXM6IGFueSA9IFtdO1xyXG4gIHNjcm9sbFNpemU6IGFueSA9IHt4OiBcIlwiLCB5OiBcIlwifVxyXG4gIC8v6KGo5qC8Y2hlY2tib3gg6YWN572uXHJcbiAgaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIGlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gIG51bWJlck9mQ2hlY2tlZCA9IDA7XHJcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgY3VyQ2hlY2tlZDogbnVtYmVyID0gLTE7XHJcbiAgaW1hZ2VQcmVmaXggPSBhdHJfc3RhdGljX2RhdGFzLk9TU19VUkw7XHJcbiAgZGVmYXVsdFBhcmFtcyA9IHt9O1xyXG4gIEBJbnB1dCgpIGlzSGlkZVRhYmxlID0gZmFsc2VcclxuICBpc0FsbExvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzb3J0TWFwOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgcm93U3Bhbk1hcDogYW55ID0ge307Ly9rZXk6e+W+t+enkeeJp+Wcujp7bnVtOjF9fVxyXG4gIGhlYWRlckRlZmF1bHRWYWw6IGFueSA9IHt9XHJcblxyXG4gIEBJbnB1dCgpIHF1ZXJ5T3B0czogQXRyUXVleXJPcHQgfCBhbnk7XHJcbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHF1ZXJ5SGVhZGVycyA9IG51bGw7XHJcblxyXG4gIEBPdXRwdXQoKSB0YWJsZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVBY3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpIHF1ZXJ5QmFjayA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVBY3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlckFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVBY3Rpb24+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQ29udGVudCcsIHtzdGF0aWM6IHRydWV9KSB0YWJsZUNvbnRlbnQ6IEVsZW1lbnRSZWYgfCBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlciwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZTogc3RyaW5nLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gIH1cclxuXHJcbiAgaXNTaG93Q29sb3IoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5xdWVyeU9wdHMuY29sb3IgJiYgdGhpcy5xdWVyeU9wdHMuY29sb3Iub3BlcmF0b3IgJiYgdGhpcy5pc1Nob3dCdG4oZGF0YSwgdGhpcy5xdWVyeU9wdHMuY29sb3Iub3BlcmF0b3IpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5T3B0cy5jb2xvci5jb2xvcjtcclxuICAgIH1cclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgZGJjbGlja0RhdGEoZGF0YTogYW55LCByb3dObzogbnVtYmVyKSB7XHJcbiAgICBsZXQgYWN0aW9uOiBUYWJsZUFjdGlvbiA9IHtcclxuICAgICAgbmFtZTogJ2RiY2xpY2tEYXRhJyxcclxuICAgICAgY29kZTogJ2RiY2xpY2tEYXRhJyxcclxuICAgICAgdHlwZTogXCJyb3dcIlxyXG4gICAgfTtcclxuICAgIGFjdGlvbi5kYXRhID0gZGF0YTtcclxuICAgIGFjdGlvbi5maXJzdERhdGEgPSBkYXRhO1xyXG4gICAgdGhpcy50YWJsZUFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBkb0FjdGlvbkJ5Um93MihlOiBhbnkpIHtcclxuICAgIGxldCB7ZGF0YSwgY29kZSwgZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4fSA9IGVcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGNvZGUsXHJcbiAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgIHR5cGU6IFwicm93XCJcclxuICAgIH07XHJcbiAgICBhY3Rpb24uZGF0YSA9IGRhdGE7XHJcbiAgICBhY3Rpb24uZmlyc3REYXRhID0gZGF0YTtcclxuICAgIGFjdGlvbi5udW1iZXJPZkNoZWNrZWQgPSBpbmRleDtcclxuICAgIHRoaXMudGFibGVBY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaHR0cFNlcnZpY2UoKTogSHR0cFNlcnZpY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KEh0dHBTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IG56Q29udGV4dE1lbnVTZXJ2aWNlKCk6IE56Q29udGV4dE1lbnVTZXJ2aWNlIHtcclxuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChOekNvbnRleHRNZW51U2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBzZXRUYWJsZUxvYWRkaW5nKGxvYWRkaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSBsb2FkZGluZztcclxuICB9XHJcblxyXG4gIG9uUmVzaXplKHdpZHRoOiBhbnksIGNvbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnF1ZXJ5T3B0cy50YWJsZXMgPSB0aGlzLnF1ZXJ5T3B0cy50YWJsZXMubWFwKChlOiBhbnkpID0+IChlLm5hbWUgPT09IGNvbCA/IHsuLi5lLCB3aWR0aDogYCR7d2lkdGh9cHhgfSA6IGUpKTtcclxuICAgIGxldCB4ID0gMDtcclxuICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5xdWVyeU9wdHMudGFibGVzKSB7XHJcblxyXG4gICAgICBpZiAoaXRlbS5pc1Nob3cgJiYgaXRlbS53aWR0aCkge1xyXG4gICAgICAgIHggKz0gVG9vbHNVdGlsLnBpeGVsVG9OdW0oaXRlbS53aWR0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh4ID4gMjIpIHtcclxuICAgICAgeCA9IHggLSAyMjtcclxuICAgICAgdGhpcy5zY3JvbGxTaXplLnggPSB4ICsgXCJweFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNFbmFibGUob3BlcmF0b3I6IHN0cmluZykge1xyXG4gICAgbGV0IGlzRW5hYmxlID0gdHJ1ZTtcclxuICAgIGlmICghb3BlcmF0b3IgfHwgb3BlcmF0b3IgPT0gdW5kZWZpbmVkIHx8IG9wZXJhdG9yID09IFwiXCIpXHJcbiAgICAgIGlzRW5hYmxlID0gZmFsc2U7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG9wID0gb3BlcmF0b3Iuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICBpZiAob3AubGVuZ3RoID4gMikge1xyXG4gICAgICAgIGxldCBrZXkgPSBvcFswXTtcclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgaXNFbmFibGUgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaXNFbmFibGUgPSAhdGhpcy5jb21wYXJlKHRoaXMubnVtYmVyT2ZDaGVja2VkLCBvcFsxXSwgb3BbMl0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBpc0VuYWJsZSA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRW5hYmxlXHJcbiAgfVxyXG5cclxuICBpc1Nob3dCdG4oZGF0YTogYW55LCBvcGVyYXRvcjogc3RyaW5nLCBhY3Rpb24/OiBUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU2hvdyA9IGZhbHNlO1xyXG4gICAgaWYgKCFvcGVyYXRvciB8fCBvcGVyYXRvciA9PSBudWxsIHx8IG9wZXJhdG9yID09IFwiXCIpIHtcclxuICAgICAgaXNTaG93ID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IuaW5kZXhPZignJiYnKSA+IDApIHtcclxuICAgICAgLy8gYXxlcXxiICYmY3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpc1Nob3cgPSB0cnVlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tJc1Nob3dCYXNlKG9wc1tpXS5zcGxpdCgnfCcpLCBkYXRhKSkge1xyXG4gICAgICAgICAgICBpc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yLmluZGV4T2YoJ3x8JykgPiAwKSB7XHJcbiAgICAgIC8vIGF8ZXF8Ynx8Y3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0lzU2hvd0Jhc2Uob3BzW2ldLnNwbGl0KCd8JyksIGRhdGEpKSB7XHJcbiAgICAgICAgICAgIGlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9wID0gb3BlcmF0b3Iuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICBpc1Nob3cgPSB0aGlzLmNoZWNrSXNTaG93QmFzZShvcCwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNTaG93O1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJc1Nob3dCYXNlKG9wOiBhbnksIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU2hvdyA9IGZhbHNlO1xyXG4gICAgaWYgKG9wLmxlbmd0aCA+IDEpIHtcclxuICAgICAgbGV0IHZhbHVlID0gZGF0YVtvcFswXV07XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICBpc1Nob3cgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpc1Nob3cgPSB0aGlzLmNvbXBhcmUodmFsdWUsIG9wWzFdLCBvcFsyXSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlXHJcbiAgICAgIGlzU2hvdyA9IGZhbHNlXHJcblxyXG4gICAgcmV0dXJuIGlzU2hvdztcclxuICB9XHJcblxyXG4gIGNvbXBhcmUodmFsdWU6IGFueSwgb3BlcmF0b3I6IGFueSwgdGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcbiAgICAgIGNhc2UgJ2VxJyA6XHJcbiAgICAgICAgaWYgKHZhbHVlID09IHRhcmdldCkge1xyXG4gICAgICAgICAgaXNSaWdodCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdnaCcgOlxyXG4gICAgICAgIGlmICh2YWx1ZSA+PSB0YXJnZXQpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbm90RW1wdHknOlxyXG4gICAgICAgIGlzUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZW1wdHknOlxyXG4gICAgICAgIGlzUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQgOlxyXG4gICAgICAgIGlzUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBpc1JpZ2h0O1xyXG4gIH1cclxuXHJcbiAgcHVzaFRhYmxlRGF0YXModGFibGVEYXRhczogYW55KSB7XHJcbiAgICB0aGlzLnRhYmxlRGF0YXMgPSB0aGlzLnRhYmxlRGF0YXMuY29uY2F0KHRhYmxlRGF0YXMpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRGF0YXMoa2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMudGFibGVEYXRhcy5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGl0ZW1ba2V5XSA9PT0gdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRGF0YXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGRvQWN0aW9uKGNvZGU6IGFueSkge1xyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGNvZGUsXHJcbiAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgIHR5cGU6IFwicm93c1wiXHJcbiAgICB9O1xyXG4gICAgbGV0IHNlbGVjdERhdGFzOiBhbnkgPSBbXTtcclxuICAgIGlmICh0aGlzLnRhYmxlRGF0YXMgJiYgdGhpcy50YWJsZURhdGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50YWJsZURhdGFzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW0uaWRdKVxyXG4gICAgICAgICAgc2VsZWN0RGF0YXMucHVzaChpdGVtKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhY3Rpb24uZGF0YXMgPSBzZWxlY3REYXRhcztcclxuICAgIGlmIChzZWxlY3REYXRhcyAmJiBzZWxlY3REYXRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFjdGlvbi5maXJzdERhdGEgPSBzZWxlY3REYXRhc1swXTtcclxuICAgIH1cclxuICAgIGFjdGlvbi5udW1iZXJPZkNoZWNrZWQgPSBzZWxlY3REYXRhcy5sZW5ndGg7XHJcbiAgICB0aGlzLnRhYmxlQWN0aW9uLmVtaXQoYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGRvQWN0aW9uQnlSb3coZGF0YTogYW55LCBjb2RlOiBhbnksIGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGNvZGUsXHJcbiAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgIHR5cGU6IFwicm93XCJcclxuICAgIH07XHJcbiAgICBhY3Rpb24uZGF0YSA9IGRhdGE7XHJcbiAgICBhY3Rpb24uZmlyc3REYXRhID0gZGF0YTtcclxuICAgIGFjdGlvbi5udW1iZXJPZkNoZWNrZWQgPSAxO1xyXG4gICAgdGhpcy50YWJsZUFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxDaGVja0luZm8oKTogYW55W10ge1xyXG4gICAgbGV0IGlkczogYW55ID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLm1hcE9mQ2hlY2tlZElkKSkge1xyXG4gICAgICBpZiAodGhpcy5tYXBPZkNoZWNrZWRJZC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSkge1xyXG4gICAgICAgIGlkcy5wdXNoKGtleSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlkcztcclxuICB9XHJcblxyXG4gIGdldEFsbENoZWNrRGF0YXMoKTogYW55W10ge1xyXG4gICAgbGV0IHNlbGVjdERhdGFzOiBhbnkgPSBbXVxyXG4gICAgdGhpcy50YWJsZURhdGFzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtLmlkXSlcclxuICAgICAgICBzZWxlY3REYXRhcy5wdXNoKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2VsZWN0RGF0YXM7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy50YWJsZURhdGFzLmZvckVhY2goKGl0ZW06IGFueSkgPT4gKHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbS5pZF0gPSB2YWx1ZSkpO1xyXG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoU3RhdHVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IHRoaXMudGFibGVEYXRhc1xyXG4gICAgICAuZXZlcnkoKGl0ZW06IGFueSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtLmlkXSk7XHJcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9XHJcbiAgICAgIHRoaXMudGFibGVEYXRhcy5zb21lKChpdGVtOiBhbnkpID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbS5pZF0pICYmXHJcbiAgICAgICF0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkO1xyXG4gICAgdGhpcy5udW1iZXJPZkNoZWNrZWQgPSB0aGlzLnRhYmxlRGF0YXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbS5pZF0pLmxlbmd0aDtcclxuICAgIHRoaXMudGFibGVBY3Rpb24uZW1pdCh7XHJcbiAgICAgIGNvZGU6ICdyZWZyZXNoU3RhdHVzJywgbmFtZTogJ3NlbGVjdCcsXHJcbiAgICAgIHR5cGU6IFwicm93XCIsIGRhdGE6IHRoaXMuZ2V0QWxsQ2hlY2tEYXRhcygpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0Um93KGRhdGE6IGFueSwgcm93Tm86IG51bWJlcikge1xyXG4gICAgLy8gdGhpcy50YWJsZURhdGFzLmZvckVhY2goaXRlbSA9PiAodGhpcy5tYXBPZkNoZWNrZWRJZFtkYXRhLmlkXSA9IHZhbHVlKSk7XHJcbiAgICB0aGlzLmN1ckNoZWNrZWQgPSByb3dObztcclxuICAgIGlmICghdGhpcy5xdWVyeU9wdHMuY2hlY2tCb3g/LmlzRm9yYmlkKSB7XHJcbiAgICAgIGlmICh0aGlzLnF1ZXJ5T3B0cy5jaGVja0JveD8uaXNTaG93Q2hlY2tib3gpIHtcclxuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2RhdGEuaWRdID0gIXRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YS5pZF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xyXG4gICAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YS5pZF0gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgYWN0aW9uOiBUYWJsZUFjdGlvbiA9IHtcclxuICAgICAgbmFtZTogJ3NlbGVjdCcsXHJcbiAgICAgIGNvZGU6ICdzZWxlY3QnLFxyXG4gICAgICB0eXBlOiBcInJvd1wiXHJcbiAgICB9O1xyXG4gICAgYWN0aW9uLmRhdGEgPSBkYXRhO1xyXG4gICAgYWN0aW9uLmZpcnN0RGF0YSA9IGRhdGE7XHJcbiAgICBhY3Rpb24ubnVtYmVyT2ZDaGVja2VkID0gMTtcclxuICAgIHRoaXMudGFibGVBY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuYXRyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gICAgbGV0IHggPSB0aGlzLnRhYmxlQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMjJcclxuICAgIGxldCB5ID0gdGhpcy50YWJsZUNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSAyMDBcclxuICAgIHRoaXMuc2Nyb2xsU2l6ZS54ID0gKHggPiAwID8geCA6IDEwMCkgKyBcInB4XCI7XHJcbiAgICB0aGlzLnNjcm9sbFNpemUueSA9ICh5ID4gMCA/IHkgOiAxMDApICsgXCJweFwiO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5zY3JvbGxTaXplKVxyXG4gICAgdGhpcy5pbml0SGVhZGVyKCk7XHJcbiAgICBpZiAodGhpcy5xdWVyeU9wdHMgJiYgdGhpcy5xdWVyeU9wdHMudGFibGVzKSB7XHJcbiAgICAgIGZvciAobGV0IHRhYmxlIG9mIHRoaXMucXVlcnlPcHRzLnRhYmxlcykge1xyXG4gICAgICAgIGlmKHRhYmxlLnR5cGUgPT0gJ2RpY3QnKXtcclxuICAgICAgICAgIHRoaXMuZ2V0RGljdFZhbHVlKHRhYmxlLmRpY3RDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRhYmxlLnNvcnRLZXkpIHtcclxuICAgICAgICAgIHRhYmxlLnNvcnRhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc29ydE1hcFt0YWJsZS5zb3J0S2V5XSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICB0YWJsZS5zb3J0YWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5xdWVyeU9wdHMgJiYgdGhpcy5xdWVyeU9wdHMuZGVmYXVsdFBhcmFtcykge1xyXG4gICAgICB0aGlzLmRlZmF1bHRQYXJhbXMgPSB0aGlzLnF1ZXJ5T3B0cy5kZWZhdWx0UGFyYW1zXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucXVlcnlPcHRzLmlzQXV0b1F1ZXJ5KSB7XHJcbiAgICAgIHRoaXMucXVlcnkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRIZWFkZXIoKSB7XHJcbiAgICB0aGlzLmhlYWRlckRlZmF1bHRWYWwgPSB7fTtcclxuICAgIGlmICh0aGlzLnF1ZXJ5T3B0cyAmJiB0aGlzLnF1ZXJ5T3B0cy5oZWFkZXJzICYmIHRoaXMucXVlcnlPcHRzLmhlYWRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnF1ZXJ5T3B0cy5oZWFkZXJzLmZvckVhY2goKGl0ZW06IGFueSwgaTogYW55KSA9PiB7XHJcbiAgICAgICAgaXRlbS5zcGFuID0gaXRlbS5zcGFuIHx8IDg7XHJcbiAgICAgICAgaWYgKCFUb29sc1V0aWwuaXNOdWxsKGl0ZW0uZGVmYXVsdFZhbCkpIHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRGVmYXVsdFZhbFtpdGVtLmtleV0gPSBpdGVtLmRlZmF1bHRWYWxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0uaXNTaG93ICE9IGZhbHNlKSB7XHJcbiAgICAgICAgICBpdGVtLmlzU2hvdyA9IGkgPCB0aGlzLnF1ZXJ5T3B0cy5zaG93TnVtXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5hZGRDb250cm9sKGl0ZW0ua2V5LCBuZXcgVW50eXBlZEZvcm1Db250cm9sKCkpO1xyXG4gICAgICAgIGxldCB0eXBlID0gaXRlbS50eXBlO1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxyXG4gICAgICAgICAgICB0aGlzLmdldERpY3RWYWx1ZShpdGVtLmRpY3RDb2RlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwidHJlZVNlbGVjdFwiOlxyXG4gICAgICAgICAgY2FzZSBcImNhc2NhZGVyXCI6XHJcbiAgICAgICAgICBjYXNlIFwic2VsZWN0Q3VzXCI6XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnNlbGVjdFVybCAmJiBpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldERpY0xpc3QoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERpY0xpc3QoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIWl0ZW0uc2VsZWN0VXJsIHx8ICFpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGtleXMgPSBpdGVtLnNlbGVjdFVybC5jb252ZXJ0LnNwbGl0KCcsJyk7XHJcbiAgICB0aGlzLmh0dHBTZXJ2aWNlLnBvc3QoaXRlbS5zZWxlY3RVcmwudXJsLCB7fSwgVG9vbHNVdGlsLmdldEh0dHBPcHRpb25zKCkpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAoaXRlbS50eXBlID09ICd0cmVlU2VsZWN0Jykge1xyXG4gICAgICAgIGl0ZW0udHJlZUxpc3QgPSByZXMuZGF0YS5maWx0ZXIoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgIGtleXMuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2cyA9IHYuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICAgICAgICBjaGlsZFt2c1swXV0gPSBjaGlsZFt2c1sxXV07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGNoaWxkLmtleSA9IGNoaWxkLmlkO1xyXG4gICAgICAgICAgLy8gY2hpbGQudGl0bGUgPSBjaGlsZC5yZWFsTmFtZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdzZWxlY3RDdXMnKSB7XHJcbiAgICAgICAgaXRlbS5kaWN0TGlzdCA9IHJlcy5kYXRhLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAga2V5cy5mb3JFYWNoKCh2OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZzID0gdi5zcGxpdChcInxcIik7XHJcbiAgICAgICAgICAgIGNoaWxkW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8gY2hpbGQudmFsdWUgPSBjaGlsZC5pZDtcclxuICAgICAgICAgIC8vIGNoaWxkLmxhYmVsID0gY2hpbGQubmFtZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBsZXQgc2Nyb2xsU2l6ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zY3JvbGxTaXplKSk7XHJcbiAgICAgIHNjcm9sbFNpemUueSA9IHRoaXMudGFibGVDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTAwICsgXCJweFwiO1xyXG4gICAgICBpZih0aGlzLmlzSGlkZVRhYmxlKXtcclxuICAgICAgICBzY3JvbGxTaXplLnkgPSB0aGlzLnRhYmxlQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIDYwICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB3aWR0aCA9IDA7XHJcbiAgICAgIGlmICh0aGlzLnF1ZXJ5T3B0cyAmJiB0aGlzLnF1ZXJ5T3B0cy50YWJsZXMpIHtcclxuICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0aGlzLnF1ZXJ5T3B0cy50YWJsZXMpIHtcclxuICAgICAgICAgIGlmICh0YWJsZS5pc1Nob3cgJiYgdGFibGUud2lkdGgpIHtcclxuXHJcbiAgICAgICAgICAgIHdpZHRoICs9IFRvb2xzVXRpbC5waXhlbFRvTnVtKHRhYmxlLndpZHRoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHcgPSB0aGlzLnRhYmxlQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMjI7XHJcbiAgICAgIGlmICh3aWR0aCA+IHcpXHJcbiAgICAgICAgc2Nyb2xsU2l6ZS54ID0gd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzY3JvbGxTaXplLnggPSB0aGlzLnRhYmxlQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMjIgKyBcInB4XCI7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhzY3JvbGxTaXplKTtcclxuICAgICAgdGhpcy5zY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuICAgICAgdGhpcy5pc0FsbExvYWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDEwMClcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgc29ydChzb3J0TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnNvcnRNYXApIHtcclxuICAgICAgdGhpcy5zb3J0TWFwW2tleV0gPSBrZXkgPT09IHNvcnROYW1lID8gdmFsdWUgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5zZWFyY2godGhpcy5saXN0T2ZTZWFyY2hOYW1lLCB0aGlzLmxpc3RPZlNlYXJjaEFkZHJlc3MpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zb3J0TWFwKVxyXG4gICAgdGhpcy5xdWVyeSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpY3RTZXJ2aWNlKCk6IERpY3RTZXJ2aWNlIHtcclxuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChEaWN0U2VydmljZSlcclxuICB9XHJcblxyXG4gIGdldERpY3RWYWx1ZShjb2RlOiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKFwicHBwcFwiKTtcclxuICAgIHRoaXMuZGljdFNlcnZpY2UuZ2V0RGljdEJ5Y29kZShjb2RlKS5zdWJzY3JpYmUoXHJcbiAgICAgIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuZGljdHNbY29kZV0gPSByZXN1bHQuZGljdHM7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5kaWN0cylcclxuXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLmRpY3RzW2NvZGVdID0gW107XHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbGxhcHNlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlID0gIXRoaXMuaXNDb2xsYXBzZTtcclxuICAgIC8vIHRoaXMucXVlcnlPcHRzLmhlYWRlcnMuZm9yRWFjaCgoYzogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAvLyAgIGMuaXNTaG93ID0gdGhpcy5pc0NvbGxhcHNlID8gaW5kZXggPCB0aGlzLnF1ZXJ5T3B0cy5zaG93TnVtIDogdHJ1ZTtcclxuICAgIC8vIH0pO1xyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6ICfmlLbotbcv5bGV5byAJyxcclxuICAgICAgY29kZTogJ2NvbGxhcHNlJyxcclxuICAgICAgZGF0YTogdGhpcy5pc0NvbGxhcHNlLFxyXG4gICAgICB2YWx1ZTogdGhpcy5pc0NvbGxhcHNlLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaGVhZGVyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdHJGb3JtLnJlc2V0KCk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhlYWRlckRlZmF1bHRWYWwpIHtcclxuICAgICAgdGhpcy5hdHJGb3JtLmdldChrZXkpPy5zZXRWYWx1ZSh0aGlzLmhlYWRlckRlZmF1bHRWYWxba2V5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oZWFkZXJBY3Rpb24uZW1pdCgge1xyXG4gICAgICBuYW1lOiAn6YeN572uJyxcclxuICAgICAgY29kZToncmVzZXRGb3JtJyxcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2hhbmdlKHZhbHVlOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGl0ZW0ubGFiZWwsXHJcbiAgICAgIGNvZGU6IGl0ZW0ua2V5LFxyXG4gICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICB2YWx1ZTogdmFsdWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5oZWFkZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcblxyXG4gIH1cclxuXHJcbiAgY2xpY2tJY29uKHZhbHVlOiBhbnksIGl0ZW06IEF0clF1ZXJ5SGVhZGVyLCAkZXZlbnQ6IGFueSkge1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc29sZS5sb2codmFsdWUsIGl0ZW0pO1xyXG4gICAgbGV0IGFjdGlvbjogVGFibGVBY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgY29kZTogaXRlbS5pY29uPy5jb2RlID8gaXRlbS5pY29uPy5jb2RlIDogXCJcIixcclxuICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgdmFsdWU6IHZhbHVlLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaGVhZGVyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgZ2V0UXVlcnlQYXJhbXMocmVzZXQ6IGJvb2xlYW4pOiBqc29uIHtcclxuICAgIGlmIChyZXNldCkge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnBhZ2VJbmRleCk7XHJcbiAgICBsZXQgcGFyYW1zOiBhbnkgPSB7XHJcbiAgICAgIHBhZ2U6IHRoaXMucGFnZUluZGV4LFxyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgc29ydDogdGhpcy5nZXRTb3J0SW5mbygpXHJcbiAgICB9O1xyXG4gICAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbihwYXJhbXMsIHRoaXMuZGVmYXVsdFBhcmFtcyk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmF0ckZvcm0udmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMuYXRyRm9ybS52YWx1ZVtrZXldICYmIHRoaXMuYXRyRm9ybS52YWx1ZVtrZXldICE9IG51bGwgJiYgdGhpcy5hdHJGb3JtLnZhbHVlW2tleV0gIT0gXCJcIikge1xyXG4gICAgICAgIGlmICh0aGlzLmdldEhlZGVyVHlwZShrZXkpID09IFwiZGF0ZVJhbmdlXCIpIHtcclxuICAgICAgICAgIGxldCBiZWdpbiA9IGtleSArIFwiQmVnaW5cIjtcclxuICAgICAgICAgIGxldCBlbmQgPSBrZXkgKyBcIkVuZFwiO1xyXG4gICAgICAgICAgbGV0IGZvcm1hdGUgPSAneXl5eS1NTS1kZCAwMDowMDowMCdcclxuICAgICAgICAgIGxldCBuelNob3dUaW1lOiBhbnkgPSB0aGlzLmdldEhlZGVyVHlwZShrZXksICduelNob3dUaW1lJylcclxuICAgICAgICAgIGlmIChuelNob3dUaW1lKSB7XHJcbiAgICAgICAgICAgIGZvcm1hdGUgPSAneXl5eS1NTS1kZCBISDptbTpzcydcclxuICAgICAgICAgICAgaWYgKG56U2hvd1RpbWUubnpGb3JtYXQpIHtcclxuICAgICAgICAgICAgICBmb3JtYXRlID0gJ3l5eXktTU0tZGQgJyArIG56U2hvd1RpbWUubnpGb3JtYXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBhcmFtc1tiZWdpbl0gPSBmb3JtYXREYXRlKCh0aGlzLmF0ckZvcm0udmFsdWVba2V5XVswXSBhcyBEYXRlKSwgZm9ybWF0ZSwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgcGFyYW1zW2VuZF0gPSBmb3JtYXREYXRlKCh0aGlzLmF0ckZvcm0udmFsdWVba2V5XVsxXSBhcyBEYXRlKSwgZm9ybWF0ZSwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRIZWRlclR5cGUoa2V5KSA9PSBcImRheVJhbmdlXCIpIHtcclxuICAgICAgICAgIGxldCBiZWdpbiA9IGtleSArIFwiQmVnaW5cIjtcclxuICAgICAgICAgIGxldCBlbmQgPSBrZXkgKyBcIkVuZFwiO1xyXG4gICAgICAgICAgbGV0IGZvcm1hdGUgPSAneXl5eS1NTS1kZCAwMDowMDowMCdcclxuICAgICAgICAgIHBhcmFtc1tiZWdpbl0gPSBmb3JtYXREYXRlKCh0aGlzLmF0ckZvcm0udmFsdWVba2V5XVswXSBhcyBEYXRlKSwgZm9ybWF0ZSwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgcGFyYW1zW2VuZF0gPSBmb3JtYXREYXRlKCh0aGlzLmF0ckZvcm0udmFsdWVba2V5XVsxXSBhcyBEYXRlKSwgZm9ybWF0ZSwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRIZWRlclR5cGUoa2V5KSA9PSBcInNkYXRlXCIpIHtcclxuICAgICAgICAgIHBhcmFtc1trZXldID0gZm9ybWF0RGF0ZSgodGhpcy5hdHJGb3JtLnZhbHVlW2tleV0gYXMgRGF0ZSksICd5eXl5LU1NLWRkIDAwOjAwOjAwJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRIZWRlclR5cGUoa2V5KSA9PSBcInRyZWVTZWxlY3RcIikge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5hdHJGb3JtLnZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHBhcmFtc1trZXldID0gdGhpcy5hdHJGb3JtLnZhbHVlW2tleV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJhbXNba2V5XSA9IHRoaXMuYXRyRm9ybS52YWx1ZVtrZXldLmpvaW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SGVkZXJUeXBlKGtleSkgPT0gXCJjYXNjYWRlclwiIHx8IHRoaXMuZ2V0SGVkZXJUeXBlKGtleSwnbnpNb2RlJykgPT0gJ211bHRpcGxlJykge1xyXG4gICAgICAgICAgcGFyYW1zW2tleV0gPSB0aGlzLmF0ckZvcm0udmFsdWVba2V5XS5qb2luKCk7XHJcbiAgICAgICAgfSAgZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNba2V5XSA9IHRoaXMuYXRyRm9ybS52YWx1ZVtrZXldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhwYXJhbXMpXHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG5cclxuICB9XHJcblxyXG4gIGdldEhlZGVyVHlwZShjdXNLZXk6IHN0cmluZywgdHlwZUtleT86IHN0cmluZykge1xyXG4gICAgbGV0IHR5cGUgPSBudWxsO1xyXG4gICAgZm9yIChsZXQgaGVhZGVyIG9mIHRoaXMucXVlcnlPcHRzLmhlYWRlcnMpIHtcclxuICAgICAgaWYgKGN1c0tleSA9PSBoZWFkZXIua2V5KSB7XHJcbiAgICAgICAgdHlwZSA9IGhlYWRlclt0eXBlS2V5IHx8ICd0eXBlJ107XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0eXBlO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdFBhcmFtcyhwYXJhbXM6IGFueSwgcmVzZXQ6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLmRlZmF1bHRQYXJhbXMgPSBwYXJhbXM7XHJcbiAgICB0aGlzLnF1ZXJ5KHJlc2V0KTtcclxuICB9XHJcblxyXG4gIGdldFNvcnRJbmZvKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgb3JkZXJieTogYW55ID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnNvcnRNYXApIHtcclxuICAgICAgaWYgKHRoaXMuc29ydE1hcFtrZXldID09ICdhc2NlbmQnKSB7XHJcbiAgICAgICAgb3JkZXJieS5wdXNoKGtleSArIFwifFwiICsgXCJhc2NcIilcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNvcnRNYXBba2V5XSA9PSAnZGVzY2VuZCcpIHtcclxuICAgICAgICBvcmRlcmJ5LnB1c2goa2V5ICsgXCJ8XCIgKyBcImRlc2NcIilcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IG9yZGVyID0gXCJcIjtcclxuICAgIGlmIChvcmRlcmJ5Lmxlbmd0aCA8IDEgJiYgdGhpcy5xdWVyeU9wdHMuc29ydCkge1xyXG4gICAgICBvcmRlciA9IHRoaXMucXVlcnlPcHRzLnNvcnRcclxuICAgIH0gZWxzZVxyXG4gICAgICBvcmRlciA9IG9yZGVyYnkuam9pbihcIixcIik7XHJcbiAgICByZXR1cm4gb3JkZXI7XHJcbiAgfVxyXG5cclxuICBxdWVyeVRpbWUgPSBcIlwiO1xyXG4gIHF1ZXJ5KHJlc2V0OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGxldCBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zKHJlc2V0KTtcclxuICAgIGlmKHRoaXMucXVlcnlIZWFkZXJzKXtcclxuICAgICAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnF1ZXJ5SGVhZGVycyxwYXJhbXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygn5p+l6K+i5p2h5Lu2JyxwYXJhbXMpXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5xdWVyeU9wdHMudXJsKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMucXVlcnlUaW1lID0gZm9ybWF0RGF0ZShuZXcgRGF0ZSgpLCAneXl5eS1NTS1kZCBISDptbTpzcycsIHRoaXMubG9jYWxlKTtcclxuICAgICAgdGhpcy5odHRwU2VydmljZS5wb3N0KHRoaXMucXVlcnlPcHRzLnVybCwgcGFyYW1zLCBUb29sc1V0aWwuZ2V0SHR0cE9wdGlvbnMoKSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgYWN0aW9uW1wicmVzdWx0XCJdID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBhY3Rpb25bXCJwYXJhbXNcIl0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlCYWNrLmVtaXQoYWN0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbCA9IHJlc3VsdD8ucGFnZT8udG90YWxSZXN1bHQ7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhcyA9IHJlc3VsdC5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLmdldFJvd1NwYW4oKTtcclxuICAgICAgICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmN1ckNoZWNrZWQgPSAtMTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucXVlcnlCYWNrLmVtaXQoe25hbWU6ICcnLCBjb2RlOiAncXVlcnknLCBkYXRhOiBwYXJhbXN9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udGV4dE1lbnUoJGV2ZW50OiBhbnksIG1lbnU6IE56RHJvcGRvd25NZW51Q29tcG9uZW50KSB7XHJcbiAgICBjb25zb2xlLmxvZygkZXZlbnQpXHJcbiAgICB0aGlzLm56Q29udGV4dE1lbnVTZXJ2aWNlLmNyZWF0ZSgkZXZlbnQsIG1lbnUpO1xyXG4gIH1cclxuXHJcbiAgbG9nKHZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgZm9yIChsZXQgdGFibGUgb2YgdGhpcy5xdWVyeU9wdHMudGFibGVzKSB7XHJcbiAgICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICBpZiAoaXRlbSA9PSB0YWJsZS5rZXkpIHtcclxuICAgICAgICAgIHRhYmxlLmlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICBmbGFnID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWZsYWcpXHJcbiAgICAgICAgdGFibGUuaXNTaG93ID0gZmFsc2U7XHJcblxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5xdWVyeU9wdHMudGFibGVzKTtcclxuICB9XHJcblxyXG4gIGNoZWNrU2hvd1RkKGl0ZW06IFRhYmxlLCBpbmRleDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWl0ZW0uaXNTaG93KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtLmlzUm93U3Bhbikge1xyXG4gICAgICAvLyDlkIjlubbooYws6L+U5Zue5YC85LiO5LiK5LiA6KGM55u45ZCM5YiZ6ZqQ6JeP6L+Z5LiA6KGMO1xyXG4gICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBcIlwiO1xyXG4gICAgICBjb25zdCBjdXIgPSB0aGlzLnRhYmxlRGF0YXNbaW5kZXhdW2tleV07XHJcbiAgICAgIGNvbnN0IHByZSA9IHRoaXMudGFibGVEYXRhc1tpbmRleCAtIDFdW2tleV07XHJcblxyXG4gICAgICByZXR1cm4gIShjdXIgPT0gcHJlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtLmlzU2hvdztcclxuICB9XHJcblxyXG4gIGNoZWNrUm93U3BhbihpdGVtOiBUYWJsZSwgZGF0YTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5pc1Jvd1NwYW4pIHtcclxuICAgICAgcmV0dXJuIHRoaXMucm93U3Bhbk1hcFtpdGVtLmtleSA/IGl0ZW0ua2V5IDogXCJcIl1bZGF0YVtpdGVtLmtleSA/IGl0ZW0ua2V5IDogXCJcIl1dLm51bVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDE7XHJcbiAgfVxyXG5cclxuICBnZXRSb3dTcGFuKCkge1xyXG4gICAgbGV0IGlzUm93U3BhbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5xdWVyeU9wdHMudGFibGVzLmZvckVhY2goXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5pc1Jvd1NwYW4pIHtcclxuICAgICAgICAgIGlzUm93U3BhbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnJvd1NwYW5NYXBbaXRlbS5rZXldID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgaWYgKCFpc1Jvd1NwYW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnJvd1NwYW5NYXApO1xyXG4gICAgdGhpcy50YWJsZURhdGFzLmZvckVhY2goXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBrZXlzLmZvckVhY2goXHJcbiAgICAgICAgICBrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnJvd1NwYW5NYXBba2V5XVt2YWx1ZV0pIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvd1NwYW5NYXBba2V5XVt2YWx1ZV0gPSB7XHJcbiAgICAgICAgICAgICAgICBudW06IDFcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucm93U3Bhbk1hcFtrZXldW3ZhbHVlXS5udW0gKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPik6IHZvaWQge1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMudGFibGVEYXRhcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIGxldCBhY3Rpb246IFRhYmxlQWN0aW9uID0ge1xyXG4gICAgICBuYW1lOiAnZHJhZycsXHJcbiAgICAgIGNvZGU6ICdkcmFnJyxcclxuICAgICAgdHlwZTogXCJyb3dzXCJcclxuICAgIH07XHJcbiAgICBhY3Rpb24uZGF0YXMgPSB0aGlzLnRhYmxlRGF0YXM7XHJcbiAgICBpZiAodGhpcy50YWJsZURhdGFzICYmIHRoaXMudGFibGVEYXRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFjdGlvbi5maXJzdERhdGEgPSB0aGlzLnRhYmxlRGF0YXNbMF07XHJcbiAgICB9XHJcbiAgICBhY3Rpb24ubnVtYmVyT2ZDaGVja2VkID0gMTtcclxuICAgIHRoaXMudGFibGVBY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGZvcm0gbnotZm9ybSBbZm9ybUdyb3VwXT1cImF0ckZvcm1cIiBjbGFzcz1cImFudC1hZHZhbmNlZC1zZWFyY2gtZm9ybVwiXHJcbiAgICAgICpuZ0lmPVwicXVlcnlPcHRzLmhlYWRlcnMubGVuZ3RoID4wIHx8IHF1ZXJ5T3B0cy5hY3Rpb25zLmxlbmd0aCA+MFwiPlxyXG4gIDxkaXYgbnotcm93IFtuekd1dHRlcl09XCIyNFwiIFtoaWRkZW5dPVwiIWlzQ29sbGFwc2VcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltoZWFkZXItbGVmdC1zbG90XVwiPjwvbmctY29udGVudD5cclxuICAgIDxkaXYgbnotY29sIFtoaWRkZW5dPVwiIWhlYWRlci5pc1Nob3cgXCIgKm5nRm9yPVwibGV0IGhlYWRlciBvZiBxdWVyeU9wdHMuaGVhZGVyc1wiXHJcbiAgICAgICAgIFtuelNwYW5dPVwiaGVhZGVyLnNwYW5cIj5cclxuICAgICAgPGFwcC10YWJsZS1mb3JtLWl0ZW1cclxuICAgICAgICBbaGVhZGVyXT1cImhlYWRlclwiXHJcbiAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyLmRlZmF1bHRWYWxcIlxyXG4gICAgICAgIFtkaWN0TGlzdF09XCJkaWN0c1toZWFkZXIuZGljdENvZGVdXCJcclxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImhlYWRlci5rZXlcIlxyXG4gICAgICAgIChoZWFkZXJBY3Rpb24pPVwiaGVhZGVyQWN0aW9uLmVtaXQoJGV2ZW50KVwiPjwvYXBwLXRhYmxlLWZvcm0taXRlbT5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2hlYWRlci1yaWdodC1zbG90XVwiPjwvbmctY29udGVudD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IG56LXJvdyBuelR5cGU9XCJmbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWFyZWFcIiBuei1jb2wgW256U3Bhbl09XCIxNlwiPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYnV0dG9uLWxlZnQtc2xvdF1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBxdWVyeU9wdHMuYWN0aW9uc1wiPlxyXG4gICAgICAgIDxhdHItbG9jYWwtdXBsb2FkICpuZ0lmPVwiYWN0aW9uLmdUeXBlID09ICd1cGxvYWQnXCIgW2NvZGVdPVwiYWN0aW9uLmNvZGVcIiBbdXJsXT1cImFjdGlvbi51cmxcIiBbbmFtZV09XCJhY3Rpb24ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpdGhvdXRSb2xlXT1cImFjdGlvbi53aXRob3V0Um9sZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvYXRyLWxvY2FsLXVwbG9hZD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWFjdGlvbi5nVHlwZVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gW256VHlwZV09XCIncHJpbWFyeSdcIiBuelNpemU9XCJzbWFsbFwiIChjbGljayk9XCJkb0FjdGlvbihhY3Rpb24uY29kZSlcIlxyXG4gICAgICAgICAgICAgICAgICAqYXRyUm9sZT1cImFjdGlvbi53aXRob3V0Um9sZSA/IG51bGw6YWN0aW9uLmNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNFbmFibGUoYWN0aW9uLm9wZXJhdG9yKVwiPnt7YWN0aW9uLm5hbWV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J1dHRvbi1yaWdodC1zbG90XVwiPjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBuei1jb2wgW256U3Bhbl09XCI4XCIgY2xhc3M9XCJzZWFyY2gtYXJlYVwiICpuZ0lmPVwicXVlcnlPcHRzLmhlYWRlcnMubGVuZ3RoID4wICYmICFxdWVyeU9wdHMuaXNIaWRlUXVlcnlcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93UXVlcnlUaW1lJiZxdWVyeVRpbWVcIj7mlbDmja7mn6Xor6Lml7bpl7TvvJp7e3F1ZXJ5VGltZX19PC9zcGFuPlxyXG4gICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelNpemU9XCJzbWFsbFwiIFtuelR5cGVdPVwiJ3ByaW1hcnknXCIgKGNsaWNrKT1cInF1ZXJ5KHRydWUpXCI+5p+l6K+iPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbnotYnV0dG9uIG56U2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cInJlc2V0Rm9ybSgpXCI+6YeN572uPC9idXR0b24+XHJcbiAgICAgIDxhIGNsYXNzPVwiY29sbGFwc2VcIiAoY2xpY2spPVwidG9nZ2xlQ29sbGFwc2UoKVwiICpuZ0lmPVwicXVlcnlPcHRzLmhlYWRlcnMubGVuZ3RoID4gMCBcIj5cclxuICAgICAgICB7e2lzQ29sbGFwc2UgPyAn5pS26LW3JyA6ICflsZXlvIAnfX1cclxuICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwiaXNDb2xsYXBzZSA/ICd1cCcgOiAnZG93bidcIj48L2k+XHJcbiAgICAgIDwvYT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJ0aXRsZVwiIGNsYXNzPVwidGl0bGVcIj57e3RpdGxlfX08L2Rpdj5cclxuPC9mb3JtPlxyXG48ZGl2IGNsYXNzPVwic2VhcmNoLXJlc3VsdC1saXN0XCIgI3RhYmxlQ29udGVudCBbc3BpbkxvYWRpbmddPVwibG9hZGluZ1wiIEhxU3Bpbj5cclxuICA8bnotdGFibGUgKm5nSWY9XCJpc0FsbExvYWQgXCIgI2Jhc2ljVGFibGUgY2xhc3M9XCJtYWluLXRhYmxlXCJcclxuICAgICAgICAgICAgW256U2Nyb2xsXT1cInNjcm9sbFNpemVcIlxyXG4gICAgICAgICAgICBuelNpemU9XCJtaWRkbGVcIlxyXG4gICAgICAgICAgICBuekJvcmRlcmVkXHJcbiAgICAgICAgICAgIFtuelNob3dQYWdpbmF0aW9uXT1cInNob3dQYWdpbmF0aW9uXCJcclxuICAgICAgICAgICAgbnpTaG93U2l6ZUNoYW5nZXJcclxuICAgICAgICAgICAgW256RnJvbnRQYWdpbmF0aW9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgW256TG9hZGluZ109XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgW256VG90YWxdPVwidG90YWxcIlxyXG4gICAgICAgICAgICBbKG56UGFnZUluZGV4KV09XCJwYWdlSW5kZXhcIlxyXG4gICAgICAgICAgICBbKG56UGFnZVNpemUpXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgW256UGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFtuekRhdGFdPVwidGFibGVEYXRhc1wiXHJcbiAgICAgICAgICAgIChuelBhZ2VJbmRleENoYW5nZSk9XCJxdWVyeSgpXCJcclxuICAgICAgICAgICAgKG56UGFnZVNpemVDaGFuZ2UpPVwicXVlcnkodHJ1ZSlcIlxyXG4gICAgICAgICAgICBbbnpTaG93VG90YWxdPVwidG90YWxUZW1wbGF0ZVwiXHJcbiAgPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3Nsb3QxXVwiPjwvbmctY29udGVudD5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNIaWRlVGFibGVcIj5cclxuICAgICAgPHRoZWFkPlxyXG4gICAgICA8dHIgKGNvbnRleHRtZW51KT1cImNvbnRleHRNZW51KCRldmVudCxtZW51KVwiIGNsYXNzPVwiaGVhZGVyLXRyXCI+XHJcblxyXG4gICAgICAgIDx0aCAqbmdJZj1cInF1ZXJ5T3B0cy5jaGVja0JveD8uaXNTaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBbbnpMZWZ0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxlZnQtemluZGV4LWhlYWRlclwiXHJcbiAgICAgICAgICAgIG56U2hvd0NoZWNrYm94XHJcbiAgICAgICAgICAgIHN0eWxlPVwiei1pbmRleDogOTAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgIG56V2lkdGg9XCIzMHB4XCJcclxuICAgICAgICAgICAgbnpBbGlnbj1cImNlbnRlclwiXHJcbiAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgIFtuekluZGV0ZXJtaW5hdGVdPVwiaXNJbmRldGVybWluYXRlXCJcclxuICAgICAgICAgICAgKG56Q2hlY2tlZENoYW5nZSk9XCJjaGVja0FsbCgkZXZlbnQpXCJcclxuICAgICAgICA+PC90aD5cclxuICAgICAgICA8dGggW256TGVmdF09XCJ0cnVlXCIgY2xhc3M9XCJsZWZ0LXppbmRleC1oZWFkZXJcIiAqbmdJZj1cInF1ZXJ5T3B0cy5pc0luZGV4XCIgbnpXaWR0aD1cIjMwcHhcIiBuekFsaWduPVwiY2VudGVyXCI+IzwvdGg+XHJcbiAgICAgICAgPHRoIFtuekxlZnRdPVwidHJ1ZVwiIGNsYXNzPVwibGVmdC16aW5kZXgtaGVhZGVyXCIgKm5nSWY9XCJxdWVyeU9wdHMuY2hlY2tCb3g/LmlzUmFkaW9cIiBueldpZHRoPVwiMzBweFwiXHJcbiAgICAgICAgICAgIG56QWxpZ249XCJjZW50ZXJcIj4jXHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXJ5T3B0cy50YWJsZXM7IFwiPlxyXG4gICAgICAgICAgPHRoICpuZ0lmPVwiaXRlbS5pc1Nob3cgXCJcclxuICAgICAgICAgICAgICBbbnpTaG93U29ydF09aXRlbS5zb3J0YWJsZVxyXG4gICAgICAgICAgICAgIG56LXJlc2l6YWJsZVxyXG4gICAgICAgICAgICAgIG56UHJldmlld1xyXG4gICAgICAgICAgICAgIG56Qm91bmRzPVwid2luZG93XCJcclxuICAgICAgICAgICAgICBbKG56U29ydE9yZGVyKV09XCJzb3J0TWFwW2l0ZW0uc29ydEtleV1cIlxyXG4gICAgICAgICAgICAgIChuelNvcnRPcmRlckNoYW5nZSk9XCJzb3J0KGl0ZW0uc29ydEtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW256V2lkdGhdPVwiaXRlbS53aWR0aFwiXHJcbiAgICAgICAgICAgICAgW256TWF4V2lkdGhdPVwiMjU2XCJcclxuICAgICAgICAgICAgICBbbnpNaW5XaWR0aF09XCI2MFwiXHJcbiAgICAgICAgICAgICAgW256UmlnaHRdPVwiaXRlbS5pc1JpZ2h0ID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbbnpMZWZ0XT1cIml0ZW0uaXNMZWZ0ID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2xlZnQtemluZGV4LWhlYWRlcic6aXRlbS5pc0xlZnQgPyB0cnVlIDogZmFsc2V9XCJcclxuICAgICAgICAgICAgICAobnpSZXNpemVFbmQpPVwib25SZXNpemUoJGV2ZW50LCBpdGVtLm5hbWUpXCI+XHJcbiAgICAgICAgICAgIHt7aXRlbS5uYW1lfX08IS0tIHt3aWR0aH06IHsgd2lkdGg6IG51bWJlciB9LCBjb2w6IHN0cmluZy0tPlxyXG4gICAgICAgICAgICA8bnotcmVzaXplLWhhbmRsZSBuekRpcmVjdGlvbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS10cmlnZ2VyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbnotcmVzaXplLWhhbmRsZT5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGhlYWQ+XHJcblxyXG5cclxuICAgICAgPHRib2R5ICpuZ0lmPVwiIWFsbG93RHJhZ1wiPlxyXG5cclxuICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGJhc2ljVGFibGUuZGF0YTtpbmRleCBhcyBpXCIgY2xhc3M9XCJ0LXRyXCIgKGNsaWNrKT1cInNlbGVjdFJvdyhkYXRhLGkpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOmlzU2hvd0NvbG9yKGRhdGEpfVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogaSA9PSBjdXJDaGVja2VkfVwiIChkYmxjbGljayk9XCJkYmNsaWNrRGF0YShkYXRhLGkpXCI+XHJcblxyXG4gICAgICAgIDx0ZCBbbnpMZWZ0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxlZnQtemluZGV4XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJxdWVyeU9wdHMuY2hlY2tCb3g/LmlzU2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgbnpTaG93Q2hlY2tib3hcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cIm1hcE9mQ2hlY2tlZElkW2RhdGEuaWRdXCJcclxuICAgICAgICAgICAgKG56Q2hlY2tlZENoYW5nZSk9XCJyZWZyZXNoU3RhdHVzKClcIlxyXG4gICAgICAgID48L3RkPlxyXG4gICAgICAgIDx0ZCBbbnpMZWZ0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxlZnQtemluZGV4XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJxdWVyeU9wdHMuY2hlY2tCb3g/LmlzUmFkaW9cIiBuelNob3dDaGVja2JveCAobnpDaGVja2VkQ2hhbmdlKT1cInNlbGVjdFJvdyhkYXRhLGkpXCJcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cIm1hcE9mQ2hlY2tlZElkW2RhdGEuaWRdXCI+PC90ZD5cclxuICAgICAgICA8dGQgW256TGVmdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJxdWVyeU9wdHMuaXNJbmRleFwiIG56QWxpZ249XCJjZW50ZXJcIiBzdHlsZT1cInBhZGRpbmc6MTJweCAwO1wiIG56QnJlYWtXb3JkPnt7aSArIDF9fTwvdGQ+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBxdWVyeU9wdHMudGFibGVzO1wiPlxyXG5cclxuICAgICAgICAgIDx0ZCBbbnpMZWZ0XT1cIml0ZW0uaXNMZWZ0ID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2xlZnQtemluZGV4JzppdGVtLmlzTGVmdCA/IHRydWUgOiBmYWxzZX1cIlxyXG4gICAgICAgICAgICAgIFtuelJpZ2h0XT1cIml0ZW0uaXNSaWdodCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgbnpCcmVha1dvcmRcclxuICAgICAgICAgICAgICBbcm93U3Bhbl09XCJjaGVja1Jvd1NwYW4oaXRlbSxkYXRhKVwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjaGVja1Nob3dUZChpdGVtLGkpIFwiPlxyXG4gICAgICAgICAgICA8YXBwLXRhYmxlLXRkIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkb0FjdGlvbkJ5Um93QWN0aW9uKT1cImRvQWN0aW9uQnlSb3cyKCRldmVudClcIlxyXG4gICAgICAgICAgICA+PC9hcHAtdGFibGUtdGQ+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RyPlxyXG5cclxuICAgICAgPC90Ym9keT5cclxuICAgICAgPHRib2R5ICpuZ0lmPVwiYWxsb3dEcmFnXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cclxuICAgICAgPHRyIGNka0RyYWcgKm5nRm9yPVwibGV0IGRhdGEgb2YgYmFzaWNUYWJsZS5kYXRhO2luZGV4IGFzIGlcIiBjbGFzcz1cInQtdHJcIiAoY2xpY2spPVwic2VsZWN0Um93KGRhdGEsaSlcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZCc6IGkgPT0gY3VyQ2hlY2tlZH1cIj5cclxuICAgICAgICA8dGQgW256TGVmdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJsZWZ0LXppbmRleFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicXVlcnlPcHRzLmNoZWNrQm94Py5pc1Nob3dDaGVja2JveFwiXHJcbiAgICAgICAgICAgIG56U2hvd0NoZWNrYm94XHJcbiAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJtYXBPZkNoZWNrZWRJZFtkYXRhLmlkXVwiXHJcbiAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwicmVmcmVzaFN0YXR1cygpXCJcclxuICAgICAgICA+PC90ZD5cclxuICAgICAgICA8IS0tXHJcbiAgICAgICAgICAgICAgICAgIDx0ZCBbbnpMZWZ0XT1cIml0ZW0uaXNMZWZ0ID8gdHJ1ZSA6IGZhbHNlXCIgW25nQ2xhc3NdPVwieydsZWZ0LXppbmRleCc6aXRlbS5pc0xlZnQgPyB0cnVlIDogZmFsc2V9XCIgICBbbnpSaWdodF09XCJpdGVtLmlzUmlnaHQgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVyeU9wdHMuaXNTaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbnpTaG93Q2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJtYXBPZkNoZWNrZWRJZFtkYXRhLmlkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAobnpDaGVja2VkQ2hhbmdlKT1cInJlZnJlc2hTdGF0dXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgIC0tPlxyXG4gICAgICAgIDx0ZCBbbnpMZWZ0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxlZnQtemluZGV4XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJxdWVyeU9wdHMuY2hlY2tCb3g/LmlzUmFkaW9cIiBuelNob3dDaGVja2JveCAobnpDaGVja2VkQ2hhbmdlKT1cInNlbGVjdFJvdyhkYXRhLGkpXCJcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cIm1hcE9mQ2hlY2tlZElkW2RhdGEuaWRdXCI+PC90ZD5cclxuICAgICAgICA8dGQgW256TGVmdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJsZWZ0LXppbmRleFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicXVlcnlPcHRzLmlzSW5kZXhcIiBuekFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJwYWRkaW5nOjEycHggMDtcIiBuekJyZWFrV29yZD57e2kgKyAxfX08L3RkPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXJ5T3B0cy50YWJsZXM7XCI+XHJcblxyXG4gICAgICAgICAgPHRkIFtuekxlZnRdPVwiaXRlbS5pc0xlZnQgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbGVmdC16aW5kZXgnOml0ZW0uaXNMZWZ0ID8gdHJ1ZSA6IGZhbHNlfVwiXHJcbiAgICAgICAgICAgICAgW256UmlnaHRdPVwiaXRlbS5pc1JpZ2h0ID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICBuekJyZWFrV29yZFxyXG4gICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNoZWNrUm93U3BhbihpdGVtLGRhdGEpXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrU2hvd1RkKGl0ZW0saSkgXCI+XHJcbiAgICAgICAgICAgIDxhcHAtdGFibGUtdGQgW2RhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ldPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvQWN0aW9uQnlSb3dBY3Rpb24pPVwiZG9BY3Rpb25CeVJvdzIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2FwcC10YWJsZS10ZD5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcblxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG90YWxUZW1wbGF0ZSBsZXQtdG90YWw+5YWxIHt7IHRvdGFsIH19IOadoeiusOW9lTwvbmctdGVtcGxhdGU+XHJcbiAgPC9uei10YWJsZT5cclxuICA8bnotZHJvcGRvd24tbWVudSAjbWVudT1cIm56RHJvcGRvd25NZW51XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFiZWwtY29sdW5tblwiPlxyXG4gICAgICA8bnotY2hlY2tib3gtd3JhcHBlciBzdHlsZT1cIndpZHRoOiAxMDAlO21hcmdpbi10b3A6IDMwcHg7XCIgKG56T25DaGFuZ2UpPVwibG9nKCRldmVudClcIj5cclxuICAgICAgICA8ZGl2IG56LXJvdz5cclxuICAgICAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjI0XCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlcnlPcHRzLnRhYmxlc1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgbnotY2hlY2tib3ggbnpWYWx1ZT1cInt7aXRlbS5rZXl9fVwiIFtuZ01vZGVsXT1cIml0ZW0uaXNTaG93XCI+e3tpdGVtLm5hbWV9fTwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uei1jaGVja2JveC13cmFwcGVyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGFiZWwtY29sdW5tbi1oZWFkZXJcIj7or7fpgInmi6nliJfooajmmL7npLrlhoXlrrk8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbnotZHJvcGRvd24tbWVudT5cclxuPC9kaXY+XHJcblxyXG4iXX0=