raise-common-lib 0.0.248 → 0.0.249

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 (62) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +1937 -12
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/common-grid/index.component.js +210 -8
  7. package/esm2015/lib/date-tree-filter/date-tree-filter-popover/index.component.js +761 -0
  8. package/esm2015/lib/date-tree-filter/date-tree-filter.helper.js +679 -0
  9. package/esm2015/lib/raise-common-lib.module.js +4 -1
  10. package/esm2015/public-api.js +3 -1
  11. package/esm2015/raise-common-lib.js +2 -2
  12. package/esm5/lib/common-grid/index.component.js +244 -8
  13. package/esm5/lib/date-tree-filter/date-tree-filter-popover/index.component.js +902 -0
  14. package/esm5/lib/date-tree-filter/date-tree-filter.helper.js +787 -0
  15. package/esm5/lib/raise-common-lib.module.js +4 -1
  16. package/esm5/public-api.js +3 -1
  17. package/esm5/raise-common-lib.js +2 -2
  18. package/fesm2015/raise-common-lib.js +1649 -9
  19. package/fesm2015/raise-common-lib.js.map +1 -1
  20. package/fesm5/raise-common-lib.js +1931 -10
  21. package/fesm5/raise-common-lib.js.map +1 -1
  22. package/lib/common-grid/index.component.d.ts +30 -1
  23. package/lib/date-tree-filter/date-tree-filter-popover/index.component.d.ts +46 -0
  24. package/lib/date-tree-filter/date-tree-filter.helper.d.ts +54 -0
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
  27. package/raise-common-lib.metadata.json +1 -1
  28. package/src/assets/img/arrow_right.svg +4 -4
  29. package/src/assets/img/calendar-disabled.svg +6 -6
  30. package/src/assets/img/calendar.svg +6 -6
  31. package/src/assets/img/calendar_arrow_left.svg +3 -3
  32. package/src/assets/img/calendar_arrow_right.svg +3 -3
  33. package/src/assets/img/checked-vector.svg +3 -3
  34. package/src/assets/img/dialog-close.svg +4 -4
  35. package/src/assets/img/dialog-grow.svg +6 -6
  36. package/src/assets/img/dialog-shrink.svg +6 -6
  37. package/src/assets/img/plus.svg +4 -4
  38. package/src/assets/img/raise_logo_main_new.svg +27 -27
  39. package/src/assets/img/search.svg +4 -4
  40. package/src/assets/img/shrink-icon.svg +6 -6
  41. package/src/assets/img/time-disabled.svg +4 -4
  42. package/src/assets/img/time.svg +4 -4
  43. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  44. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  45. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  46. package/src/assets/img/toolbar-action-combine.svg +4 -4
  47. package/src/assets/img/toolbar-action-edit.svg +4 -4
  48. package/src/assets/img/toolbar-action-expand.svg +7 -7
  49. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  50. package/src/assets/img/toolbar-action-lock.svg +6 -6
  51. package/src/assets/img/toolbar-action-preview.svg +7 -7
  52. package/src/assets/img/toolbar-action-publish.svg +5 -5
  53. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  54. package/src/assets/img/toolbar-action-rename.svg +7 -7
  55. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  56. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  57. package/src/assets/img/toolbar-action-settle.svg +7 -7
  58. package/src/assets/img/toolbar-action-share.svg +5 -5
  59. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  60. package/src/assets/img/toolbar-action-sync.svg +4 -4
  61. package/src/assets/img/toolbar-action-template.svg +6 -6
  62. package/src/assets/img/toolbar-action-workflow.svg +9 -9
@@ -0,0 +1,902 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/date-tree-filter/date-tree-filter-popover/index.component.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { Component, EventEmitter, Input, Output, } from "@angular/core";
7
+ import moment from "moment";
8
+ var DateTreeFilterPopoverComponent = /** @class */ (function () {
9
+ function DateTreeFilterPopoverComponent() {
10
+ this.field = "";
11
+ this.sourceRows = [];
12
+ this.dateFields = [];
13
+ this.selectedByField = {};
14
+ this.fieldLabelMap = {};
15
+ this.apply = new EventEmitter();
16
+ this.close = new EventEmitter();
17
+ this.keyword = "";
18
+ this.years = [];
19
+ this.expandStateByField = {};
20
+ this.workingSelectedByField = {};
21
+ }
22
+ /**
23
+ * @param {?} changes
24
+ * @return {?}
25
+ */
26
+ DateTreeFilterPopoverComponent.prototype.ngOnChanges = /**
27
+ * @param {?} changes
28
+ * @return {?}
29
+ */
30
+ function (changes) {
31
+ if (changes.field ||
32
+ changes.sourceRows ||
33
+ changes.selectedByField ||
34
+ changes.dateFields) {
35
+ this.keyword = "";
36
+ this.workingSelectedByField = this.cloneSelectionMap(this.selectedByField);
37
+ this.rebuildTree();
38
+ }
39
+ };
40
+ /**
41
+ * @return {?}
42
+ */
43
+ DateTreeFilterPopoverComponent.prototype.closePopover = /**
44
+ * @return {?}
45
+ */
46
+ function () {
47
+ this.close.emit();
48
+ };
49
+ /**
50
+ * @param {?} value
51
+ * @return {?}
52
+ */
53
+ DateTreeFilterPopoverComponent.prototype.onKeywordChange = /**
54
+ * @param {?} value
55
+ * @return {?}
56
+ */
57
+ function (value) {
58
+ this.keyword = value || "";
59
+ };
60
+ /**
61
+ * @return {?}
62
+ */
63
+ DateTreeFilterPopoverComponent.prototype.getVisibleYears = /**
64
+ * @return {?}
65
+ */
66
+ function () {
67
+ /** @type {?} */
68
+ var searchText = (this.keyword || "").trim().toLowerCase();
69
+ if (!searchText) {
70
+ return this.years;
71
+ }
72
+ return this.years
73
+ .map((/**
74
+ * @param {?} yearNode
75
+ * @return {?}
76
+ */
77
+ function (yearNode) {
78
+ /** @type {?} */
79
+ var yearMatched = String(yearNode.year).toLowerCase().indexOf(searchText) > -1;
80
+ /** @type {?} */
81
+ var months = yearNode.months
82
+ .map((/**
83
+ * @param {?} monthNode
84
+ * @return {?}
85
+ */
86
+ function (monthNode) {
87
+ /** @type {?} */
88
+ var monthMatched = String(monthNode.label)
89
+ .toLowerCase()
90
+ .indexOf(searchText) > -1;
91
+ /** @type {?} */
92
+ var days = monthNode.days.filter((/**
93
+ * @param {?} dayNode
94
+ * @return {?}
95
+ */
96
+ function (dayNode) {
97
+ return (String(dayNode.label)
98
+ .toLowerCase()
99
+ .indexOf(searchText) > -1);
100
+ }));
101
+ if (yearMatched || monthMatched) {
102
+ return monthNode;
103
+ }
104
+ return Object.assign({}, monthNode, { days: days });
105
+ }))
106
+ .filter((/**
107
+ * @param {?} monthNode
108
+ * @return {?}
109
+ */
110
+ function (monthNode) { return monthNode.days.length > 0; }));
111
+ if (yearMatched) {
112
+ return yearNode;
113
+ }
114
+ return Object.assign({}, yearNode, { months: months });
115
+ }))
116
+ .filter((/**
117
+ * @param {?} yearNode
118
+ * @return {?}
119
+ */
120
+ function (yearNode) { return yearNode.months.length > 0; }));
121
+ };
122
+ /**
123
+ * @param {?} yearNode
124
+ * @return {?}
125
+ */
126
+ DateTreeFilterPopoverComponent.prototype.toggleYearExpanded = /**
127
+ * @param {?} yearNode
128
+ * @return {?}
129
+ */
130
+ function (yearNode) {
131
+ /** @type {?} */
132
+ var state = this.getOrCreateExpandState(this.field);
133
+ state.years[yearNode.key] = !state.years[yearNode.key];
134
+ yearNode.expanded = !!state.years[yearNode.key];
135
+ };
136
+ /**
137
+ * @param {?} monthNode
138
+ * @return {?}
139
+ */
140
+ DateTreeFilterPopoverComponent.prototype.toggleMonthExpanded = /**
141
+ * @param {?} monthNode
142
+ * @return {?}
143
+ */
144
+ function (monthNode) {
145
+ /** @type {?} */
146
+ var state = this.getOrCreateExpandState(this.field);
147
+ state.months[monthNode.key] = !state.months[monthNode.key];
148
+ monthNode.expanded = !!state.months[monthNode.key];
149
+ };
150
+ /**
151
+ * @return {?}
152
+ */
153
+ DateTreeFilterPopoverComponent.prototype.isAllChecked = /**
154
+ * @return {?}
155
+ */
156
+ function () {
157
+ /** @type {?} */
158
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
159
+ /** @type {?} */
160
+ var enabledDayKeys = this.getEnabledDayKeysInCurrentField();
161
+ if (!enabledDayKeys.length) {
162
+ return false;
163
+ }
164
+ return enabledDayKeys.every((/**
165
+ * @param {?} key
166
+ * @return {?}
167
+ */
168
+ function (key) { return !!selectedMap[key]; }));
169
+ };
170
+ /**
171
+ * @return {?}
172
+ */
173
+ DateTreeFilterPopoverComponent.prototype.isAllIndeterminate = /**
174
+ * @return {?}
175
+ */
176
+ function () {
177
+ /** @type {?} */
178
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
179
+ /** @type {?} */
180
+ var enabledDayKeys = this.getEnabledDayKeysInCurrentField();
181
+ if (!enabledDayKeys.length) {
182
+ return false;
183
+ }
184
+ /** @type {?} */
185
+ var selectedCount = enabledDayKeys.filter((/**
186
+ * @param {?} key
187
+ * @return {?}
188
+ */
189
+ function (key) { return !!selectedMap[key]; }))
190
+ .length;
191
+ return selectedCount > 0 && selectedCount < enabledDayKeys.length;
192
+ };
193
+ /**
194
+ * @param {?} checked
195
+ * @return {?}
196
+ */
197
+ DateTreeFilterPopoverComponent.prototype.toggleAllDays = /**
198
+ * @param {?} checked
199
+ * @return {?}
200
+ */
201
+ function (checked) {
202
+ /** @type {?} */
203
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
204
+ /** @type {?} */
205
+ var enabledDayKeys = this.getEnabledDayKeysInCurrentField();
206
+ enabledDayKeys.forEach((/**
207
+ * @param {?} key
208
+ * @return {?}
209
+ */
210
+ function (key) {
211
+ if (checked) {
212
+ selectedMap[key] = true;
213
+ }
214
+ else {
215
+ delete selectedMap[key];
216
+ }
217
+ }));
218
+ };
219
+ /**
220
+ * @param {?} dayNode
221
+ * @return {?}
222
+ */
223
+ DateTreeFilterPopoverComponent.prototype.isDayChecked = /**
224
+ * @param {?} dayNode
225
+ * @return {?}
226
+ */
227
+ function (dayNode) {
228
+ /** @type {?} */
229
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
230
+ return !!selectedMap[dayNode.key];
231
+ };
232
+ /**
233
+ * @param {?} dayNode
234
+ * @param {?} checked
235
+ * @return {?}
236
+ */
237
+ DateTreeFilterPopoverComponent.prototype.toggleDay = /**
238
+ * @param {?} dayNode
239
+ * @param {?} checked
240
+ * @return {?}
241
+ */
242
+ function (dayNode, checked) {
243
+ if (dayNode.disabled) {
244
+ return;
245
+ }
246
+ /** @type {?} */
247
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
248
+ if (checked) {
249
+ selectedMap[dayNode.key] = true;
250
+ }
251
+ else {
252
+ delete selectedMap[dayNode.key];
253
+ }
254
+ };
255
+ /**
256
+ * @param {?} monthNode
257
+ * @return {?}
258
+ */
259
+ DateTreeFilterPopoverComponent.prototype.isMonthDisabled = /**
260
+ * @param {?} monthNode
261
+ * @return {?}
262
+ */
263
+ function (monthNode) {
264
+ return monthNode.days.every((/**
265
+ * @param {?} dayNode
266
+ * @return {?}
267
+ */
268
+ function (dayNode) { return dayNode.disabled; }));
269
+ };
270
+ /**
271
+ * @param {?} monthNode
272
+ * @return {?}
273
+ */
274
+ DateTreeFilterPopoverComponent.prototype.isMonthChecked = /**
275
+ * @param {?} monthNode
276
+ * @return {?}
277
+ */
278
+ function (monthNode) {
279
+ if (this.isMonthDisabled(monthNode)) {
280
+ return false;
281
+ }
282
+ /** @type {?} */
283
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
284
+ /** @type {?} */
285
+ var enabledDays = monthNode.days.filter((/**
286
+ * @param {?} dayNode
287
+ * @return {?}
288
+ */
289
+ function (dayNode) { return !dayNode.disabled; }));
290
+ return enabledDays.every((/**
291
+ * @param {?} dayNode
292
+ * @return {?}
293
+ */
294
+ function (dayNode) { return !!selectedMap[dayNode.key]; }));
295
+ };
296
+ /**
297
+ * @param {?} monthNode
298
+ * @return {?}
299
+ */
300
+ DateTreeFilterPopoverComponent.prototype.isMonthIndeterminate = /**
301
+ * @param {?} monthNode
302
+ * @return {?}
303
+ */
304
+ function (monthNode) {
305
+ if (this.isMonthDisabled(monthNode)) {
306
+ return false;
307
+ }
308
+ /** @type {?} */
309
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
310
+ /** @type {?} */
311
+ var enabledDays = monthNode.days.filter((/**
312
+ * @param {?} dayNode
313
+ * @return {?}
314
+ */
315
+ function (dayNode) { return !dayNode.disabled; }));
316
+ /** @type {?} */
317
+ var selectedCount = enabledDays.filter((/**
318
+ * @param {?} dayNode
319
+ * @return {?}
320
+ */
321
+ function (dayNode) {
322
+ return !!selectedMap[dayNode.key];
323
+ })).length;
324
+ return selectedCount > 0 && selectedCount < enabledDays.length;
325
+ };
326
+ /**
327
+ * @param {?} monthNode
328
+ * @param {?} checked
329
+ * @return {?}
330
+ */
331
+ DateTreeFilterPopoverComponent.prototype.toggleMonth = /**
332
+ * @param {?} monthNode
333
+ * @param {?} checked
334
+ * @return {?}
335
+ */
336
+ function (monthNode, checked) {
337
+ if (this.isMonthDisabled(monthNode)) {
338
+ return;
339
+ }
340
+ /** @type {?} */
341
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
342
+ monthNode.days.forEach((/**
343
+ * @param {?} dayNode
344
+ * @return {?}
345
+ */
346
+ function (dayNode) {
347
+ if (dayNode.disabled) {
348
+ return;
349
+ }
350
+ if (checked) {
351
+ selectedMap[dayNode.key] = true;
352
+ }
353
+ else {
354
+ delete selectedMap[dayNode.key];
355
+ }
356
+ }));
357
+ };
358
+ /**
359
+ * @param {?} yearNode
360
+ * @return {?}
361
+ */
362
+ DateTreeFilterPopoverComponent.prototype.isYearDisabled = /**
363
+ * @param {?} yearNode
364
+ * @return {?}
365
+ */
366
+ function (yearNode) {
367
+ var _this = this;
368
+ return yearNode.months.every((/**
369
+ * @param {?} monthNode
370
+ * @return {?}
371
+ */
372
+ function (monthNode) {
373
+ return _this.isMonthDisabled(monthNode);
374
+ }));
375
+ };
376
+ /**
377
+ * @param {?} yearNode
378
+ * @return {?}
379
+ */
380
+ DateTreeFilterPopoverComponent.prototype.isYearChecked = /**
381
+ * @param {?} yearNode
382
+ * @return {?}
383
+ */
384
+ function (yearNode) {
385
+ var _this = this;
386
+ if (this.isYearDisabled(yearNode)) {
387
+ return false;
388
+ }
389
+ /** @type {?} */
390
+ var enabledMonths = yearNode.months.filter((/**
391
+ * @param {?} monthNode
392
+ * @return {?}
393
+ */
394
+ function (monthNode) { return !_this.isMonthDisabled(monthNode); }));
395
+ return enabledMonths.every((/**
396
+ * @param {?} monthNode
397
+ * @return {?}
398
+ */
399
+ function (monthNode) { return _this.isMonthChecked(monthNode); }));
400
+ };
401
+ /**
402
+ * @param {?} yearNode
403
+ * @return {?}
404
+ */
405
+ DateTreeFilterPopoverComponent.prototype.isYearIndeterminate = /**
406
+ * @param {?} yearNode
407
+ * @return {?}
408
+ */
409
+ function (yearNode) {
410
+ if (this.isYearDisabled(yearNode)) {
411
+ return false;
412
+ }
413
+ /** @type {?} */
414
+ var selectedMap = this.getFieldDaySelectionMap(this.field);
415
+ /** @type {?} */
416
+ var enabledDays = [];
417
+ yearNode.months.forEach((/**
418
+ * @param {?} monthNode
419
+ * @return {?}
420
+ */
421
+ function (monthNode) {
422
+ monthNode.days.forEach((/**
423
+ * @param {?} dayNode
424
+ * @return {?}
425
+ */
426
+ function (dayNode) {
427
+ if (!dayNode.disabled) {
428
+ enabledDays.push(dayNode.key);
429
+ }
430
+ }));
431
+ }));
432
+ /** @type {?} */
433
+ var selectedCount = enabledDays.filter((/**
434
+ * @param {?} key
435
+ * @return {?}
436
+ */
437
+ function (key) { return !!selectedMap[key]; })).length;
438
+ return selectedCount > 0 && selectedCount < enabledDays.length;
439
+ };
440
+ /**
441
+ * @param {?} yearNode
442
+ * @param {?} checked
443
+ * @return {?}
444
+ */
445
+ DateTreeFilterPopoverComponent.prototype.toggleYear = /**
446
+ * @param {?} yearNode
447
+ * @param {?} checked
448
+ * @return {?}
449
+ */
450
+ function (yearNode, checked) {
451
+ var _this = this;
452
+ if (this.isYearDisabled(yearNode)) {
453
+ return;
454
+ }
455
+ yearNode.months.forEach((/**
456
+ * @param {?} monthNode
457
+ * @return {?}
458
+ */
459
+ function (monthNode) {
460
+ _this.toggleMonth(monthNode, checked);
461
+ }));
462
+ };
463
+ /**
464
+ * @return {?}
465
+ */
466
+ DateTreeFilterPopoverComponent.prototype.clearSelection = /**
467
+ * @return {?}
468
+ */
469
+ function () {
470
+ if (this.field) {
471
+ this.workingSelectedByField[this.field] = {};
472
+ }
473
+ this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
474
+ this.rebuildTree();
475
+ };
476
+ /**
477
+ * @return {?}
478
+ */
479
+ DateTreeFilterPopoverComponent.prototype.applySelection = /**
480
+ * @return {?}
481
+ */
482
+ function () {
483
+ this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
484
+ this.closePopover();
485
+ };
486
+ /**
487
+ * @private
488
+ * @return {?}
489
+ */
490
+ DateTreeFilterPopoverComponent.prototype.rebuildTree = /**
491
+ * @private
492
+ * @return {?}
493
+ */
494
+ function () {
495
+ var _this = this;
496
+ if (!this.field) {
497
+ this.years = [];
498
+ return;
499
+ }
500
+ /** @type {?} */
501
+ var sourceRows = this.sourceRows || [];
502
+ /** @type {?} */
503
+ var rowsByOtherFilters = this.filterRowsBySelectedDateTree(sourceRows, this.field);
504
+ /** @type {?} */
505
+ var availableDayKeyMap = {};
506
+ rowsByOtherFilters.forEach((/**
507
+ * @param {?} row
508
+ * @return {?}
509
+ */
510
+ function (row) {
511
+ /** @type {?} */
512
+ var dayKey = _this.getDayKeyByRowValue(row[_this.field]);
513
+ if (dayKey) {
514
+ availableDayKeyMap[dayKey] = true;
515
+ }
516
+ }));
517
+ /** @type {?} */
518
+ var groupedMap = {};
519
+ sourceRows.forEach((/**
520
+ * @param {?} row
521
+ * @return {?}
522
+ */
523
+ function (row) {
524
+ /** @type {?} */
525
+ var date = _this.parseDateValue(row[_this.field]);
526
+ if (!date) {
527
+ return;
528
+ }
529
+ /** @type {?} */
530
+ var year = date.getFullYear();
531
+ /** @type {?} */
532
+ var month = date.getMonth() + 1;
533
+ /** @type {?} */
534
+ var day = date.getDate();
535
+ if (!groupedMap[year]) {
536
+ groupedMap[year] = {};
537
+ }
538
+ if (!groupedMap[year][month]) {
539
+ groupedMap[year][month] = {};
540
+ }
541
+ if (!groupedMap[year][month][day]) {
542
+ groupedMap[year][month][day] = 0;
543
+ }
544
+ groupedMap[year][month][day] += 1;
545
+ }));
546
+ /** @type {?} */
547
+ var expandState = this.getOrCreateExpandState(this.field);
548
+ this.years = Object.keys(groupedMap)
549
+ .map((/**
550
+ * @param {?} key
551
+ * @return {?}
552
+ */
553
+ function (key) { return Number(key); }))
554
+ .sort((/**
555
+ * @param {?} a
556
+ * @param {?} b
557
+ * @return {?}
558
+ */
559
+ function (a, b) { return b - a; }))
560
+ .map((/**
561
+ * @param {?} year
562
+ * @return {?}
563
+ */
564
+ function (year) {
565
+ /** @type {?} */
566
+ var months = Object.keys(groupedMap[year])
567
+ .map((/**
568
+ * @param {?} key
569
+ * @return {?}
570
+ */
571
+ function (key) { return Number(key); }))
572
+ .sort((/**
573
+ * @param {?} a
574
+ * @param {?} b
575
+ * @return {?}
576
+ */
577
+ function (a, b) { return a - b; }))
578
+ .map((/**
579
+ * @param {?} month
580
+ * @return {?}
581
+ */
582
+ function (month) {
583
+ /** @type {?} */
584
+ var monthKey = year + "-" + _this.pad2(month);
585
+ if (expandState.months[monthKey] === undefined) {
586
+ expandState.months[monthKey] = true;
587
+ }
588
+ /** @type {?} */
589
+ var days = Object.keys(groupedMap[year][month])
590
+ .map((/**
591
+ * @param {?} key
592
+ * @return {?}
593
+ */
594
+ function (key) { return Number(key); }))
595
+ .sort((/**
596
+ * @param {?} a
597
+ * @param {?} b
598
+ * @return {?}
599
+ */
600
+ function (a, b) { return a - b; }))
601
+ .map((/**
602
+ * @param {?} day
603
+ * @return {?}
604
+ */
605
+ function (day) {
606
+ /** @type {?} */
607
+ var dayKey = _this.toDayKey(year, month, day);
608
+ /** @type {?} */
609
+ var dayDate = new Date(year, month - 1, day);
610
+ return {
611
+ key: dayKey,
612
+ day: day,
613
+ label: moment(dayDate).format("D MMM YYYY"),
614
+ count: groupedMap[year][month][day],
615
+ disabled: !availableDayKeyMap[dayKey],
616
+ };
617
+ }));
618
+ return {
619
+ key: monthKey,
620
+ month: month,
621
+ label: moment()
622
+ .month(month - 1)
623
+ .format("MMM"),
624
+ expanded: !!expandState.months[monthKey],
625
+ days: days,
626
+ };
627
+ }));
628
+ /** @type {?} */
629
+ var yearKey = String(year);
630
+ if (expandState.years[yearKey] === undefined) {
631
+ expandState.years[yearKey] = true;
632
+ }
633
+ return {
634
+ key: yearKey,
635
+ year: year,
636
+ expanded: !!expandState.years[yearKey],
637
+ months: months,
638
+ };
639
+ }));
640
+ };
641
+ /**
642
+ * @private
643
+ * @param {?} rows
644
+ * @param {?=} excludeField
645
+ * @return {?}
646
+ */
647
+ DateTreeFilterPopoverComponent.prototype.filterRowsBySelectedDateTree = /**
648
+ * @private
649
+ * @param {?} rows
650
+ * @param {?=} excludeField
651
+ * @return {?}
652
+ */
653
+ function (rows, excludeField) {
654
+ var _this = this;
655
+ /** @type {?} */
656
+ var filteredRows = rows ? rows.slice() : [];
657
+ (this.dateFields || []).forEach((/**
658
+ * @param {?} field
659
+ * @return {?}
660
+ */
661
+ function (field) {
662
+ if (excludeField && field === excludeField) {
663
+ return;
664
+ }
665
+ /** @type {?} */
666
+ var selectedMap = _this.getFieldDaySelectionMap(field);
667
+ /** @type {?} */
668
+ var selectedKeys = Object.keys(selectedMap);
669
+ if (!selectedKeys.length) {
670
+ return;
671
+ }
672
+ filteredRows = filteredRows.filter((/**
673
+ * @param {?} row
674
+ * @return {?}
675
+ */
676
+ function (row) {
677
+ /** @type {?} */
678
+ var dayKey = _this.getDayKeyByRowValue(row[field]);
679
+ return dayKey ? !!selectedMap[dayKey] : false;
680
+ }));
681
+ }));
682
+ return filteredRows;
683
+ };
684
+ /**
685
+ * @private
686
+ * @param {?} value
687
+ * @return {?}
688
+ */
689
+ DateTreeFilterPopoverComponent.prototype.parseDateValue = /**
690
+ * @private
691
+ * @param {?} value
692
+ * @return {?}
693
+ */
694
+ function (value) {
695
+ if (!value) {
696
+ return null;
697
+ }
698
+ if (value instanceof Date) {
699
+ return value;
700
+ }
701
+ /** @type {?} */
702
+ var parsed = moment(value, [
703
+ "YYYY-MM-DD",
704
+ "MM/DD/YYYY",
705
+ "DD/MM/YYYY",
706
+ "YYYY/MM/DD",
707
+ "DD-MMM-YYYY",
708
+ "MMM DD, YYYY",
709
+ moment.ISO_8601,
710
+ ], true);
711
+ if (parsed.isValid()) {
712
+ return parsed.toDate();
713
+ }
714
+ /** @type {?} */
715
+ var fallback = new Date(value);
716
+ return isNaN(fallback.getTime()) ? null : fallback;
717
+ };
718
+ /**
719
+ * @private
720
+ * @param {?} field
721
+ * @return {?}
722
+ */
723
+ DateTreeFilterPopoverComponent.prototype.getOrCreateExpandState = /**
724
+ * @private
725
+ * @param {?} field
726
+ * @return {?}
727
+ */
728
+ function (field) {
729
+ if (!this.expandStateByField[field]) {
730
+ this.expandStateByField[field] = { years: {}, months: {} };
731
+ }
732
+ return this.expandStateByField[field];
733
+ };
734
+ /**
735
+ * @private
736
+ * @param {?} field
737
+ * @return {?}
738
+ */
739
+ DateTreeFilterPopoverComponent.prototype.getFieldDaySelectionMap = /**
740
+ * @private
741
+ * @param {?} field
742
+ * @return {?}
743
+ */
744
+ function (field) {
745
+ if (!this.workingSelectedByField[field]) {
746
+ this.workingSelectedByField[field] = {};
747
+ }
748
+ return this.workingSelectedByField[field];
749
+ };
750
+ /**
751
+ * @private
752
+ * @param {?} year
753
+ * @param {?} month
754
+ * @param {?} day
755
+ * @return {?}
756
+ */
757
+ DateTreeFilterPopoverComponent.prototype.toDayKey = /**
758
+ * @private
759
+ * @param {?} year
760
+ * @param {?} month
761
+ * @param {?} day
762
+ * @return {?}
763
+ */
764
+ function (year, month, day) {
765
+ return year + "-" + this.pad2(month) + "-" + this.pad2(day);
766
+ };
767
+ /**
768
+ * @private
769
+ * @param {?} value
770
+ * @return {?}
771
+ */
772
+ DateTreeFilterPopoverComponent.prototype.pad2 = /**
773
+ * @private
774
+ * @param {?} value
775
+ * @return {?}
776
+ */
777
+ function (value) {
778
+ return value < 10 ? "0" + value : String(value);
779
+ };
780
+ /**
781
+ * @private
782
+ * @param {?} value
783
+ * @return {?}
784
+ */
785
+ DateTreeFilterPopoverComponent.prototype.getDayKeyByRowValue = /**
786
+ * @private
787
+ * @param {?} value
788
+ * @return {?}
789
+ */
790
+ function (value) {
791
+ /** @type {?} */
792
+ var date = this.parseDateValue(value);
793
+ if (!date) {
794
+ return "";
795
+ }
796
+ return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
797
+ };
798
+ /**
799
+ * @private
800
+ * @return {?}
801
+ */
802
+ DateTreeFilterPopoverComponent.prototype.getEnabledDayKeysInCurrentField = /**
803
+ * @private
804
+ * @return {?}
805
+ */
806
+ function () {
807
+ /** @type {?} */
808
+ var keys = [];
809
+ this.years.forEach((/**
810
+ * @param {?} yearNode
811
+ * @return {?}
812
+ */
813
+ function (yearNode) {
814
+ yearNode.months.forEach((/**
815
+ * @param {?} monthNode
816
+ * @return {?}
817
+ */
818
+ function (monthNode) {
819
+ monthNode.days.forEach((/**
820
+ * @param {?} dayNode
821
+ * @return {?}
822
+ */
823
+ function (dayNode) {
824
+ if (!dayNode.disabled) {
825
+ keys.push(dayNode.key);
826
+ }
827
+ }));
828
+ }));
829
+ }));
830
+ return keys;
831
+ };
832
+ /**
833
+ * @private
834
+ * @param {?} source
835
+ * @return {?}
836
+ */
837
+ DateTreeFilterPopoverComponent.prototype.cloneSelectionMap = /**
838
+ * @private
839
+ * @param {?} source
840
+ * @return {?}
841
+ */
842
+ function (source) {
843
+ try {
844
+ return source ? JSON.parse(JSON.stringify(source)) : {};
845
+ }
846
+ catch (e) {
847
+ return {};
848
+ }
849
+ };
850
+ DateTreeFilterPopoverComponent.decorators = [
851
+ { type: Component, args: [{
852
+ selector: "rs-date-tree-filter-popover",
853
+ template: "<div class=\"date-tree-filter-popover\">\r\n <div class=\"popover-search\">\r\n <span class=\"search-icon\"><img src=\"/assets/img/search.svg\" alt=\"\" /></span>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"translation.SEARCH || '.SEARCH'\"\r\n [value]=\"keyword\"\r\n (input)=\"onKeywordChange($event.target.value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"popover-tree\">\r\n <label class=\"tree-row all-row\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllChecked()\"\r\n [indeterminate]=\"isAllIndeterminate()\"\r\n (change)=\"toggleAllDays($event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ translation.ALL || '.ALL' }}</span>\r\n </label>\r\n\r\n <div class=\"year-block\" *ngFor=\"let yearNode of getVisibleYears()\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleYearExpanded(yearNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: yearNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isYearDisabled(yearNode)\"\r\n [checked]=\"isYearChecked(yearNode)\"\r\n [indeterminate]=\"isYearIndeterminate(yearNode)\"\r\n (change)=\"toggleYear(yearNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ yearNode.year }}</span>\r\n </div>\r\n\r\n <div class=\"month-block\" *ngIf=\"yearNode.expanded\">\r\n <div class=\"month-item\" *ngFor=\"let monthNode of yearNode.months\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleMonthExpanded(monthNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: monthNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isMonthDisabled(monthNode)\"\r\n [checked]=\"isMonthChecked(monthNode)\"\r\n [indeterminate]=\"isMonthIndeterminate(monthNode)\"\r\n (change)=\"toggleMonth(monthNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ monthNode.label }}</span>\r\n </div>\r\n\r\n <div class=\"day-block\" *ngIf=\"monthNode.expanded\">\r\n <label\r\n class=\"tree-row day-row\"\r\n *ngFor=\"let dayNode of monthNode.days\"\r\n [ngClass]=\"{ disabled: dayNode.disabled }\"\r\n >\r\n <span class=\"tree-toggle-spacer\"></span>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"dayNode.disabled\"\r\n [checked]=\"isDayChecked(dayNode)\"\r\n (change)=\"toggleDay(dayNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ dayNode.label }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"popover-footer\">\r\n <button type=\"button\" (click)=\"clearSelection()\">\r\n {{ translation.CLEAR || '.CLEAR' }}\r\n </button>\r\n <button type=\"button\" class=\"primary-btn\" (click)=\"applySelection()\">\r\n {{ translation.APPLY || '.APPLY' }}\r\n </button>\r\n </div>\r\n</div>\r\n",
854
+ styles: [":host{position:fixed;left:12px;top:12px;z-index:20;width:300px}.date-tree-filter-popover{background:#fff;border:1px solid #eaedf0;border-radius:10px;box-shadow:0 0 4px rgba(0,0,0,.25);padding:4px 8px;display:flex;flex-direction:column;color:#44566c;font-family:Arial}.popover-search{position:relative;padding:4px 0 8px}.popover-search .search-icon{position:absolute;left:10px;top:10px;color:#929dab;font-size:12px;line-height:12px}.popover-search input{width:100%;height:28px;border:1px solid #eaedf0;border-radius:16px;padding:0 10px 0 28px;outline:0;font-size:12px;color:#44566c}.popover-tree{max-height:320px;overflow:auto;padding-right:2px}.tree-row{display:flex;align-items:center;min-height:24px;font-size:11px;line-height:14px;color:#44566c}.tree-row input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;margin:0 6px 0 0;box-sizing:border-box;border:1px solid #d8d8d8;border-radius:3px;background-color:#fff;cursor:pointer;vertical-align:middle;flex-shrink:0}.tree-row input[type=checkbox]:checked{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M0.5 4.31818L3 7.5L5.75 4L8.5 0.5' stroke='white' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:indeterminate{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M1.5 4.5H7.5' stroke='white' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.all-row{padding-left:20px;margin-bottom:2px}.year-block{margin-bottom:2px}.month-block{padding-left:20px}.day-block{padding-left:24px}.tree-toggle-btn{width:16px;height:16px;padding:0;margin-right:4px;border:none;background:0 0;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.tree-arrow{display:inline-block;width:6px;height:6px;border-right:1px solid #6c7c90;border-bottom:1px solid #6c7c90;transform:rotate(-45deg);transition:transform .15s}.tree-arrow.expanded{transform:rotate(45deg)}.tree-toggle-spacer{width:20px;display:inline-block}.row-label{color:#44566c}.day-row.disabled .row-label{color:#adb5bd}.popover-footer{margin-top:8px;padding:12px 0 8px;border-top:1px solid #eaedf0;display:flex;justify-content:flex-end;gap:12px}.popover-footer button{min-width:56px;height:26px;padding:0 8px;border-radius:4px;border:1px solid #dbe1e7;background:#fff;font-size:11px;color:#44566c;cursor:pointer}.popover-footer .primary-btn{background:#1364b3;border-color:#1364b3;color:#fff}"]
855
+ }] }
856
+ ];
857
+ DateTreeFilterPopoverComponent.propDecorators = {
858
+ field: [{ type: Input }],
859
+ translation: [{ type: Input }],
860
+ sourceRows: [{ type: Input }],
861
+ dateFields: [{ type: Input }],
862
+ selectedByField: [{ type: Input }],
863
+ fieldLabelMap: [{ type: Input }],
864
+ apply: [{ type: Output }],
865
+ close: [{ type: Output }]
866
+ };
867
+ return DateTreeFilterPopoverComponent;
868
+ }());
869
+ export { DateTreeFilterPopoverComponent };
870
+ if (false) {
871
+ /** @type {?} */
872
+ DateTreeFilterPopoverComponent.prototype.field;
873
+ /** @type {?} */
874
+ DateTreeFilterPopoverComponent.prototype.translation;
875
+ /** @type {?} */
876
+ DateTreeFilterPopoverComponent.prototype.sourceRows;
877
+ /** @type {?} */
878
+ DateTreeFilterPopoverComponent.prototype.dateFields;
879
+ /** @type {?} */
880
+ DateTreeFilterPopoverComponent.prototype.selectedByField;
881
+ /** @type {?} */
882
+ DateTreeFilterPopoverComponent.prototype.fieldLabelMap;
883
+ /** @type {?} */
884
+ DateTreeFilterPopoverComponent.prototype.apply;
885
+ /** @type {?} */
886
+ DateTreeFilterPopoverComponent.prototype.close;
887
+ /** @type {?} */
888
+ DateTreeFilterPopoverComponent.prototype.keyword;
889
+ /** @type {?} */
890
+ DateTreeFilterPopoverComponent.prototype.years;
891
+ /**
892
+ * @type {?}
893
+ * @private
894
+ */
895
+ DateTreeFilterPopoverComponent.prototype.expandStateByField;
896
+ /**
897
+ * @type {?}
898
+ * @private
899
+ */
900
+ DateTreeFilterPopoverComponent.prototype.workingSelectedByField;
901
+ }
902
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXRyZWUtZmlsdGVyL2RhdGUtdHJlZS1maWx0ZXItcG9wb3Zlci9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QjtJQUFBO1FBTVcsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV2QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVwQyxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVqQix1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsMkJBQXNCLEdBQVEsRUFBRSxDQUFDO0lBeVozQyxDQUFDOzs7OztJQXZaQyxvREFBVzs7OztJQUFYLFVBQVksT0FBc0I7UUFDaEMsSUFDRSxPQUFPLENBQUMsS0FBSztZQUNiLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxlQUFlO1lBQ3ZCLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCO1lBQ0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEQsSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNI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O1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDWDtJQUNILENBQUM7O2dCQTVhRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsb3dJQUFxQzs7aUJBRXRDOzs7d0JBRUUsS0FBSzs4QkFDTCxLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSztrQ0FDTCxLQUFLO2dDQUNMLEtBQUs7d0JBRUwsTUFBTTt3QkFDTixNQUFNOztJQStaVCxxQ0FBQztDQUFBLEFBN2FELElBNmFDO1NBeGFZLDhCQUE4Qjs7O0lBQ3pDLCtDQUFvQjs7SUFDcEIscURBQTBCOztJQUMxQixvREFBZ0M7O0lBQ2hDLG9EQUFtQzs7SUFDbkMseURBQW1DOztJQUNuQyx1REFBaUM7O0lBRWpDLCtDQUEwQzs7SUFDMUMsK0NBQTJDOztJQUUzQyxpREFBb0I7O0lBQ3BCLCtDQUF5Qjs7Ozs7SUFFekIsNERBQXFDOzs7OztJQUNyQyxnRUFBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwicnMtZGF0ZS10cmVlLWZpbHRlci1wb3BvdmVyXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9pbmRleC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9pbmRleC5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGVUcmVlRmlsdGVyUG9wb3ZlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgZmllbGQgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgc291cmNlUm93czogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBkYXRlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkQnlGaWVsZDogYW55ID0ge307XHJcbiAgQElucHV0KCkgZmllbGRMYWJlbE1hcDogYW55ID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGtleXdvcmQgPSBcIlwiO1xyXG4gIHB1YmxpYyB5ZWFyczogYW55W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBleHBhbmRTdGF0ZUJ5RmllbGQ6IGFueSA9IHt9O1xyXG4gIHByaXZhdGUgd29ya2luZ1NlbGVjdGVkQnlGaWVsZDogYW55ID0ge307XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgY2hhbmdlcy5maWVsZCB8fFxyXG4gICAgICBjaGFuZ2VzLnNvdXJjZVJvd3MgfHxcclxuICAgICAgY2hhbmdlcy5zZWxlY3RlZEJ5RmllbGQgfHxcclxuICAgICAgY2hhbmdlcy5kYXRlRmllbGRzXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5rZXl3b3JkID0gXCJcIjtcclxuICAgICAgdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkID0gdGhpcy5jbG9uZVNlbGVjdGlvbk1hcChcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQnlGaWVsZFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnJlYnVpbGRUcmVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VQb3BvdmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbG9zZS5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25LZXl3b3JkQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMua2V5d29yZCA9IHZhbHVlIHx8IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VmlzaWJsZVllYXJzKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSAodGhpcy5rZXl3b3JkIHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCFzZWFyY2hUZXh0KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnllYXJzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMueWVhcnNcclxuICAgICAgLm1hcCgoeWVhck5vZGUpID0+IHtcclxuICAgICAgICBjb25zdCB5ZWFyTWF0Y2hlZCA9XHJcbiAgICAgICAgICBTdHJpbmcoeWVhck5vZGUueWVhcikudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID4gLTE7XHJcbiAgICAgICAgY29uc3QgbW9udGhzID0geWVhck5vZGUubW9udGhzXHJcbiAgICAgICAgICAubWFwKChtb250aE5vZGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbW9udGhNYXRjaGVkID1cclxuICAgICAgICAgICAgICBTdHJpbmcobW9udGhOb2RlLmxhYmVsKVxyXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgIC5pbmRleE9mKHNlYXJjaFRleHQpID4gLTE7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheXMgPSBtb250aE5vZGUuZGF5cy5maWx0ZXIoKGRheU5vZGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgU3RyaW5nKGRheU5vZGUubGFiZWwpXHJcbiAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHNlYXJjaFRleHQpID4gLTFcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHllYXJNYXRjaGVkIHx8IG1vbnRoTWF0Y2hlZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBtb250aE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG1vbnRoTm9kZSwgeyBkYXlzOiBkYXlzIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maWx0ZXIoKG1vbnRoTm9kZSkgPT4gbW9udGhOb2RlLmRheXMubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgaWYgKHllYXJNYXRjaGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4geWVhck5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB5ZWFyTm9kZSwgeyBtb250aHM6IG1vbnRocyB9KTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoeWVhck5vZGUpID0+IHllYXJOb2RlLm1vbnRocy5sZW5ndGggPiAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVZZWFyRXhwYW5kZWQoeWVhck5vZGU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldE9yQ3JlYXRlRXhwYW5kU3RhdGUodGhpcy5maWVsZCk7XHJcbiAgICBzdGF0ZS55ZWFyc1t5ZWFyTm9kZS5rZXldID0gIXN0YXRlLnllYXJzW3llYXJOb2RlLmtleV07XHJcbiAgICB5ZWFyTm9kZS5leHBhbmRlZCA9ICEhc3RhdGUueWVhcnNbeWVhck5vZGUua2V5XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVNb250aEV4cGFuZGVkKG1vbnRoTm9kZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0T3JDcmVhdGVFeHBhbmRTdGF0ZSh0aGlzLmZpZWxkKTtcclxuICAgIHN0YXRlLm1vbnRoc1ttb250aE5vZGUua2V5XSA9ICFzdGF0ZS5tb250aHNbbW9udGhOb2RlLmtleV07XHJcbiAgICBtb250aE5vZGUuZXhwYW5kZWQgPSAhIXN0YXRlLm1vbnRoc1ttb250aE5vZGUua2V5XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0FsbENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5S2V5cyA9IHRoaXMuZ2V0RW5hYmxlZERheUtleXNJbkN1cnJlbnRGaWVsZCgpO1xyXG4gICAgaWYgKCFlbmFibGVkRGF5S2V5cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVuYWJsZWREYXlLZXlzLmV2ZXJ5KChrZXkpID0+ICEhc2VsZWN0ZWRNYXBba2V5XSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNBbGxJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheUtleXMgPSB0aGlzLmdldEVuYWJsZWREYXlLZXlzSW5DdXJyZW50RmllbGQoKTtcclxuICAgIGlmICghZW5hYmxlZERheUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBlbmFibGVkRGF5S2V5cy5maWx0ZXIoKGtleSkgPT4gISFzZWxlY3RlZE1hcFtrZXldKVxyXG4gICAgICAubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGVkQ291bnQgPCBlbmFibGVkRGF5S2V5cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlQWxsRGF5cyhjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5S2V5cyA9IHRoaXMuZ2V0RW5hYmxlZERheUtleXNJbkN1cnJlbnRGaWVsZCgpO1xyXG4gICAgZW5hYmxlZERheUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRNYXBba2V5XSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIHNlbGVjdGVkTWFwW2tleV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRGF5Q2hlY2tlZChkYXlOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIHJldHVybiAhIXNlbGVjdGVkTWFwW2RheU5vZGUua2V5XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVEYXkoZGF5Tm9kZTogYW55LCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZGF5Tm9kZS5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV0gPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVsZXRlIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vbnRoRGlzYWJsZWQobW9udGhOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBtb250aE5vZGUuZGF5cy5ldmVyeSgoZGF5Tm9kZSkgPT4gZGF5Tm9kZS5kaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNNb250aENoZWNrZWQobW9udGhOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aE5vZGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlzID0gbW9udGhOb2RlLmRheXMuZmlsdGVyKChkYXlOb2RlKSA9PiAhZGF5Tm9kZS5kaXNhYmxlZCk7XHJcbiAgICByZXR1cm4gZW5hYmxlZERheXMuZXZlcnkoKGRheU5vZGUpID0+ICEhc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vbnRoSW5kZXRlcm1pbmF0ZShtb250aE5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheXMgPSBtb250aE5vZGUuZGF5cy5maWx0ZXIoKGRheU5vZGUpID0+ICFkYXlOb2RlLmRpc2FibGVkKTtcclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBlbmFibGVkRGF5cy5maWx0ZXIoKGRheU5vZGUpID0+IHtcclxuICAgICAgcmV0dXJuICEhc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldO1xyXG4gICAgfSkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGVkQ291bnQgPCBlbmFibGVkRGF5cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlTW9udGgobW9udGhOb2RlOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aE5vZGUpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIG1vbnRoTm9kZS5kYXlzLmZvckVhY2goKGRheU5vZGUpID0+IHtcclxuICAgICAgaWYgKGRheU5vZGUuZGlzYWJsZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICBzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV0gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRlbGV0ZSBzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzWWVhckRpc2FibGVkKHllYXJOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB5ZWFyTm9kZS5tb250aHMuZXZlcnkoKG1vbnRoTm9kZSkgPT5cclxuICAgICAgdGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhOb2RlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1llYXJDaGVja2VkKHllYXJOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzWWVhckRpc2FibGVkKHllYXJOb2RlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbmFibGVkTW9udGhzID0geWVhck5vZGUubW9udGhzLmZpbHRlcihcclxuICAgICAgKG1vbnRoTm9kZSkgPT4gIXRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSlcclxuICAgICk7XHJcbiAgICByZXR1cm4gZW5hYmxlZE1vbnRocy5ldmVyeSgobW9udGhOb2RlKSA9PiB0aGlzLmlzTW9udGhDaGVja2VkKG1vbnRoTm9kZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzWWVhckluZGV0ZXJtaW5hdGUoeWVhck5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhck5vZGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlzID0gW107XHJcbiAgICB5ZWFyTm9kZS5tb250aHMuZm9yRWFjaCgobW9udGhOb2RlKSA9PiB7XHJcbiAgICAgIG1vbnRoTm9kZS5kYXlzLmZvckVhY2goKGRheU5vZGUpID0+IHtcclxuICAgICAgICBpZiAoIWRheU5vZGUuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGVuYWJsZWREYXlzLnB1c2goZGF5Tm9kZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBlbmFibGVkRGF5cy5maWx0ZXIoKGtleSkgPT4gISFzZWxlY3RlZE1hcFtrZXldKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGVuYWJsZWREYXlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVZZWFyKHllYXJOb2RlOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzWWVhckRpc2FibGVkKHllYXJOb2RlKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB5ZWFyTm9kZS5tb250aHMuZm9yRWFjaCgobW9udGhOb2RlKSA9PiB7XHJcbiAgICAgIHRoaXMudG9nZ2xlTW9udGgobW9udGhOb2RlLCBjaGVja2VkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQpIHtcclxuICAgICAgdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW3RoaXMuZmllbGRdID0ge307XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5LmVtaXQodGhpcy5jbG9uZVNlbGVjdGlvbk1hcCh0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGQpKTtcclxuICAgIHRoaXMucmVidWlsZFRyZWUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhcHBseVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwbHkuZW1pdCh0aGlzLmNsb25lU2VsZWN0aW9uTWFwKHRoaXMud29ya2luZ1NlbGVjdGVkQnlGaWVsZCkpO1xyXG4gICAgdGhpcy5jbG9zZVBvcG92ZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVidWlsZFRyZWUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQpIHtcclxuICAgICAgdGhpcy55ZWFycyA9IFtdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzb3VyY2VSb3dzID0gdGhpcy5zb3VyY2VSb3dzIHx8IFtdO1xyXG4gICAgY29uc3Qgcm93c0J5T3RoZXJGaWx0ZXJzID0gdGhpcy5maWx0ZXJSb3dzQnlTZWxlY3RlZERhdGVUcmVlKFxyXG4gICAgICBzb3VyY2VSb3dzLFxyXG4gICAgICB0aGlzLmZpZWxkXHJcbiAgICApO1xyXG4gICAgY29uc3QgYXZhaWxhYmxlRGF5S2V5TWFwID0ge307XHJcbiAgICByb3dzQnlPdGhlckZpbHRlcnMuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRheUtleSA9IHRoaXMuZ2V0RGF5S2V5QnlSb3dWYWx1ZShyb3dbdGhpcy5maWVsZF0pO1xyXG4gICAgICBpZiAoZGF5S2V5KSB7XHJcbiAgICAgICAgYXZhaWxhYmxlRGF5S2V5TWFwW2RheUtleV0gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBncm91cGVkTWFwID0ge307XHJcbiAgICBzb3VyY2VSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5wYXJzZURhdGVWYWx1ZShyb3dbdGhpcy5maWVsZF0pO1xyXG4gICAgICBpZiAoIWRhdGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcclxuICAgICAgaWYgKCFncm91cGVkTWFwW3llYXJdKSB7XHJcbiAgICAgICAgZ3JvdXBlZE1hcFt5ZWFyXSA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JvdXBlZE1hcFt5ZWFyXVttb250aF0pIHtcclxuICAgICAgICBncm91cGVkTWFwW3llYXJdW21vbnRoXSA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSkge1xyXG4gICAgICAgIGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdW2RheV0gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdW2RheV0gKz0gMTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGV4cGFuZFN0YXRlID0gdGhpcy5nZXRPckNyZWF0ZUV4cGFuZFN0YXRlKHRoaXMuZmllbGQpO1xyXG4gICAgdGhpcy55ZWFycyA9IE9iamVjdC5rZXlzKGdyb3VwZWRNYXApXHJcbiAgICAgIC5tYXAoKGtleSkgPT4gTnVtYmVyKGtleSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSlcclxuICAgICAgLm1hcCgoeWVhcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vbnRocyA9IE9iamVjdC5rZXlzKGdyb3VwZWRNYXBbeWVhcl0pXHJcbiAgICAgICAgICAubWFwKChrZXkpID0+IE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKVxyXG4gICAgICAgICAgLm1hcCgobW9udGgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbW9udGhLZXkgPSB5ZWFyICsgXCItXCIgKyB0aGlzLnBhZDIobW9udGgpO1xyXG4gICAgICAgICAgICBpZiAoZXhwYW5kU3RhdGUubW9udGhzW21vbnRoS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgZXhwYW5kU3RhdGUubW9udGhzW21vbnRoS2V5XSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZGF5cyA9IE9iamVjdC5rZXlzKGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdKVxyXG4gICAgICAgICAgICAgIC5tYXAoKGtleSkgPT4gTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKVxyXG4gICAgICAgICAgICAgIC5tYXAoKGRheSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5S2V5ID0gdGhpcy50b0RheUtleSh5ZWFyLCBtb250aCwgZGF5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRheURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICBrZXk6IGRheUtleSxcclxuICAgICAgICAgICAgICAgICAgZGF5OiBkYXksXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBtb21lbnQoZGF5RGF0ZSkuZm9ybWF0KFwiRCBNTU0gWVlZWVwiKSxcclxuICAgICAgICAgICAgICAgICAgY291bnQ6IGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdW2RheV0sXHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhYXZhaWxhYmxlRGF5S2V5TWFwW2RheUtleV0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGtleTogbW9udGhLZXksXHJcbiAgICAgICAgICAgICAgbW9udGg6IG1vbnRoLFxyXG4gICAgICAgICAgICAgIGxhYmVsOiBtb21lbnQoKVxyXG4gICAgICAgICAgICAgICAgLm1vbnRoKG1vbnRoIC0gMSlcclxuICAgICAgICAgICAgICAgIC5mb3JtYXQoXCJNTU1cIiksXHJcbiAgICAgICAgICAgICAgZXhwYW5kZWQ6ICEhZXhwYW5kU3RhdGUubW9udGhzW21vbnRoS2V5XSxcclxuICAgICAgICAgICAgICBkYXlzOiBkYXlzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgeWVhcktleSA9IFN0cmluZyh5ZWFyKTtcclxuICAgICAgICBpZiAoZXhwYW5kU3RhdGUueWVhcnNbeWVhcktleV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgZXhwYW5kU3RhdGUueWVhcnNbeWVhcktleV0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAga2V5OiB5ZWFyS2V5LFxyXG4gICAgICAgICAgeWVhcjogeWVhcixcclxuICAgICAgICAgIGV4cGFuZGVkOiAhIWV4cGFuZFN0YXRlLnllYXJzW3llYXJLZXldLFxyXG4gICAgICAgICAgbW9udGhzOiBtb250aHMsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlclJvd3NCeVNlbGVjdGVkRGF0ZVRyZWUocm93czogYW55W10sIGV4Y2x1ZGVGaWVsZD86IHN0cmluZykge1xyXG4gICAgbGV0IGZpbHRlcmVkUm93cyA9IHJvd3MgPyByb3dzLnNsaWNlKCkgOiBbXTtcclxuICAgICh0aGlzLmRhdGVGaWVsZHMgfHwgW10pLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGlmIChleGNsdWRlRmllbGQgJiYgZmllbGQgPT09IGV4Y2x1ZGVGaWVsZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAoZmllbGQpO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZE1hcCk7XHJcbiAgICAgIGlmICghc2VsZWN0ZWRLZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJlZFJvd3MuZmlsdGVyKChyb3cpID0+IHtcclxuICAgICAgICBjb25zdCBkYXlLZXkgPSB0aGlzLmdldERheUtleUJ5Um93VmFsdWUocm93W2ZpZWxkXSk7XHJcbiAgICAgICAgcmV0dXJuIGRheUtleSA/ICEhc2VsZWN0ZWRNYXBbZGF5S2V5XSA6IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkUm93cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlVmFsdWUodmFsdWU6IGFueSk6IERhdGUge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFyc2VkID0gbW9tZW50KFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgW1xyXG4gICAgICAgIFwiWVlZWS1NTS1ERFwiLFxyXG4gICAgICAgIFwiTU0vREQvWVlZWVwiLFxyXG4gICAgICAgIFwiREQvTU0vWVlZWVwiLFxyXG4gICAgICAgIFwiWVlZWS9NTS9ERFwiLFxyXG4gICAgICAgIFwiREQtTU1NLVlZWVlcIixcclxuICAgICAgICBcIk1NTSBERCwgWVlZWVwiLFxyXG4gICAgICAgIG1vbWVudC5JU09fODYwMSxcclxuICAgICAgXSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICAgIGlmIChwYXJzZWQuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHJldHVybiBwYXJzZWQudG9EYXRlKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmYWxsYmFjayA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgIHJldHVybiBpc05hTihmYWxsYmFjay5nZXRUaW1lKCkpID8gbnVsbCA6IGZhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZUV4cGFuZFN0YXRlKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5leHBhbmRTdGF0ZUJ5RmllbGRbZmllbGRdKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kU3RhdGVCeUZpZWxkW2ZpZWxkXSA9IHsgeWVhcnM6IHt9LCBtb250aHM6IHt9IH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5leHBhbmRTdGF0ZUJ5RmllbGRbZmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERheVNlbGVjdGlvbk1hcChmaWVsZDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMud29ya2luZ1NlbGVjdGVkQnlGaWVsZFtmaWVsZF0pIHtcclxuICAgICAgdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMud29ya2luZ1NlbGVjdGVkQnlGaWVsZFtmaWVsZF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvRGF5S2V5KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB5ZWFyICsgXCItXCIgKyB0aGlzLnBhZDIobW9udGgpICsgXCItXCIgKyB0aGlzLnBhZDIoZGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkMih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IFwiMFwiICsgdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXlLZXlCeVJvd1ZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcclxuICAgIGlmICghZGF0ZSkge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRvRGF5S2V5KFxyXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgIGRhdGUuZ2V0RGF0ZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFbmFibGVkRGF5S2V5c0luQ3VycmVudEZpZWxkKCkge1xyXG4gICAgY29uc3Qga2V5cyA9IFtdO1xyXG4gICAgdGhpcy55ZWFycy5mb3JFYWNoKCh5ZWFyTm9kZSkgPT4ge1xyXG4gICAgICB5ZWFyTm9kZS5tb250aHMuZm9yRWFjaCgobW9udGhOb2RlKSA9PiB7XHJcbiAgICAgICAgbW9udGhOb2RlLmRheXMuZm9yRWFjaCgoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFkYXlOb2RlLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGtleXMucHVzaChkYXlOb2RlLmtleSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvbmVTZWxlY3Rpb25NYXAoc291cmNlOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBzb3VyY2UgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNvdXJjZSkpIDoge307XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19