cps-ui-kit 18.11.0 → 19.2.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 (85) hide show
  1. package/fesm2022/cps-ui-kit.mjs +347 -307
  2. package/fesm2022/cps-ui-kit.mjs.map +1 -1
  3. package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
  4. package/lib/components/cps-menu/cps-menu.component.d.ts +4 -3
  5. package/lib/components/cps-select/cps-select.component.d.ts +2 -2
  6. package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +25 -1
  7. package/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.d.ts +3 -3
  8. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +3 -3
  9. package/package.json +6 -8
  10. package/styles/styles.scss +9 -0
  11. package/esm2022/cps-ui-kit.mjs +0 -5
  12. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -948
  13. package/esm2022/lib/components/cps-button/cps-button.component.mjs +0 -205
  14. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -239
  15. package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -154
  16. package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +0 -94
  17. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
  18. package/esm2022/lib/components/cps-divider/cps-divider.component.mjs +0 -60
  19. package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -213
  20. package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -182
  21. package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +0 -203
  22. package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
  23. package/esm2022/lib/components/cps-input/cps-input.component.mjs +0 -385
  24. package/esm2022/lib/components/cps-loader/cps-loader.component.mjs +0 -58
  25. package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +0 -572
  26. package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +0 -118
  27. package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
  28. package/esm2022/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +0 -51
  29. package/esm2022/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +0 -75
  30. package/esm2022/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +0 -42
  31. package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -77
  32. package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -225
  33. package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +0 -682
  34. package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +0 -604
  35. package/esm2022/lib/components/cps-select/cps-select.component.mjs +0 -654
  36. package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
  37. package/esm2022/lib/components/cps-switch/cps-switch.component.mjs +0 -131
  38. package/esm2022/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +0 -86
  39. package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -308
  40. package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
  41. package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -407
  42. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -147
  43. package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -105
  44. package/esm2022/lib/components/cps-table/cps-column-filter-types.mjs +0 -29
  45. package/esm2022/lib/components/cps-table/cps-table.component.mjs +0 -1022
  46. package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
  47. package/esm2022/lib/components/cps-table/directives/cps-table-column-resizable.directive.mjs +0 -22
  48. package/esm2022/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +0 -47
  49. package/esm2022/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +0 -32
  50. package/esm2022/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +0 -35
  51. package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -212
  52. package/esm2022/lib/components/cps-table/pipes/cps-table-detect-filter-type.pipe.mjs +0 -29
  53. package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +0 -121
  54. package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +0 -290
  55. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -370
  56. package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -273
  57. package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
  58. package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1279
  59. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +0 -174
  60. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable.directive.mjs +0 -22
  61. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +0 -47
  62. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +0 -33
  63. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +0 -36
  64. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -48
  65. package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -352
  66. package/esm2022/lib/components/cps-tree-table/pipes/cps-tree-table-detect-filter-type.pipe.mjs +0 -30
  67. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -656
  68. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +0 -275
  69. package/esm2022/lib/pipes/internal/check-option-selected.pipe.mjs +0 -24
  70. package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
  71. package/esm2022/lib/pipes/internal/label-by-value.pipe.mjs +0 -16
  72. package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +0 -146
  73. package/esm2022/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +0 -25
  74. package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
  75. package/esm2022/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +0 -18
  76. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
  77. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -128
  78. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +0 -122
  79. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -95
  80. package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +0 -106
  81. package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -27
  82. package/esm2022/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -12
  83. package/esm2022/lib/utils/colors-utils.mjs +0 -59
  84. package/esm2022/lib/utils/internal/size-utils.mjs +0 -24
  85. package/esm2022/public-api.mjs +0 -58
@@ -1,225 +0,0 @@
1
- /* eslint-disable no-use-before-define */
2
- import { CommonModule } from '@angular/common';
3
- import { Component, EventEmitter, InjectionToken, Input, Optional, Output, Self } from '@angular/core';
4
- import { CpsInfoCircleComponent } from '../cps-info-circle/cps-info-circle.component';
5
- import { CpsTooltipDirective } from '../../directives/cps-tooltip/cps-tooltip.directive';
6
- import { CpsRadioButtonComponent } from './cps-radio-button/cps-radio-button.component';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- import * as i2 from "@angular/common";
10
- export const CPS_RADIO_GROUP = new InjectionToken('CpsRadioGroupComponent');
11
- /**
12
- * CpsRadioGroupComponent is a radio buttons group.
13
- * @group Components
14
- */
15
- export class CpsRadioGroupComponent {
16
- /**
17
- * Value of the radio group.
18
- * @group Props
19
- */
20
- set value(value) {
21
- this._value = value;
22
- this.onChange(value);
23
- }
24
- get value() {
25
- return this._value;
26
- }
27
- constructor(_control) {
28
- this._control = _control;
29
- /**
30
- * An array of options.
31
- * @group Props
32
- */
33
- this.options = [];
34
- /**
35
- * Label of the radio group.
36
- * @group Props
37
- */
38
- this.groupLabel = '';
39
- /**
40
- * Determines whether the radio group should be vertical.
41
- * @group Props
42
- */
43
- this.vertical = false;
44
- /**
45
- * Determines whether the radio group is disabled.
46
- * @group Props
47
- */
48
- this.disabled = false;
49
- /**
50
- * When it is not an empty string, an info icon is displayed to show text for more info.
51
- * @group Props
52
- */
53
- this.infoTooltip = '';
54
- /**
55
- * InfoTooltip class for styling.
56
- * @group Props
57
- */
58
- this.infoTooltipClass = 'cps-tooltip-content';
59
- /**
60
- * Size of infoTooltip, of type number denoting pixels or string.
61
- * @group Props
62
- */
63
- this.infoTooltipMaxWidth = '100%';
64
- /**
65
- * Determines whether the infoTooltip is persistent.
66
- * @group Props
67
- */
68
- this.infoTooltipPersistent = false;
69
- /**
70
- * Position of infoTooltip, it can be "top", "bottom", "left" or "right".
71
- * @group Props
72
- */
73
- this.infoTooltipPosition = 'top';
74
- /**
75
- * Bottom hint text for the radio group.
76
- * @group Props
77
- */
78
- this.hint = '';
79
- /**
80
- * Hides hint and validation errors.
81
- * @group Props
82
- */
83
- this.hideDetails = false;
84
- /**
85
- * Callback to invoke on value change.
86
- * @param {boolean} boolean - value changed.
87
- * @group Emits
88
- */
89
- this.valueChanged = new EventEmitter();
90
- /**
91
- * Callback to invoke when the radio group loses focus.
92
- * @param {any}
93
- * @group Emits
94
- */
95
- this.blurred = new EventEmitter();
96
- /**
97
- * Callback to invoke when the radio group receives focus.
98
- * @param {any}
99
- * @group Emits
100
- */
101
- this.focused = new EventEmitter();
102
- this._value = undefined;
103
- this.error = '';
104
- // eslint-disable-next-line @typescript-eslint/no-empty-function
105
- this.onChange = (event) => { };
106
- // eslint-disable-next-line @typescript-eslint/no-empty-function
107
- this.onTouched = () => { };
108
- if (this._control) {
109
- this._control.valueAccessor = this;
110
- }
111
- }
112
- ngOnInit() {
113
- this._statusChangesSubscription = this._control?.statusChanges?.subscribe(() => {
114
- this._checkErrors();
115
- });
116
- }
117
- ngOnDestroy() {
118
- this._statusChangesSubscription?.unsubscribe();
119
- }
120
- registerOnChange(fn) {
121
- this.onChange = fn;
122
- }
123
- registerOnTouched(fn) {
124
- this.onTouched = fn;
125
- }
126
- writeValue(value) {
127
- this.value = value;
128
- }
129
- updateValueEvent(value) {
130
- if (this.disabled)
131
- return;
132
- this._updateValue(value);
133
- }
134
- _updateValue(value) {
135
- this.writeValue(value);
136
- this.onChange(value);
137
- this.valueChanged.emit(value);
138
- }
139
- // eslint-disable-next-line @typescript-eslint/no-empty-function
140
- setDisabledState(disabled) { }
141
- onBlur() {
142
- this._checkErrors();
143
- this.blurred.emit();
144
- }
145
- onFocus() {
146
- this._control?.control?.markAsTouched();
147
- this.focused.emit();
148
- }
149
- _checkErrors() {
150
- if (!this._control)
151
- return;
152
- const errors = this._control?.errors;
153
- if (!this._control?.control?.touched || !errors) {
154
- this.error = '';
155
- return;
156
- }
157
- if ('required' in errors) {
158
- this.error = 'Field is required';
159
- return;
160
- }
161
- const errArr = Object.values(errors);
162
- if (errArr.length < 1) {
163
- this.error = '';
164
- return;
165
- }
166
- const message = errArr.find((msg) => typeof msg === 'string');
167
- this.error = message || 'Unknown error';
168
- }
169
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsRadioGroupComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
170
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.3", type: CpsRadioGroupComponent, isStandalone: true, selector: "cps-radio-group", inputs: { options: "options", groupLabel: "groupLabel", vertical: "vertical", disabled: "disabled", infoTooltip: "infoTooltip", infoTooltipClass: "infoTooltipClass", infoTooltipMaxWidth: "infoTooltipMaxWidth", infoTooltipPersistent: "infoTooltipPersistent", infoTooltipPosition: "infoTooltipPosition", hint: "hint", hideDetails: "hideDetails", value: "value" }, outputs: { valueChanged: "valueChanged", blurred: "blurred", focused: "focused" }, providers: [
171
- {
172
- provide: CPS_RADIO_GROUP,
173
- useExisting: CpsRadioGroupComponent
174
- }
175
- ], ngImport: i0, template: "<div class=\"cps-radio-group\">\n <div class=\"cps-radio-group-label\" *ngIf=\"groupLabel\">\n <span>{{ groupLabel }}</span>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-radio-group-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n\n <div\n #contentRef\n class=\"cps-radio-group-content\"\n [ngClass]=\"\n vertical\n ? 'cps-radio-group-content-vertical'\n : 'cps-radio-group-content-horizontal'\n \">\n <ng-content></ng-content>\n </div>\n\n <div\n *ngIf=\"!contentRef.innerHTML.trim()\"\n class=\"cps-radio-group-content\"\n [ngClass]=\"\n vertical\n ? 'cps-radio-group-content-vertical'\n : 'cps-radio-group-content-horizontal'\n \">\n <cps-radio-button\n *ngFor=\"let option of options\"\n [option]=\"option\"\n [checked]=\"option.value === value\"\n [groupDisabled]=\"disabled\"\n (blurred)=\"onBlur()\"\n (focused)=\"onFocus()\"\n (updateValueEvent)=\"updateValueEvent($event)\">\n </cps-radio-button>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-radio-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-radio-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host{width:fit-content;display:inline-block}:host .cps-radio-group{font-family:Source Sans Pro,sans-serif}:host .cps-radio-group-label{font-style:normal;font-weight:700;font-size:1rem;color:var(--cps-color-text-dark);margin-bottom:.75rem;align-items:center;display:inline-flex;cursor:default}:host .cps-radio-group-label .cps-radio-group-label-info-circle{margin-left:8px}:host .cps-radio-group-label .cps-radio-group-label-info-circle ::ng-deep cps-icon i{width:14px;height:14px}:host .cps-radio-group-content{margin-left:.5rem;gap:1.25rem}:host .cps-radio-group-content-vertical{display:grid;grid-auto-rows:1fr}:host .cps-radio-group-content-horizontal{display:flex;flex-direction:row;flex-wrap:wrap}:host .cps-radio-group-content .content:empty{display:none}:host .cps-radio-group .cps-radio-hint{margin-top:4px;color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default}:host .cps-radio-group .cps-radio-error{margin-top:4px;color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "component", type: CpsInfoCircleComponent, selector: "cps-info-circle", inputs: ["size", "tooltipText", "tooltipPosition", "tooltipContentClass", "tooltipMaxWidth", "tooltipPersistent"] }, { kind: "component", type: CpsRadioButtonComponent, selector: "cps-radio-button", inputs: ["option", "checked", "groupDisabled"], outputs: ["updateValueEvent", "blurred", "focused"] }] }); }
176
- }
177
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsRadioGroupComponent, decorators: [{
178
- type: Component,
179
- args: [{ standalone: true, imports: [
180
- CommonModule,
181
- CpsInfoCircleComponent,
182
- CpsTooltipDirective,
183
- CpsRadioButtonComponent
184
- ], selector: 'cps-radio-group', providers: [
185
- {
186
- provide: CPS_RADIO_GROUP,
187
- useExisting: CpsRadioGroupComponent
188
- }
189
- ], template: "<div class=\"cps-radio-group\">\n <div class=\"cps-radio-group-label\" *ngIf=\"groupLabel\">\n <span>{{ groupLabel }}</span>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-radio-group-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n\n <div\n #contentRef\n class=\"cps-radio-group-content\"\n [ngClass]=\"\n vertical\n ? 'cps-radio-group-content-vertical'\n : 'cps-radio-group-content-horizontal'\n \">\n <ng-content></ng-content>\n </div>\n\n <div\n *ngIf=\"!contentRef.innerHTML.trim()\"\n class=\"cps-radio-group-content\"\n [ngClass]=\"\n vertical\n ? 'cps-radio-group-content-vertical'\n : 'cps-radio-group-content-horizontal'\n \">\n <cps-radio-button\n *ngFor=\"let option of options\"\n [option]=\"option\"\n [checked]=\"option.value === value\"\n [groupDisabled]=\"disabled\"\n (blurred)=\"onBlur()\"\n (focused)=\"onFocus()\"\n (updateValueEvent)=\"updateValueEvent($event)\">\n </cps-radio-button>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-radio-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-radio-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host{width:fit-content;display:inline-block}:host .cps-radio-group{font-family:Source Sans Pro,sans-serif}:host .cps-radio-group-label{font-style:normal;font-weight:700;font-size:1rem;color:var(--cps-color-text-dark);margin-bottom:.75rem;align-items:center;display:inline-flex;cursor:default}:host .cps-radio-group-label .cps-radio-group-label-info-circle{margin-left:8px}:host .cps-radio-group-label .cps-radio-group-label-info-circle ::ng-deep cps-icon i{width:14px;height:14px}:host .cps-radio-group-content{margin-left:.5rem;gap:1.25rem}:host .cps-radio-group-content-vertical{display:grid;grid-auto-rows:1fr}:host .cps-radio-group-content-horizontal{display:flex;flex-direction:row;flex-wrap:wrap}:host .cps-radio-group-content .content:empty{display:none}:host .cps-radio-group .cps-radio-hint{margin-top:4px;color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default}:host .cps-radio-group .cps-radio-error{margin-top:4px;color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default}\n"] }]
190
- }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
191
- type: Self
192
- }, {
193
- type: Optional
194
- }] }], propDecorators: { options: [{
195
- type: Input
196
- }], groupLabel: [{
197
- type: Input
198
- }], vertical: [{
199
- type: Input
200
- }], disabled: [{
201
- type: Input
202
- }], infoTooltip: [{
203
- type: Input
204
- }], infoTooltipClass: [{
205
- type: Input
206
- }], infoTooltipMaxWidth: [{
207
- type: Input
208
- }], infoTooltipPersistent: [{
209
- type: Input
210
- }], infoTooltipPosition: [{
211
- type: Input
212
- }], hint: [{
213
- type: Input
214
- }], hideDetails: [{
215
- type: Input
216
- }], value: [{
217
- type: Input
218
- }], valueChanged: [{
219
- type: Output
220
- }], blurred: [{
221
- type: Output
222
- }], focused: [{
223
- type: Output
224
- }] } });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXJhZGlvLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nwcy11aS1raXQvc3JjL2xpYi9jb21wb25lbnRzL2Nwcy1yYWRpby1ncm91cC9jcHMtcmFkaW8tZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXJhZGlvLWdyb3VwL2Nwcy1yYWRpby1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5Q0FBeUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdEYsT0FBTyxFQUNMLG1CQUFtQixFQUVwQixNQUFNLG9EQUFvRCxDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7O0FBY3hGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FDL0Msd0JBQXdCLENBQ3pCLENBQUM7QUFFRjs7O0dBR0c7QUFtQkgsTUFBTSxPQUFPLHNCQUFzQjtJQXFFakM7OztPQUdHO0lBQ0gsSUFBYSxLQUFLLENBQUMsS0FBVTtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQTRCRCxZQUF3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Qjt3QkFDbkIsdUJBQXVCO3FCQUN4QixZQUNTLGlCQUFpQixhQUdoQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsV0FBVyx3QkFBd0I7eUJBQ3BDO3FCQUNGOzswQkE4R1ksSUFBSTs7MEJBQUksUUFBUTt5Q0FyR3BCLE9BQU87c0JBQWYsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFNRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBTUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQU1HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFNRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNTyxLQUFLO3NCQUFqQixLQUFLO2dCQWNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBT0csT0FBTztzQkFBaEIsTUFBTTtnQkFPRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2VsZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDcHNJbmZvQ2lyY2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWluZm8tY2lyY2xlL2Nwcy1pbmZvLWNpcmNsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ3BzVG9vbHRpcERpcmVjdGl2ZSxcbiAgQ3BzVG9vbHRpcFBvc2l0aW9uXG59IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY3BzLXRvb2x0aXAvY3BzLXRvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IENwc1JhZGlvQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9jcHMtcmFkaW8tYnV0dG9uL2Nwcy1yYWRpby1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIENwc1JhZGlvT3B0aW9uIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBvcHRpb25zIG9mIHRoZSBDcHNSYWRpb0dyb3VwQ29tcG9uZW50LlxuICogQGdyb3VwIFR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIENwc1JhZGlvT3B0aW9uID0ge1xuICB2YWx1ZTogYW55O1xuICBsYWJlbD86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0b29sdGlwPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IENQU19SQURJT19HUk9VUCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDcHNSYWRpb0dyb3VwQ29tcG9uZW50PihcbiAgJ0Nwc1JhZGlvR3JvdXBDb21wb25lbnQnXG4pO1xuXG4vKipcbiAqIENwc1JhZGlvR3JvdXBDb21wb25lbnQgaXMgYSByYWRpbyBidXR0b25zIGdyb3VwLlxuICogQGdyb3VwIENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQ3BzSW5mb0NpcmNsZUNvbXBvbmVudCxcbiAgICBDcHNUb29sdGlwRGlyZWN0aXZlLFxuICAgIENwc1JhZGlvQnV0dG9uQ29tcG9uZW50XG4gIF0sXG4gIHNlbGVjdG9yOiAnY3BzLXJhZGlvLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nwcy1yYWRpby1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Nwcy1yYWRpby1ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDUFNfUkFESU9fR1JPVVAsXG4gICAgICB1c2VFeGlzdGluZzogQ3BzUmFkaW9Hcm91cENvbXBvbmVudFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcHNSYWRpb0dyb3VwQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBvcHRpb25zLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnM6IENwc1JhZGlvT3B0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogTGFiZWwgb2YgdGhlIHJhZGlvIGdyb3VwLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwTGFiZWwgPSAnJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByYWRpbyBncm91cCBzaG91bGQgYmUgdmVydGljYWwuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdmVydGljYWwgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByYWRpbyBncm91cCBpcyBkaXNhYmxlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGVuIGl0IGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcsIGFuIGluZm8gaWNvbiBpcyBkaXNwbGF5ZWQgdG8gc2hvdyB0ZXh0IGZvciBtb3JlIGluZm8uXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXAgPSAnJztcblxuICAvKipcbiAgICogSW5mb1Rvb2x0aXAgY2xhc3MgZm9yIHN0eWxpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXBDbGFzcyA9ICdjcHMtdG9vbHRpcC1jb250ZW50JztcblxuICAvKipcbiAgICogU2l6ZSBvZiBpbmZvVG9vbHRpcCwgb2YgdHlwZSBudW1iZXIgZGVub3RpbmcgcGl4ZWxzIG9yIHN0cmluZy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcE1heFdpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAnMTAwJSc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgaW5mb1Rvb2x0aXAgaXMgcGVyc2lzdGVudC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBlcnNpc3RlbnQgPSBmYWxzZTtcblxuICAvKipcbiAgICogUG9zaXRpb24gb2YgaW5mb1Rvb2x0aXAsIGl0IGNhbiBiZSBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiBvciBcInJpZ2h0XCIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXBQb3NpdGlvbjogQ3BzVG9vbHRpcFBvc2l0aW9uID0gJ3RvcCc7XG5cbiAgLyoqXG4gICAqIEJvdHRvbSBoaW50IHRleHQgZm9yIHRoZSByYWRpbyBncm91cC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBoaW50ID0gJyc7XG5cbiAgLyoqXG4gICAqIEhpZGVzIGhpbnQgYW5kIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVEZXRhaWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSByYWRpbyBncm91cC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHZhbHVlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBib29sZWFuIC0gdmFsdWUgY2hhbmdlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmFkaW8gZ3JvdXAgbG9zZXMgZm9jdXMuXG4gICAqIEBwYXJhbSB7YW55fVxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmFkaW8gZ3JvdXAgcmVjZWl2ZXMgZm9jdXMuXG4gICAqIEBwYXJhbSB7YW55fVxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgZXJyb3IgPSAnJztcblxuICBjb25zdHJ1Y3RvcihAU2VsZigpIEBPcHRpb25hbCgpIHByaXZhdGUgX2NvbnRyb2w6IE5nQ29udHJvbCkge1xuICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG4gICAgICB0aGlzLl9jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLl9jb250cm9sPy5zdGF0dXNDaGFuZ2VzPy5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoZWNrRXJyb3JzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgdXBkYXRlVmFsdWVFdmVudCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLl91cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlZC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge31cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgICB0aGlzLmJsdXJyZWQuZW1pdCgpO1xuICB9XG5cbiAgb25Gb2N1cygpIHtcbiAgICB0aGlzLl9jb250cm9sPy5jb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRXJyb3JzKCkge1xuICAgIGlmICghdGhpcy5fY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuX2NvbnRyb2w/LmVycm9ycztcblxuICAgIGlmICghdGhpcy5fY29udHJvbD8uY29udHJvbD8udG91Y2hlZCB8fCAhZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9yID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCdyZXF1aXJlZCcgaW4gZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9yID0gJ0ZpZWxkIGlzIHJlcXVpcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJBcnIgPSBPYmplY3QudmFsdWVzKGVycm9ycyk7XG4gICAgaWYgKGVyckFyci5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLmVycm9yID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJBcnIuZmluZCgobXNnKSA9PiB0eXBlb2YgbXNnID09PSAnc3RyaW5nJyk7XG5cbiAgICB0aGlzLmVycm9yID0gbWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcic7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcHMtcmFkaW8tZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImNwcy1yYWRpby1ncm91cC1sYWJlbFwiICpuZ0lmPVwiZ3JvdXBMYWJlbFwiPlxuICAgIDxzcGFuPnt7IGdyb3VwTGFiZWwgfX08L3NwYW4+XG4gICAgPGNwcy1pbmZvLWNpcmNsZVxuICAgICAgKm5nSWY9XCJpbmZvVG9vbHRpcFwiXG4gICAgICBjbGFzcz1cImNwcy1yYWRpby1ncm91cC1sYWJlbC1pbmZvLWNpcmNsZVwiXG4gICAgICBzaXplPVwieHNtYWxsXCJcbiAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiaW5mb1Rvb2x0aXBQb3NpdGlvblwiXG4gICAgICBbdG9vbHRpcENvbnRlbnRDbGFzc109XCJpbmZvVG9vbHRpcENsYXNzXCJcbiAgICAgIFt0b29sdGlwTWF4V2lkdGhdPVwiaW5mb1Rvb2x0aXBNYXhXaWR0aFwiXG4gICAgICBbdG9vbHRpcFBlcnNpc3RlbnRdPVwiaW5mb1Rvb2x0aXBQZXJzaXN0ZW50XCJcbiAgICAgIFt0b29sdGlwVGV4dF09XCJpbmZvVG9vbHRpcFwiPlxuICAgIDwvY3BzLWluZm8tY2lyY2xlPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgI2NvbnRlbnRSZWZcbiAgICBjbGFzcz1cImNwcy1yYWRpby1ncm91cC1jb250ZW50XCJcbiAgICBbbmdDbGFzc109XCJcbiAgICAgIHZlcnRpY2FsXG4gICAgICAgID8gJ2Nwcy1yYWRpby1ncm91cC1jb250ZW50LXZlcnRpY2FsJ1xuICAgICAgICA6ICdjcHMtcmFkaW8tZ3JvdXAtY29udGVudC1ob3Jpem9udGFsJ1xuICAgIFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwiIWNvbnRlbnRSZWYuaW5uZXJIVE1MLnRyaW0oKVwiXG4gICAgY2xhc3M9XCJjcHMtcmFkaW8tZ3JvdXAtY29udGVudFwiXG4gICAgW25nQ2xhc3NdPVwiXG4gICAgICB2ZXJ0aWNhbFxuICAgICAgICA/ICdjcHMtcmFkaW8tZ3JvdXAtY29udGVudC12ZXJ0aWNhbCdcbiAgICAgICAgOiAnY3BzLXJhZGlvLWdyb3VwLWNvbnRlbnQtaG9yaXpvbnRhbCdcbiAgICBcIj5cbiAgICA8Y3BzLXJhZGlvLWJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgIFtvcHRpb25dPVwib3B0aW9uXCJcbiAgICAgIFtjaGVja2VkXT1cIm9wdGlvbi52YWx1ZSA9PT0gdmFsdWVcIlxuICAgICAgW2dyb3VwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgKGJsdXJyZWQpPVwib25CbHVyKClcIlxuICAgICAgKGZvY3VzZWQpPVwib25Gb2N1cygpXCJcbiAgICAgICh1cGRhdGVWYWx1ZUV2ZW50KT1cInVwZGF0ZVZhbHVlRXZlbnQoJGV2ZW50KVwiPlxuICAgIDwvY3BzLXJhZGlvLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCIhZXJyb3IgJiYgIWhpZGVEZXRhaWxzXCIgY2xhc3M9XCJjcHMtcmFkaW8taGludFwiPlxuICAgIHt7IGhpbnQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJlcnJvciAmJiAhaGlkZURldGFpbHNcIiBjbGFzcz1cImNwcy1yYWRpby1lcnJvclwiPlxuICAgIHt7IGVycm9yIH19XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=