@worktile/gantt 15.0.0-next.0 → 15.1.0-next.0

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 (56) hide show
  1. package/class/event.d.ts +13 -0
  2. package/class/item.d.ts +7 -1
  3. package/components/bar/bar-drag.d.ts +10 -0
  4. package/components/bar/bar.component.d.ts +2 -1
  5. package/components/bar/bar.component.scss +22 -0
  6. package/components/calendar/calendar.scss +91 -0
  7. package/components/calendar/grid/calendar-grid.component.d.ts +24 -0
  8. package/components/calendar/header/calendar-header.component.d.ts +21 -0
  9. package/components/icon/icons.d.ts +1 -0
  10. package/components/links/links.component.d.ts +5 -5
  11. package/components/main/gantt-main.component.d.ts +3 -3
  12. package/components/table/body/gantt-table-body.component.d.ts +58 -0
  13. package/components/table/gantt-table.component.scss +169 -85
  14. package/components/table/gantt-table.scss +271 -0
  15. package/components/table/header/gantt-table-header.component.d.ts +31 -0
  16. package/esm2020/class/event.mjs +5 -1
  17. package/esm2020/class/item.mjs +9 -4
  18. package/esm2020/components/bar/bar-drag.mjs +106 -42
  19. package/esm2020/components/bar/bar.component.mjs +8 -2
  20. package/esm2020/components/calendar/grid/calendar-grid.component.mjs +71 -0
  21. package/esm2020/components/calendar/header/calendar-header.component.mjs +67 -0
  22. package/esm2020/components/icon/icons.mjs +4 -2
  23. package/esm2020/components/links/links.component.mjs +72 -54
  24. package/esm2020/components/main/gantt-main.component.mjs +5 -5
  25. package/esm2020/components/table/body/gantt-table-body.component.mjs +286 -0
  26. package/esm2020/components/table/header/gantt-table-header.component.mjs +140 -0
  27. package/esm2020/gantt-dom.service.mjs +8 -12
  28. package/esm2020/gantt-item-upper.mjs +15 -6
  29. package/esm2020/gantt-print.service.mjs +2 -2
  30. package/esm2020/gantt-upper.mjs +18 -15
  31. package/esm2020/gantt.component.mjs +114 -24
  32. package/esm2020/gantt.module.mjs +25 -10
  33. package/esm2020/root.component.mjs +10 -8
  34. package/esm2020/table/gantt-column.component.mjs +4 -2
  35. package/esm2020/table/gantt-table.component.mjs +12 -4
  36. package/esm2020/utils/helpers.mjs +11 -1
  37. package/fesm2015/worktile-gantt.mjs +903 -373
  38. package/fesm2015/worktile-gantt.mjs.map +1 -1
  39. package/fesm2020/worktile-gantt.mjs +894 -375
  40. package/fesm2020/worktile-gantt.mjs.map +1 -1
  41. package/gantt-dom.service.d.ts +1 -0
  42. package/gantt-item-upper.d.ts +3 -2
  43. package/gantt-upper.d.ts +4 -1
  44. package/gantt.component.d.ts +20 -7
  45. package/gantt.component.scss +35 -0
  46. package/gantt.module.d.ts +18 -15
  47. package/package.json +1 -1
  48. package/root.component.d.ts +1 -1
  49. package/styles/index.scss +4 -2
  50. package/styles/variables.scss +9 -7
  51. package/table/gantt-column.component.d.ts +2 -1
  52. package/table/gantt-table.component.d.ts +5 -2
  53. package/components/calendar/calendar.component.d.ts +0 -26
  54. package/components/table/gantt-table.component.d.ts +0 -41
  55. package/esm2020/components/calendar/calendar.component.mjs +0 -88
  56. package/esm2020/components/table/gantt-table.component.mjs +0 -161
@@ -1,161 +0,0 @@
1
- import { Component, HostBinding, Input, ViewChild, Inject, Output, EventEmitter } from '@angular/core';
2
- import { coerceCssPixelValue } from '@angular/cdk/coercion';
3
- import { GANTT_ABSTRACT_TOKEN } from '../../gantt-abstract';
4
- import { GANTT_UPPER_TOKEN } from '../../gantt-upper';
5
- import { setStyleWithVendorPrefix } from '../../utils/set-style-with-vendor-prefix';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- import * as i2 from "@angular/cdk/drag-drop";
9
- import * as i3 from "../icon/icon.component";
10
- import * as i4 from "../../gantt.pipe";
11
- import * as i5 from "../../gantt-upper";
12
- export const defaultColumnWidth = 100;
13
- export const minColumnWidth = 80;
14
- export class GanttTableComponent {
15
- set columns(columns) {
16
- columns.forEach((column) => {
17
- if (!column.columnWidth) {
18
- column.columnWidth = coerceCssPixelValue(defaultColumnWidth);
19
- }
20
- });
21
- this.columnList = columns;
22
- }
23
- constructor(gantt, ganttUpper, elementRef) {
24
- this.gantt = gantt;
25
- this.ganttUpper = ganttUpper;
26
- this.elementRef = elementRef;
27
- this.itemClick = new EventEmitter();
28
- this.ganttTableClass = true;
29
- this.ganttTableEmptyClass = false;
30
- }
31
- ngOnChanges(changes) {
32
- if (!changes.groups.currentValue?.length && !changes.items.currentValue?.length) {
33
- this.ganttTableEmptyClass = true;
34
- }
35
- else {
36
- this.ganttTableEmptyClass = false;
37
- }
38
- }
39
- dragFixed(config) {
40
- if (config.movedWidth < config.minWidth) {
41
- setStyleWithVendorPrefix({
42
- element: config.target,
43
- style: 'transform',
44
- value: `translate3d(${config.minWidth - config.originWidth}px, 0, 0)`
45
- });
46
- }
47
- }
48
- expandGroup(group) {
49
- this.gantt.expandGroup(group);
50
- }
51
- expandChildren(event, item) {
52
- event.stopPropagation();
53
- this.gantt.expandChildren(item);
54
- }
55
- dragStarted(event) {
56
- const target = event.source.element.nativeElement;
57
- this.dragStartLeft = target.getBoundingClientRect().left;
58
- }
59
- dragMoved(event, column) {
60
- const target = event.source.element.nativeElement;
61
- const left = target.getBoundingClientRect().left;
62
- let originWidth;
63
- let movedWidth;
64
- let minWidth;
65
- if (column) {
66
- originWidth = parseInt(column.columnWidth, 10);
67
- movedWidth = originWidth + (left - this.dragStartLeft);
68
- minWidth = minColumnWidth;
69
- }
70
- else {
71
- originWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
72
- movedWidth = originWidth + (left - this.dragStartLeft);
73
- minWidth = minColumnWidth * this.columnList.length;
74
- }
75
- this.dragFixed({
76
- target,
77
- originWidth,
78
- movedWidth,
79
- minWidth
80
- });
81
- this.showAuxiliaryLine(event);
82
- }
83
- columnDragEnded(event, column) {
84
- const target = event.source.element.nativeElement;
85
- const left = target.getBoundingClientRect().left;
86
- const width = parseInt(column.columnWidth, 10) + (left - this.dragStartLeft);
87
- const columnWidth = Math.max(width || 0, minColumnWidth);
88
- column.columnWidth = coerceCssPixelValue(columnWidth);
89
- if (this.gantt.table) {
90
- this.gantt.table.columnChanges.emit({ columns: this.columnList });
91
- }
92
- this.hideAuxiliaryLine();
93
- event.source.reset();
94
- }
95
- tableDragEnded(event) {
96
- const target = event.source.element.nativeElement;
97
- const left = target.getBoundingClientRect().left;
98
- const tableWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
99
- const dragWidth = left - this.dragStartLeft;
100
- this.columnList.forEach((column) => {
101
- const lastColumnWidth = parseInt(column.columnWidth, 10);
102
- const distributeWidth = parseInt(String(dragWidth * (lastColumnWidth / tableWidth)), 10);
103
- const columnWidth = Math.max(lastColumnWidth + distributeWidth || 0, minColumnWidth);
104
- column.columnWidth = coerceCssPixelValue(columnWidth);
105
- });
106
- if (this.gantt.table) {
107
- this.gantt.table.columnChanges.emit({ columns: this.columnList });
108
- }
109
- this.hideAuxiliaryLine();
110
- event.source.reset();
111
- }
112
- showAuxiliaryLine(event) {
113
- const tableRect = this.elementRef.nativeElement.getBoundingClientRect();
114
- this.draglineElementRef.nativeElement.style.left = `${event.event.clientX - tableRect.left}px`;
115
- this.draglineElementRef.nativeElement.style.display = 'block';
116
- }
117
- hideAuxiliaryLine() {
118
- this.draglineElementRef.nativeElement.style.display = 'none';
119
- }
120
- trackBy(index, item) {
121
- return item.id || index;
122
- }
123
- }
124
- GanttTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttTableComponent, deps: [{ token: GANTT_ABSTRACT_TOKEN }, { token: GANTT_UPPER_TOKEN }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
125
- GanttTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: GanttTableComponent, selector: "gantt-table", inputs: { groups: "groups", items: "items", columns: "columns", groupTemplate: "groupTemplate", emptyTemplate: "emptyTemplate", rowBeforeTemplate: "rowBeforeTemplate", rowAfterTemplate: "rowAfterTemplate" }, outputs: { itemClick: "itemClick" }, host: { properties: { "class.gantt-table": "this.ganttTableClass", "class.gantt-table-empty": "this.ganttTableEmptyClass" } }, viewQueries: [{ propertyName: "draglineElementRef", first: true, predicate: ["dragLine"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"gantt-table-header gantt-table-row\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"></ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event, column)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"columnDragEnded($event, column)\"\n ></div>\n </div>\n</div>\n<div class=\"gantt-table-body\">\n <ng-container *ngIf=\"!groups.length && !items.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"groups && groups.length > 0; else itemsTemplate\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"group.class\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"group.expanded\" (click)=\"expandGroup(group)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"group.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: group.origin, group: group.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ group.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <ng-container *ngIf=\"group.expanded\">\n <ng-template\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ group: group, items: group.items, level: 0 }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"tableDragEnded($event)\"\n></div>\n\n<div #dragLine class=\"gantt-table-drag-auxiliary-line\"></div>\n\n<ng-template #itemsTemplate>\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items, level: 0 }\"></ng-template>\n</ng-template>\n\n<ng-template #ganttItems let-group=\"group\" let-items=\"items\" let-level=\"level\">\n <ng-container *ngFor=\"let item of items; trackBy: trackBy\">\n <div\n (click)=\"itemClick.emit({ event: $event, selectedValue: this.item.origin })\"\n class=\"gantt-table-item gantt-table-row\"\n [class.gantt-table-item-first-level-group]=\"level === 0 && (item.type | isGanttRangeItem)\"\n [class.gantt-table-item-with-group]=\"group\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let first = first\" [style.width]=\"column.columnWidth\">\n <div *ngIf=\"first\" class=\"gantt-expand-icon\" [style.marginLeft.px]=\"level * 20\">\n <ng-container *ngIf=\"level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n ></gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children, level: level + 1, group: group }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.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: i3.GanttIconComponent, selector: "gantt-icon", inputs: ["iconName"] }, { kind: "pipe", type: i4.IsGanttRangeItemPipe, name: "isGanttRangeItem" }] });
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttTableComponent, decorators: [{
127
- type: Component,
128
- args: [{ selector: 'gantt-table', template: "<div class=\"gantt-table-header gantt-table-row\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"></ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event, column)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"columnDragEnded($event, column)\"\n ></div>\n </div>\n</div>\n<div class=\"gantt-table-body\">\n <ng-container *ngIf=\"!groups.length && !items.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"groups && groups.length > 0; else itemsTemplate\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"group.class\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"group.expanded\" (click)=\"expandGroup(group)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"group.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: group.origin, group: group.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ group.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <ng-container *ngIf=\"group.expanded\">\n <ng-template\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ group: group, items: group.items, level: 0 }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"tableDragEnded($event)\"\n></div>\n\n<div #dragLine class=\"gantt-table-drag-auxiliary-line\"></div>\n\n<ng-template #itemsTemplate>\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items, level: 0 }\"></ng-template>\n</ng-template>\n\n<ng-template #ganttItems let-group=\"group\" let-items=\"items\" let-level=\"level\">\n <ng-container *ngFor=\"let item of items; trackBy: trackBy\">\n <div\n (click)=\"itemClick.emit({ event: $event, selectedValue: this.item.origin })\"\n class=\"gantt-table-item gantt-table-row\"\n [class.gantt-table-item-first-level-group]=\"level === 0 && (item.type | isGanttRangeItem)\"\n [class.gantt-table-item-with-group]=\"group\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let first = first\" [style.width]=\"column.columnWidth\">\n <div *ngIf=\"first\" class=\"gantt-expand-icon\" [style.marginLeft.px]=\"level * 20\">\n <ng-container *ngIf=\"level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n ></gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children, level: level + 1, group: group }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n" }]
129
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
130
- type: Inject,
131
- args: [GANTT_ABSTRACT_TOKEN]
132
- }] }, { type: i5.GanttUpper, decorators: [{
133
- type: Inject,
134
- args: [GANTT_UPPER_TOKEN]
135
- }] }, { type: i0.ElementRef }]; }, propDecorators: { groups: [{
136
- type: Input
137
- }], items: [{
138
- type: Input
139
- }], columns: [{
140
- type: Input
141
- }], groupTemplate: [{
142
- type: Input
143
- }], emptyTemplate: [{
144
- type: Input
145
- }], rowBeforeTemplate: [{
146
- type: Input
147
- }], rowAfterTemplate: [{
148
- type: Input
149
- }], itemClick: [{
150
- type: Output
151
- }], draglineElementRef: [{
152
- type: ViewChild,
153
- args: ['dragLine', { static: true }]
154
- }], ganttTableClass: [{
155
- type: HostBinding,
156
- args: ['class.gantt-table']
157
- }], ganttTableEmptyClass: [{
158
- type: HostBinding,
159
- args: ['class.gantt-table-empty']
160
- }] } });
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvdGFibGUvZ2FudHQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvdGFibGUvZ2FudHQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxXQUFXLEVBR1gsS0FBSyxFQUNMLFNBQVMsRUFJVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUt2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQTBCLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUFjLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7Ozs7QUFFcEYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFZakMsTUFBTSxPQUFPLG1CQUFtQjtJQVM1QixJQUNJLE9BQU8sQ0FBQyxPQUFnRDtRQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNoRTtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQWtCRCxZQUN5QyxL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QWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNqRSxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUE0QztRQUMvRCxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQzVCLENBQUM7O2dIQWxKUSxtQkFBbUIsa0JBb0NoQixvQkFBb0IsYUFDcEIsaUJBQWlCO29HQXJDcEIsbUJBQW1CLDBqQkNwQ2hDLDg1SkFtSEE7MkZEL0VhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDSSxhQUFhOzswQkF1Q2xCLE1BQU07MkJBQUMsb0JBQW9COzswQkFDM0IsTUFBTTsyQkFBQyxpQkFBaUI7cUVBaENwQixNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUdGLE9BQU87c0JBRFYsS0FBSztnQkFVRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNO2dCQUVrQyxrQkFBa0I7c0JBQTFELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFTCxlQUFlO3NCQUFoRCxXQUFXO3VCQUFDLG1CQUFtQjtnQkFFUSxvQkFBb0I7c0JBQTNELFdBQVc7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgUXVlcnlMaXN0LFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIEluamVjdCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2FudHRJdGVtSW50ZXJuYWwsIEdhbnR0R3JvdXBJbnRlcm5hbCwgR2FudHRTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY2xhc3MnO1xuaW1wb3J0IHsgTmd4R2FudHRUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RhYmxlL2dhbnR0LWNvbHVtbi5jb21wb25lbnQnO1xuLy8gaW1wb3J0IHsgZGVmYXVsdENvbHVtbldpZHRoLCBtaW5Db2x1bW5XaWR0aCB9IGZyb20gJy4uLy4uL2dhbnR0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDZGtEcmFnRW5kLCBDZGtEcmFnTW92ZSwgQ2RrRHJhZ1N0YXJ0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEdhbnR0QWJzdHJhY3RDb21wb25lbnQsIEdBTlRUX0FCU1RSQUNUX1RPS0VOIH0gZnJvbSAnLi4vLi4vZ2FudHQtYWJzdHJhY3QnO1xuaW1wb3J0IHsgR2FudHRVcHBlciwgR0FOVFRfVVBQRVJfVE9LRU4gfSBmcm9tICcuLi8uLi9nYW50dC11cHBlcic7XG5pbXBvcnQgeyBzZXRTdHlsZVdpdGhWZW5kb3JQcmVmaXggfSBmcm9tICcuLi8uLi91dGlscy9zZXQtc3R5bGUtd2l0aC12ZW5kb3ItcHJlZml4JztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2x1bW5XaWR0aCA9IDEwMDtcbmV4cG9ydCBjb25zdCBtaW5Db2x1bW5XaWR0aCA9IDgwO1xuXG5pbnRlcmZhY2UgRHJhZ0ZpeGVkQ29uZmlnIHtcbiAgICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICAgIG9yaWdpbldpZHRoOiBudW1iZXI7XG4gICAgbW92ZWRXaWR0aDogbnVtYmVyO1xuICAgIG1pbldpZHRoOiBudW1iZXI7XG59XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dhbnR0LXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ2FudHQtdGFibGUuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIHB1YmxpYyBjb2x1bW5MaXN0OiBRdWVyeUxpc3Q8Tmd4R2FudHRUYWJsZUNvbHVtbkNvbXBvbmVudD47XG5cbiAgICBwdWJsaWMgZHJhZ1N0YXJ0TGVmdDogbnVtYmVyO1xuXG4gICAgQElucHV0KCkgZ3JvdXBzOiBHYW50dEdyb3VwSW50ZXJuYWxbXTtcblxuICAgIEBJbnB1dCgpIGl0ZW1zOiBHYW50dEl0ZW1JbnRlcm5hbFtdO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQgY29sdW1ucyhjb2x1bW5zOiBRdWVyeUxpc3Q8Tmd4R2FudHRUYWJsZUNvbHVtbkNvbXBvbmVudD4pIHtcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGlmICghY29sdW1uLmNvbHVtbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmNvbHVtbldpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShkZWZhdWx0Q29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0ID0gY29sdW1ucztcbiAgICB9XG5cbiAgICBASW5wdXQoKSBncm91cFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgZW1wdHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIHJvd0JlZm9yZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgcm93QWZ0ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0U2VsZWN0ZWRFdmVudD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RyYWdMaW5lJywgeyBzdGF0aWM6IHRydWUgfSkgZHJhZ2xpbmVFbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUnKSBnYW50dFRhYmxlQ2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5nYW50dC10YWJsZS1lbXB0eScpIGdhbnR0VGFibGVFbXB0eUNsYXNzID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChHQU5UVF9BQlNUUkFDVF9UT0tFTikgcHVibGljIGdhbnR0OiBHYW50dEFic3RyYWN0Q29tcG9uZW50LFxuICAgICAgICBASW5qZWN0KEdBTlRUX1VQUEVSX1RPS0VOKSBwdWJsaWMgZ2FudHRVcHBlcjogR2FudHRVcHBlcixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmXG4gICAgKSB7fVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoIWNoYW5nZXMuZ3JvdXBzLmN1cnJlbnRWYWx1ZT8ubGVuZ3RoICYmICFjaGFuZ2VzLml0ZW1zLmN1cnJlbnRWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmdhbnR0VGFibGVFbXB0eUNsYXNzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2FudHRUYWJsZUVtcHR5Q2xhc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ0ZpeGVkKGNvbmZpZzogRHJhZ0ZpeGVkQ29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcubW92ZWRXaWR0aCA8IGNvbmZpZy5taW5XaWR0aCkge1xuICAgICAgICAgICAgc2V0U3R5bGVXaXRoVmVuZG9yUHJlZml4KHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBjb25maWcudGFyZ2V0LFxuICAgICAgICAgICAgICAgIHN0eWxlOiAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYHRyYW5zbGF0ZTNkKCR7Y29uZmlnLm1pbldpZHRoIC0gY29uZmlnLm9yaWdpbldpZHRofXB4LCAwLCAwKWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhwYW5kR3JvdXAoZ3JvdXA6IEdhbnR0R3JvdXBJbnRlcm5hbCkge1xuICAgICAgICB0aGlzLmdhbnR0LmV4cGFuZEdyb3VwKGdyb3VwKTtcbiAgICB9XG5cbiAgICBleHBhbmRDaGlsZHJlbihldmVudDogTW91c2VFdmVudCwgaXRlbTogR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZ2FudHQuZXhwYW5kQ2hpbGRyZW4oaXRlbSk7XG4gICAgfVxuXG4gICAgZHJhZ1N0YXJ0ZWQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdTdGFydExlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICB9XG5cbiAgICBkcmFnTW92ZWQoZXZlbnQ6IENka0RyYWdNb3ZlLCBjb2x1bW4/OiBOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICBsZXQgb3JpZ2luV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG1vdmVkV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG1pbldpZHRoOiBudW1iZXI7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIG9yaWdpbldpZHRoID0gcGFyc2VJbnQoY29sdW1uLmNvbHVtbldpZHRoLCAxMCk7XG4gICAgICAgICAgICBtb3ZlZFdpZHRoID0gb3JpZ2luV2lkdGggKyAobGVmdCAtIHRoaXMuZHJhZ1N0YXJ0TGVmdCk7XG4gICAgICAgICAgICBtaW5XaWR0aCA9IG1pbkNvbHVtbldpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3JpZ2luV2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIG1vdmVkV2lkdGggPSBvcmlnaW5XaWR0aCArIChsZWZ0IC0gdGhpcy5kcmFnU3RhcnRMZWZ0KTtcbiAgICAgICAgICAgIG1pbldpZHRoID0gbWluQ29sdW1uV2lkdGggKiB0aGlzLmNvbHVtbkxpc3QubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kcmFnRml4ZWQoe1xuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgb3JpZ2luV2lkdGgsXG4gICAgICAgICAgICBtb3ZlZFdpZHRoLFxuICAgICAgICAgICAgbWluV2lkdGhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zaG93QXV4aWxpYXJ5TGluZShldmVudCk7XG4gICAgfVxuXG4gICAgY29sdW1uRHJhZ0VuZGVkKGV2ZW50OiBDZGtEcmFnRW5kLCBjb2x1bW46IE5neEdhbnR0VGFibGVDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuc291cmNlLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi5jb2x1bW5XaWR0aCwgMTApICsgKGxlZnQgLSB0aGlzLmRyYWdTdGFydExlZnQpO1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IE1hdGgubWF4KHdpZHRoIHx8IDAsIG1pbkNvbHVtbldpZHRoKTtcbiAgICAgICAgY29sdW1uLmNvbHVtbldpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjb2x1bW5XaWR0aCk7XG4gICAgICAgIGlmICh0aGlzLmdhbnR0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmdhbnR0LnRhYmxlLmNvbHVtbkNoYW5nZXMuZW1pdCh7IGNvbHVtbnM6IHRoaXMuY29sdW1uTGlzdCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGlkZUF1eGlsaWFyeUxpbmUoKTtcbiAgICAgICAgZXZlbnQuc291cmNlLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgdGFibGVEcmFnRW5kZWQoZXZlbnQ6IENka0RyYWdFbmQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuc291cmNlLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGRyYWdXaWR0aCA9IGxlZnQgLSB0aGlzLmRyYWdTdGFydExlZnQ7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDb2x1bW5XaWR0aCA9IHBhcnNlSW50KGNvbHVtbi5jb2x1bW5XaWR0aCwgMTApO1xuICAgICAgICAgICAgY29uc3QgZGlzdHJpYnV0ZVdpZHRoID0gcGFyc2VJbnQoU3RyaW5nKGRyYWdXaWR0aCAqIChsYXN0Q29sdW1uV2lkdGggLyB0YWJsZVdpZHRoKSksIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5tYXgobGFzdENvbHVtbldpZHRoICsgZGlzdHJpYnV0ZVdpZHRoIHx8IDAsIG1pbkNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5XaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoY29sdW1uV2lkdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5nYW50dC50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5nYW50dC50YWJsZS5jb2x1bW5DaGFuZ2VzLmVtaXQoeyBjb2x1bW5zOiB0aGlzLmNvbHVtbkxpc3QgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZGVBdXhpbGlhcnlMaW5lKCk7XG4gICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd0F1eGlsaWFyeUxpbmUoZXZlbnQ6IENka0RyYWdNb3ZlKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlUmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmRyYWdsaW5lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHsoZXZlbnQuZXZlbnQgYXMgYW55KS5jbGllbnRYIC0gdGFibGVSZWN0LmxlZnR9cHhgO1xuICAgICAgICB0aGlzLmRyYWdsaW5lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZUF1eGlsaWFyeUxpbmUoKSB7XG4gICAgICAgIHRoaXMuZHJhZ2xpbmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IEdhbnR0R3JvdXBJbnRlcm5hbCB8IEdhbnR0SXRlbUludGVybmFsKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkIHx8IGluZGV4O1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1oZWFkZXIgZ2FudHQtdGFibGUtcm93XCI+XG4gIDxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1jb2x1bW5cIiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbkxpc3Q7IGxldCBpID0gaW5kZXhcIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLmNvbHVtbldpZHRoXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZjsgZWxzZSBkZWZhdWx0XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlUmVmXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0PlxuICAgICAge3sgY29sdW1uLm5hbWUgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZ2FudHQtdGFibGUtZHJhZy10cmlnZ2VyXCJcbiAgICAgIGNka0RyYWdcbiAgICAgIGNka0RyYWdMb2NrQXhpcz1cInhcIlxuICAgICAgY2RrRHJhZ0JvdW5kYXJ5PVwiLmdhbnR0XCJcbiAgICAgIChjZGtEcmFnTW92ZWQpPVwiZHJhZ01vdmVkKCRldmVudCwgY29sdW1uKVwiXG4gICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwiZHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAoY2RrRHJhZ0VuZGVkKT1cImNvbHVtbkRyYWdFbmRlZCgkZXZlbnQsIGNvbHVtbilcIlxuICAgID48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1ib2R5XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBzLmxlbmd0aCAmJiAhaXRlbXMubGVuZ3RoXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlbXB0eVRlbXBsYXRlXCI+XG4gICAgICA8Z2FudHQtaWNvbiBjbGFzcz1cImVtcHR5LWljb25cIiBpY29uTmFtZT1cImVtcHR5XCI+PC9nYW50dC1pY29uPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXRleHRcIj7msqHmnInmlbDmja48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW1wdHlUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cHMgJiYgZ3JvdXBzLmxlbmd0aCA+IDA7IGVsc2UgaXRlbXNUZW1wbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwczsgdHJhY2tCeTogdHJhY2tCeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImdhbnR0LXRhYmxlLWdyb3VwXCIgW25nQ2xhc3NdPVwiZ3JvdXAuY2xhc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbnR0LXRhYmxlLWdyb3VwLXRpdGxlXCIgW2NsYXNzLmV4cGFuZGVkXT1cImdyb3VwLmV4cGFuZGVkXCIgKGNsaWNrKT1cImV4cGFuZEdyb3VwKGdyb3VwKVwiPlxuICAgICAgICAgIDxnYW50dC1pY29uIGNsYXNzPVwiZXhwYW5kLWljb25cIiBbaWNvbk5hbWVdPVwiZ3JvdXAuZXhwYW5kZWQgPyAnYW5nbGUtZG93bicgOiAnYW5nbGUtcmlnaHQnXCI+PC9nYW50dC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJncm91cFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBncm91cC5vcmlnaW4sIGdyb3VwOiBncm91cC5vcmlnaW4gfVwiXG4gICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHQ+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+e3sgZ3JvdXAudGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdhbnR0SXRlbXNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGdyb3VwOiBncm91cCwgaXRlbXM6IGdyb3VwLml0ZW1zLCBsZXZlbDogMCB9XCJcbiAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cImdhbnR0LXRhYmxlLWRyYWctdHJpZ2dlclwiXG4gIGNka0RyYWdcbiAgY2RrRHJhZ0xvY2tBeGlzPVwieFwiXG4gIGNka0RyYWdCb3VuZGFyeT1cIi5nYW50dFwiXG4gIChjZGtEcmFnTW92ZWQpPVwiZHJhZ01vdmVkKCRldmVudClcIlxuICAoY2RrRHJhZ1N0YXJ0ZWQpPVwiZHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gIChjZGtEcmFnRW5kZWQpPVwidGFibGVEcmFnRW5kZWQoJGV2ZW50KVwiXG4+PC9kaXY+XG5cbjxkaXYgI2RyYWdMaW5lIGNsYXNzPVwiZ2FudHQtdGFibGUtZHJhZy1hdXhpbGlhcnktbGluZVwiPjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2l0ZW1zVGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJnYW50dEl0ZW1zXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgaXRlbXM6IGl0ZW1zLCBsZXZlbDogMCB9XCI+PC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZ2FudHRJdGVtcyBsZXQtZ3JvdXA9XCJncm91cFwiIGxldC1pdGVtcz1cIml0ZW1zXCIgbGV0LWxldmVsPVwibGV2ZWxcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgdHJhY2tCeTogdHJhY2tCeVwiPlxuICAgIDxkaXZcbiAgICAgIChjbGljayk9XCJpdGVtQ2xpY2suZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHNlbGVjdGVkVmFsdWU6IHRoaXMuaXRlbS5vcmlnaW4gfSlcIlxuICAgICAgY2xhc3M9XCJnYW50dC10YWJsZS1pdGVtIGdhbnR0LXRhYmxlLXJvd1wiXG4gICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS1maXJzdC1sZXZlbC1ncm91cF09XCJsZXZlbCA9PT0gMCAmJiAoaXRlbS50eXBlIHwgaXNHYW50dFJhbmdlSXRlbSlcIlxuICAgICAgW2NsYXNzLmdhbnR0LXRhYmxlLWl0ZW0td2l0aC1ncm91cF09XCJncm91cFwiXG4gICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS1hY3RpdmVdPVwiZ2FudHRVcHBlci5pc1NlbGVjdGVkKGl0ZW0uaWQpXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZ2FudHQuc3R5bGVzLmxpbmVIZWlnaHRcIlxuICAgICAgW3N0eWxlLmxpbmVIZWlnaHQucHhdPVwiZ2FudHQuc3R5bGVzLmxpbmVIZWlnaHRcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dCZWZvcmVUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtY29sdW1uXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5MaXN0OyBsZXQgZmlyc3QgPSBmaXJzdFwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4uY29sdW1uV2lkdGhcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpcnN0XCIgY2xhc3M9XCJnYW50dC1leHBhbmQtaWNvblwiIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cImxldmVsICogMjBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGV2ZWwgPCBnYW50dC5tYXhMZXZlbCAtIDEgJiYgaXRlbS5leHBhbmRhYmxlXCI+XG4gICAgICAgICAgICA8Z2FudHQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFpdGVtLmxvYWRpbmdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImV4cGFuZC1pY29uXCJcbiAgICAgICAgICAgICAgW2ljb25OYW1lXT1cIml0ZW0uZXhwYW5kZWQgPyAnYW5nbGUtZG93bicgOiAnYW5nbGUtcmlnaHQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZENoaWxkcmVuKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgPjwvZ2FudHQtaWNvbj5cbiAgICAgICAgICAgIDxnYW50dC1pY29uICpuZ0lmPVwiaXRlbS5sb2FkaW5nXCIgW2ljb25OYW1lXT1cIidsb2FkaW5nJ1wiPjwvZ2FudHQtaWNvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1jb2x1bW4tY29udGVudFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICAgID48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0FmdGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0ub3JpZ2luLCBpdGVtOiBpdGVtLm9yaWdpbiB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uZXhwYW5kZWRcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2FudHRJdGVtc1wiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtczogaXRlbS5jaGlsZHJlbiwgbGV2ZWw6IGxldmVsICsgMSwgZ3JvdXA6IGdyb3VwIH1cIlxuICAgID48L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=