vc-create-dashboard 3.0.83 → 3.0.85
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.
- package/README.md +24 -24
- package/esm2022/lib/configurations.mjs +7 -7
- package/esm2022/lib/create-dashboard-container/categories/categories-config.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/categories/categories.component.mjs +212 -212
- package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets/configure-widgets.component.mjs +350 -350
- package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets/widget.interface.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets.module.mjs +47 -47
- package/esm2022/lib/create-dashboard-container/constants/assets.constant.mjs +37 -37
- package/esm2022/lib/create-dashboard-container/create-dashboard-config.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/create-dashboard.component.mjs +1601 -1520
- package/esm2022/lib/create-dashboard-container/create-dashboard.module.mjs +127 -127
- package/esm2022/lib/create-dashboard-container/directives/directives.module.mjs +24 -24
- package/esm2022/lib/create-dashboard-container/directives/scroll-in-view.directive.mjs +36 -36
- package/esm2022/lib/create-dashboard-container/form-group/form-group.component.mjs +153 -153
- package/esm2022/lib/create-dashboard-container/frequency/frequency.component.mjs +309 -309
- package/esm2022/lib/create-dashboard-container/interfaces/widget-data-model.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/pipes/filter.pipe.mjs +30 -30
- package/esm2022/lib/create-dashboard-container/pipes/search-program.pipe.mjs +37 -37
- package/esm2022/lib/create-dashboard-container/pipes/search.pipe.mjs +25 -25
- package/esm2022/lib/create-dashboard-container/pipes/text-count.pipe.mjs +18 -19
- package/esm2022/lib/create-dashboard-container/program-list/constant.mjs +31 -31
- package/esm2022/lib/create-dashboard-container/program-list/information-block/information-block.component.mjs +13 -13
- package/esm2022/lib/create-dashboard-container/program-list/interfaces/list-item.interface.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/program-list/list-container/list-container.component.mjs +50 -50
- package/esm2022/lib/create-dashboard-container/program-list/pipes/check-selected-items.pipes.mjs +23 -23
- package/esm2022/lib/create-dashboard-container/program-list/program-list/program-list.component.mjs +294 -294
- package/esm2022/lib/create-dashboard-container/program-list/program-list.module.mjs +60 -60
- package/esm2022/lib/create-dashboard-container/program-list/services/list-utils.service.mjs +27 -27
- package/esm2022/lib/create-dashboard-container/program-list/services/program-list-api.service.mjs +28 -35
- package/esm2022/lib/create-dashboard-container/responsibility-center/responsibility-center.component.mjs +224 -149
- package/esm2022/lib/create-dashboard-container/risk-categories/risk-categories-config.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/risk-categories/risk-categories.component.mjs +206 -206
- package/esm2022/lib/create-dashboard-container/services/configure-widgets.service.mjs +233 -238
- package/esm2022/lib/create-dashboard-container/services/create-dashboard.service.mjs +227 -243
- package/esm2022/lib/create-dashboard-container/services/pagination.service.mjs +28 -28
- package/esm2022/lib/create-dashboard-container/user-list/user-list.component.mjs +440 -440
- package/esm2022/lib/create-dashboard-container/user-list/user-list.config.mjs +2 -2
- package/esm2022/lib/create-dashboard-container/utils/dashboard-edit.utils.mjs +181 -181
- package/esm2022/lib/create-dashboard.service.mjs +14 -14
- package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer/dashboard-footer.component.mjs +52 -52
- package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer-config.mjs +2 -2
- package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer.module.mjs +32 -32
- package/esm2022/lib/ui-kit/dialog/dialog-config.mjs +7 -7
- package/esm2022/lib/ui-kit/dialog/dialog-injector.mjs +17 -17
- package/esm2022/lib/ui-kit/dialog/dialog-ref.mjs +11 -11
- package/esm2022/lib/ui-kit/dialog/dialog.component.mjs +96 -96
- package/esm2022/lib/ui-kit/dialog/dialog.module.mjs +20 -20
- package/esm2022/lib/ui-kit/dialog/dialog.service.mjs +56 -56
- package/esm2022/lib/ui-kit/dialog/insertion.directive.mjs +17 -17
- package/esm2022/lib/ui-kit/floating-bar/floating-bar.component.mjs +57 -57
- package/esm2022/lib/ui-kit/floating-bar/floating-bar.module.mjs +32 -32
- package/esm2022/lib/ui-kit/formgroup/click-outside.directive.mjs +30 -30
- package/esm2022/lib/ui-kit/formgroup/cs-checkbox/cs-checkbox.component.mjs +29 -29
- package/esm2022/lib/ui-kit/formgroup/cs-radio/cs-radio.component.mjs +34 -34
- package/esm2022/lib/ui-kit/formgroup/cs-radio-group/cs-radio-group.component.mjs +14 -14
- package/esm2022/lib/ui-kit/formgroup/cs-select/cs-select.component.mjs +119 -119
- package/esm2022/lib/ui-kit/formgroup/cs-switch/cs-switch.component.mjs +39 -39
- package/esm2022/lib/ui-kit/formgroup/formgroup.module.mjs +55 -55
- package/esm2022/lib/ui-kit/formgroup/pipes/pascal.pipe.mjs +19 -19
- package/esm2022/lib/ui-kit/formgroup/pipes/searchMultiSelect.pipe.mjs +24 -24
- package/esm2022/lib/ui-kit/loaders/loaders.module.mjs +24 -24
- package/esm2022/lib/ui-kit/loaders/table-loader/table-loader.component.mjs +18 -18
- package/esm2022/lib/ui-kit/no-data/no-data.component.mjs +47 -47
- package/esm2022/lib/ui-kit/no-data/no-data.module.mjs +18 -18
- package/esm2022/lib/ui-kit/pagination/pagination.component.mjs +130 -130
- package/esm2022/lib/ui-kit/pagination/pagination.module.mjs +18 -18
- package/esm2022/lib/ui-kit/popover/popover.component.mjs +129 -129
- package/esm2022/lib/ui-kit/popover/popover.directive.mjs +93 -93
- package/esm2022/lib/ui-kit/popover/popover.module.mjs +21 -21
- package/esm2022/lib/ui-kit/popover/popover.service.mjs +23 -23
- package/esm2022/lib/ui-kit/select/cs-option/cs-option.component.mjs +41 -41
- package/esm2022/lib/ui-kit/select/cs-select/cs-select.component.mjs +107 -107
- package/esm2022/lib/ui-kit/select/safe-html.pipe.mjs +21 -21
- package/esm2022/lib/ui-kit/select/select.module.mjs +21 -21
- package/esm2022/lib/ui-kit/services/cs-select.service.mjs +16 -16
- package/esm2022/lib/ui-kit/smiley-dialog/smiley-dialog.component.mjs +52 -52
- package/esm2022/lib/ui-kit/smiley-dialog/smiley-dialog.module.mjs +18 -18
- package/esm2022/lib/ui-kit/snack-bar/snack-bar/snack-bar.component.mjs +46 -46
- package/esm2022/lib/ui-kit/snack-bar/snack-bar.module.mjs +18 -18
- package/esm2022/lib/ui-kit/snack-bar/snack-bar.service.mjs +23 -23
- package/esm2022/lib/ui-kit/tooltip/tooltip.directive.mjs +168 -168
- package/esm2022/lib/ui-kit/tooltip/tooltip.module.mjs +18 -18
- package/esm2022/lib/ui-kit/v-loader/loader/loader.component.mjs +24 -24
- package/esm2022/lib/ui-kit/v-loader/loader-inline/loader-inline.component.mjs +24 -24
- package/esm2022/lib/ui-kit/v-loader/v-loader.module.mjs +19 -19
- package/esm2022/public-api.mjs +10 -10
- package/esm2022/vc-create-dashboard.mjs +4 -4
- package/fesm2022/vc-create-dashboard.mjs +6438 -6333
- package/fesm2022/vc-create-dashboard.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/configurations.d.ts +4 -4
- package/lib/create-dashboard-container/categories/categories-config.d.ts +18 -18
- package/lib/create-dashboard-container/categories/categories.component.d.ts +66 -66
- package/lib/create-dashboard-container/configure-widgets/configure-widgets/configure-widgets.component.d.ts +113 -113
- package/lib/create-dashboard-container/configure-widgets/configure-widgets/widget.interface.d.ts +9 -9
- package/lib/create-dashboard-container/configure-widgets/configure-widgets.module.d.ts +14 -14
- package/lib/create-dashboard-container/constants/assets.constant.d.ts +35 -35
- package/lib/create-dashboard-container/create-dashboard-config.d.ts +18 -18
- package/lib/create-dashboard-container/create-dashboard.component.d.ts +219 -216
- package/lib/create-dashboard-container/create-dashboard.module.d.ts +37 -37
- package/lib/create-dashboard-container/directives/directives.module.d.ts +8 -8
- package/lib/create-dashboard-container/directives/scroll-in-view.directive.d.ts +12 -12
- package/lib/create-dashboard-container/form-group/form-group.component.d.ts +48 -48
- package/lib/create-dashboard-container/frequency/frequency.component.d.ts +39 -39
- package/lib/create-dashboard-container/interfaces/widget-data-model.d.ts +8 -8
- package/lib/create-dashboard-container/pipes/filter.pipe.d.ts +7 -7
- package/lib/create-dashboard-container/pipes/search-program.pipe.d.ts +7 -7
- package/lib/create-dashboard-container/pipes/search.pipe.d.ts +7 -7
- package/lib/create-dashboard-container/pipes/text-count.pipe.d.ts +7 -7
- package/lib/create-dashboard-container/program-list/constant.d.ts +24 -24
- package/lib/create-dashboard-container/program-list/information-block/information-block.component.d.ts +6 -6
- package/lib/create-dashboard-container/program-list/interfaces/list-item.interface.d.ts +5 -5
- package/lib/create-dashboard-container/program-list/list-container/list-container.component.d.ts +9 -9
- package/lib/create-dashboard-container/program-list/pipes/check-selected-items.pipes.d.ts +7 -7
- package/lib/create-dashboard-container/program-list/program-list/program-list.component.d.ts +119 -119
- package/lib/create-dashboard-container/program-list/program-list.module.d.ts +17 -17
- package/lib/create-dashboard-container/program-list/services/list-utils.service.d.ts +7 -7
- package/lib/create-dashboard-container/program-list/services/program-list-api.service.d.ts +12 -14
- package/lib/create-dashboard-container/responsibility-center/responsibility-center.component.d.ts +70 -62
- package/lib/create-dashboard-container/risk-categories/risk-categories-config.d.ts +18 -18
- package/lib/create-dashboard-container/risk-categories/risk-categories.component.d.ts +66 -66
- package/lib/create-dashboard-container/services/configure-widgets.service.d.ts +21 -23
- package/lib/create-dashboard-container/services/create-dashboard.service.d.ts +80 -82
- package/lib/create-dashboard-container/services/pagination.service.d.ts +12 -12
- package/lib/create-dashboard-container/user-list/user-list.component.d.ts +123 -123
- package/lib/create-dashboard-container/user-list/user-list.config.d.ts +13 -13
- package/lib/create-dashboard-container/utils/dashboard-edit.utils.d.ts +16 -16
- package/lib/create-dashboard.service.d.ts +6 -6
- package/lib/ui-kit/dashboard-footer/dashboard-footer/dashboard-footer.component.d.ts +17 -17
- package/lib/ui-kit/dashboard-footer/dashboard-footer-config.d.ts +11 -11
- package/lib/ui-kit/dashboard-footer/dashboard-footer.module.d.ts +10 -10
- package/lib/ui-kit/dialog/dialog-config.d.ts +6 -6
- package/lib/ui-kit/dialog/dialog-injector.d.ts +7 -7
- package/lib/ui-kit/dialog/dialog-ref.d.ts +7 -7
- package/lib/ui-kit/dialog/dialog.component.d.ts +33 -33
- package/lib/ui-kit/dialog/dialog.module.d.ts +9 -9
- package/lib/ui-kit/dialog/dialog.service.d.ts +17 -17
- package/lib/ui-kit/dialog/insertion.directive.d.ts +8 -8
- package/lib/ui-kit/floating-bar/floating-bar.component.d.ts +20 -20
- package/lib/ui-kit/floating-bar/floating-bar.module.d.ts +10 -10
- package/lib/ui-kit/formgroup/click-outside.directive.d.ts +10 -10
- package/lib/ui-kit/formgroup/cs-checkbox/cs-checkbox.component.d.ts +13 -13
- package/lib/ui-kit/formgroup/cs-radio/cs-radio.component.d.ts +15 -15
- package/lib/ui-kit/formgroup/cs-radio-group/cs-radio-group.component.d.ts +8 -8
- package/lib/ui-kit/formgroup/cs-select/cs-select.component.d.ts +36 -36
- package/lib/ui-kit/formgroup/cs-switch/cs-switch.component.d.ts +15 -15
- package/lib/ui-kit/formgroup/formgroup.module.d.ts +17 -17
- package/lib/ui-kit/formgroup/pipes/pascal.pipe.d.ts +7 -7
- package/lib/ui-kit/formgroup/pipes/searchMultiSelect.pipe.d.ts +7 -7
- package/lib/ui-kit/loaders/loaders.module.d.ts +8 -8
- package/lib/ui-kit/loaders/table-loader/table-loader.component.d.ts +9 -9
- package/lib/ui-kit/no-data/no-data.component.d.ts +19 -19
- package/lib/ui-kit/no-data/no-data.module.d.ts +8 -8
- package/lib/ui-kit/pagination/pagination.component.d.ts +21 -21
- package/lib/ui-kit/pagination/pagination.module.d.ts +8 -8
- package/lib/ui-kit/popover/popover.component.d.ts +28 -28
- package/lib/ui-kit/popover/popover.directive.d.ts +17 -17
- package/lib/ui-kit/popover/popover.module.d.ts +9 -9
- package/lib/ui-kit/popover/popover.service.d.ts +13 -13
- package/lib/ui-kit/select/cs-option/cs-option.component.d.ts +16 -16
- package/lib/ui-kit/select/cs-select/cs-select.component.d.ts +32 -32
- package/lib/ui-kit/select/safe-html.pipe.d.ts +10 -10
- package/lib/ui-kit/select/select.module.d.ts +11 -11
- package/lib/ui-kit/services/cs-select.service.d.ts +7 -7
- package/lib/ui-kit/smiley-dialog/smiley-dialog.component.d.ts +17 -17
- package/lib/ui-kit/smiley-dialog/smiley-dialog.module.d.ts +8 -8
- package/lib/ui-kit/snack-bar/snack-bar/snack-bar.component.d.ts +17 -17
- package/lib/ui-kit/snack-bar/snack-bar.module.d.ts +8 -8
- package/lib/ui-kit/snack-bar/snack-bar.service.d.ts +9 -9
- package/lib/ui-kit/tooltip/tooltip.directive.d.ts +28 -28
- package/lib/ui-kit/tooltip/tooltip.module.d.ts +8 -8
- package/lib/ui-kit/v-loader/loader/loader.component.d.ts +11 -11
- package/lib/ui-kit/v-loader/loader-inline/loader-inline.component.d.ts +11 -11
- package/lib/ui-kit/v-loader/v-loader.module.d.ts +9 -9
- package/package.json +1 -1
- package/public-api.d.ts +3 -3
- package/esm2022/lib/create-dashboard-container/services/auth.service.mjs +0 -31
- package/lib/create-dashboard-container/services/auth.service.d.ts +0 -11
|
@@ -1,1520 +1,1601 @@
|
|
|
1
|
-
import { Component,
|
|
2
|
-
import dayjs from 'dayjs';
|
|
3
|
-
import { forkJoin } from 'rxjs';
|
|
4
|
-
import { finalize, map } from 'rxjs/operators';
|
|
5
|
-
import { TextCountPipe } from './pipes/text-count.pipe';
|
|
6
|
-
import { ASSETS } from './constants/assets.constant';
|
|
7
|
-
import { PROGRAM_LIST_API } from './program-list/constant';
|
|
8
|
-
import { buildProgramSelectionMapFromCategories, extractCategoryIdsFromDashboard, extractProgramIdsFromDashboard, extractRcIdsFromDashboard, filterActiveWidgets, flattenProgramSelectionMap, getEditDashboardCdid, getSelectedProgramsMap, hasProgramSelectionInMap, normalizeIdArray, normalizeProgramCategories, normalizeProgramSelectionMap, parseSailsProgramList, } from './utils/dashboard-edit.utils';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "./services/create-dashboard.service";
|
|
11
|
-
import * as i2 from "./services/pagination.service";
|
|
12
|
-
import * as i3 from "../ui-kit/snack-bar/snack-bar.service";
|
|
13
|
-
import * as i4 from "../ui-kit/popover/popover.service";
|
|
14
|
-
import * as i5 from "./pipes/text-count.pipe";
|
|
15
|
-
import * as i6 from "@angular/common";
|
|
16
|
-
import * as i7 from "@vcomply/editor";
|
|
17
|
-
import * as i8 from "@angular/forms";
|
|
18
|
-
import * as i9 from "../ui-kit/tooltip/tooltip.directive";
|
|
19
|
-
import * as i10 from "./configure-widgets/configure-widgets/configure-widgets.component";
|
|
20
|
-
import * as i11 from "../ui-kit/popover/popover.component";
|
|
21
|
-
import * as i12 from "../ui-kit/popover/popover.directive";
|
|
22
|
-
import * as i13 from "../ui-kit/v-loader/loader-inline/loader-inline.component";
|
|
23
|
-
import * as i14 from "../ui-kit/snack-bar/snack-bar/snack-bar.component";
|
|
24
|
-
import * as i15 from "./directives/scroll-in-view.directive";
|
|
25
|
-
import * as i16 from "../ui-kit/smiley-dialog/smiley-dialog.component";
|
|
26
|
-
import * as i17 from "ng2-date-picker";
|
|
27
|
-
import * as i18 from "./program-list/program-list/program-list.component";
|
|
28
|
-
import * as i19 from "./program-list/list-container/list-container.component";
|
|
29
|
-
import * as i20 from "./program-list/information-block/information-block.component";
|
|
30
|
-
import * as i21 from "./user-list/user-list.component";
|
|
31
|
-
import * as i22 from "./responsibility-center/responsibility-center.component";
|
|
32
|
-
export class CreateDashboardComponent {
|
|
33
|
-
createDashboardService;
|
|
34
|
-
paginationService;
|
|
35
|
-
cdr;
|
|
36
|
-
snackBar;
|
|
37
|
-
popoverService;
|
|
38
|
-
textCount;
|
|
39
|
-
feature;
|
|
40
|
-
activeSelector = '';
|
|
41
|
-
disabled = false;
|
|
42
|
-
mode = 'CREATE';
|
|
43
|
-
dashboardId = '';
|
|
44
|
-
dashboardDetails = null; // for edit dashboard
|
|
45
|
-
/** API dashboard object from createDashboard response (used when navigating after create). */
|
|
46
|
-
createdDashboard = null;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
'
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'
|
|
129
|
-
'
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
'
|
|
135
|
-
'
|
|
136
|
-
'
|
|
137
|
-
'
|
|
138
|
-
'
|
|
139
|
-
'
|
|
140
|
-
'
|
|
141
|
-
'
|
|
142
|
-
'
|
|
143
|
-
'
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
'
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
this.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
this.
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
this.
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
this.
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
this.allProgamSelected =
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
const
|
|
301
|
-
if (
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
this.
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
if (
|
|
376
|
-
this.
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
this.
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
this.
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
this.
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
this.
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
* @param
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
this.
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
this.
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
if (
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
this.
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
case '
|
|
664
|
-
this.dashboardForm.
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
this.dashboardForm.
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
this.dashboardForm.
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
return
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
if (!
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
if (
|
|
932
|
-
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
this.dashboardForm.
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
const
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
.
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
this.
|
|
1150
|
-
this.
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
(
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
this.
|
|
1171
|
-
const
|
|
1172
|
-
const
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
}
|
|
1224
|
-
});
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
this.
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
this.
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
this.
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
:
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
data?.
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
this.
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateDashboardComponent, selector: "app-create-dashboard", inputs: { feature: "feature", mode: "mode", dashboardId: "dashboardId", dashboardDetails: "dashboardDetails", createdBy: "createdBy", configureWidget: "configureWidget" }, outputs: { close: "close" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)", "document:click": "documentClick($event)" } }, providers: [TextCountPipe], viewQueries: [{ propertyName: "fromDatePicker", first: true, predicate: ["fromDatePicker"], descendants: true }, { propertyName: "toDatePicker", first: true, predicate: ["toDatePicker"], descendants: true }, { propertyName: "fromDatePickerPopup", first: true, predicate: ["fromDatePicker"], descendants: true, read: ElementRef }, { propertyName: "toDatePickerPopup", first: true, predicate: ["toDatePicker"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<app-snack-bar></app-snack-bar>\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\n [feature]=\"feature\"></app-user-list>\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\n [selectedResponsibilityCenters]=\"\n dashboardForm.selectedResponsibilityCenters\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\n (closeRcList)=\"activateSelector('', false)\">\n </app-responsibility-center>\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\n (saveSelectedCategory)=\"\n saveSelectedList('responsibilityCategories', $event)\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\n (close)=\"activateSelector('', false)\">\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\n <div class=\"left-side vx-fs-12 vx-d-flex\">\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\n <button\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\n {{ allProgamSelected.length }}\n </button>\n <span class=\"selected-text\">\n Program\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\n Selected</span>\n </ng-container>\n </div>\n <div class=\"right-side vx-d-flex\">\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\n Next <i class=\"icons\"></i>\n </button>\n </div>\n </div>\n </app-list-container>\n\n </div>\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\n\n <div class=\"form-group\" [class.disabled]=\"disabled\">\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\n [class.hidden-scroll]=\"popoverService.stopScroll\">\n <!-- Dashboard Name -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\n !dashboardForm.dashboardName || activeSelector === 'name'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\n Name\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div class=\"vx-input-group\">\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\n\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\n dashboardForm.dashboardName.length }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardName?.length > 30 ||\n !dashboardForm?.dashboardName)\n \">\n {{\n dashboardForm.dashboardName.length > 30\n ? \"You have exceeded the maximum character limit of 30 characters.\"\n : \"Please enter a name for this Dashboard.\"\n }}\n </p>\n\n <div class=\"vx-input-group vx-mt-2\">\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\n 250 -\n (dashboardForm?.dashboardDescriptionText | textCount)\n }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\n \">\n You have exceeded the maximum character limit of 250\n characters.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Dashboard Display Criteria -->\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\n Dashboard Display Criteria\n </span>\n <app-information-block></app-information-block>\n\n <!-- Who -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'whoCanView' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length == 0 ||\n activeSelector === 'whoCanView'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length > 0 &&\n activeSelector !== 'whoCanView'\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Who can view this dashboard?\n </div>\n </div>\n\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n )\n \" (click)=\"remove('whoCanView', user)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\n }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedViewers?.length > 1 &&\n !groupsEnabled\n \"\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userList.popover()\" placement=\"left\">\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\n </button>\n </div>\n <app-popover #userList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let user of dashboardForm?.selectedViewers\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n ) && !groupsEnabled\n \" (click)=\"remove('whoCanView', user)\"></i>\n {{ user?.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </ng-container>\n\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\n <button\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\n {{ dashboardForm?.selectedViewers?.length }}\n </button>\n </div>\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\n dashboardForm?.selectedGroup?.length &&\n dashboardForm?.selectedViewers?.length\n \">&</span>\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\n <button\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\n {{ dashboardForm?.selectedGroup?.length }}\n </button>\n </div>\n\n <app-popover #userCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n data.member_id\n )\n \" (click)=\"remove('whoCanView', data)\"></i>\n {{ data.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n\n <app-popover #groupCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\"></i>\n {{ data.group_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Responsibility Center -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'rcList' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\n activeSelector === 'rcList'\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\n activeSelector !== 'rcList'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\n CENTER(S)</label>\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Responsibility Center(s) that you would like<br />displayed\n in the Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\n +{{\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\n .length\n }}\n </button>\n\n <app-popover #rcList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\"></i>\n {{ rc?.item_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'rcList'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Program -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'responsibilityCategories' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n allProgamSelected?.length ==\n 0 || activeSelector === 'responsibilityCategories'\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n allProgamSelected?.length > 0 &&\n activeSelector !== 'responsibilityCategories'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\n <div *ngIf=\"\n allProgamSelected?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Program(s) that you would like displayed in\n the<br />Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n allProgamSelected?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rCategory of allProgamSelected?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\n (click)=\"remove('responsibilityCategories', rCategory)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\n }}</span>\n <button *ngIf=\"\n allProgamSelected\n ?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\n +{{\n allProgamSelected?.slice(\n 1\n ).length\n }}\n </button>\n\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rCategory of allProgamSelected\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"\n remove(\n 'responsibilityCategories',\n rCategory\n )\n \"></i>\n {{ rCategory?.name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Timeframe -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img *ngIf=\"\n !dashboardForm?.selectedFromDate ||\n !dashboardForm?.selectedToDate\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedFromDate &&\n dashboardForm?.selectedToDate\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\n <label class=\"vx-control-panel-sub-label\">Select how long you would like the information selected to be\n displayed for. If no timeframe is selected, the information\n will be displayed permanently.</label>\n <div class=\"input-group vx-d-flex vx-justify-between\">\n <div class=\"date-select\">\n <i class=\"icons\"></i>\n <input type=\"text\" id=\"from_date\" [value]=\"\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker()\" readonly />\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\n placeholder=\"Select Date\" (onSelect)=\"\n closeFromDatePicker(); datePickerOverlay = false\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\n <i class=\"icons\"></i>\n <input type=\"text\" id=\"to_date\" [value]=\"\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker()\" readonly />\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\n (onSelect)=\"\n closeToDatePicker(); datePickerOverlay = false\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n </div>\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n dashboardForm.selectedFromDate &&\n !dashboardForm.selectedToDate\n \">\n Select a time-frame.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Email Summary -->\n <!-- <div\n class=\"form-group-row\"\n [class.active]=\"activeSelector === 'frequency'\"\n [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'frequency' &&\n activeSelector !== 'name'\n \"\n >\n <div class=\"image\">\n <img\n *ngIf=\"!dashboardForm.frequencyMessage\"\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\n alt=\"\"\n width=\"36\"\n height=\"36\"\n />\n <svg\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"checkIcon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 52 52\"\n >\n <circle\n class=\"checkIcon__circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkIcon__check\"\n fill=\"none\"\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\n />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\n >Email Summaries</label\n >\n <label class=\"vx-control-panel-sub-label\"\n >If you would like to send a summary of this Dashboard, please\n select a frequency(By default VComply sends a weekly\n Summary).</label\n >\n <div\n *ngIf=\"!dashboardForm.frequencyMessage\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <div\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\n >\n Email Summaries\n </div>\n </div>\n\n <div\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\n >\n <div\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\n [arTooltip]=\"dashboardForm.frequencyMessage\"\n placement=\"bottom-left\"\n type=\"black\"\n delay=\"0\"\n [tooltipMandatory]=\"false\"\n [innerHTML]=\"dashboardForm.frequencyMessage\"\n ></div>\n\n <button\n *ngIf=\"\n dashboardForm.frequencyMessage &&\n activeSelector !== 'frequency'\n \"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"button-block\">\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"configureDashboard()\">\n Next: Configure Widgets\n </button>\n </div>\n </div>\n\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\n <i class=\"icons\"></i>\n </button>\n <div class=\"global-confirmation-alert\" *ngIf=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \n \">\n <div class=\"global-confirmation-alert-top\">\n <span class=\"icon-block\">\n <i class=\"icons\"></i>\n </span>\n <p class=\"text\" *ngIf=\"showRiskCategory\">\n Select a Responsibility Center or Risk Category.\n </p>\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\n Select a Responsibility Center.\n </p>\n </div>\n <div class=\"global-confirmation-alert-bottom\">\n <p class=\"message\"></p>\n <div class=\"button-group\">\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\n OKAY\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\n\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MarxEditorComponent, selector: "vcomply-editor", inputs: ["editorConfig"], outputs: ["comment", "sendSavedFiles", "popup"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.ToolTipDirective, selector: "[arTooltip]", inputs: ["arTooltip", "placement", "type", "tooltipMandatory", "showTooltip", "animate"] }, { kind: "component", type: i10.ConfigureWidgetsComponent, selector: "app-configure-widgets", inputs: ["selectedWidgetsData", "displayedWidgets", "showRisk", "showCompliance", "mode"], outputs: ["widgetsDataModified", "closeConfigureWidgets"] }, { kind: "component", type: i11.PopoverComponent, selector: "app-popover", inputs: ["dontCloseonClick"], outputs: ["closedOnOverlay"] }, { kind: "directive", type: i12.PopoverDirective, selector: "[appPopover]", inputs: ["refrence", "placement"] }, { kind: "component", type: i13.LoaderInlineComponent, selector: "app-loader-inline" }, { kind: "component", type: i14.SnackBarComponent, selector: "app-snack-bar" }, { kind: "directive", type: i15.ScrollInViewDirective, selector: "[appScrollInView]", inputs: ["appScrollInView"] }, { kind: "component", type: i16.SmileyDialogComponent, selector: "app-smiley-dialog", inputs: ["message", "autoClose", "actionButtons"], outputs: ["action", "closeSmiley"] }, { kind: "component", type: i17.DatePickerComponent, selector: "dp-date-picker", inputs: ["config", "mode", "placeholder", "disabled", "displayDate", "theme", "minDate", "maxDate", "minTime", "maxTime"], outputs: ["open", "close", "onChange", "onGoToCurrent", "onLeftNav", "onRightNav", "onSelect"] }, { kind: "directive", type: i6.NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }, { kind: "component", type: i18.ProgramListComponent, selector: "app-program-list", inputs: ["items", "selectedItems", "url"], outputs: ["itemSelected", "itemDeselected", "itemsSelectedChange"] }, { kind: "component", type: i19.ListContainerComponent, selector: "app-list-container", inputs: ["heading"], outputs: ["close"] }, { kind: "component", type: i20.InformationBlockComponent, selector: "app-information-block" }, { kind: "component", type: i21.UserListComponent, selector: "app-user-list", inputs: ["selectionType", "listDetails", "totalPages", "limit", "totalList", "feature", "totalgroupscount"], outputs: ["closeUserList", "saveSelectedUsers"] }, { kind: "component", type: i22.ResponsibilityCenterComponent, selector: "app-responsibility-center", inputs: ["responsibilityCentersList", "selectedResponsibilityCenters", "rcIdKey", "radioSelection"], outputs: ["saveSelectedList", "closeRcList"] }, { kind: "pipe", type: i6.SlicePipe, name: "slice" }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i5.TextCountPipe, name: "textCount" }] });
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
args: [{ selector: 'app-create-dashboard', providers: [TextCountPipe], template: "<app-snack-bar></app-snack-bar>\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\n [feature]=\"feature\"></app-user-list>\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\n [selectedResponsibilityCenters]=\"\n dashboardForm.selectedResponsibilityCenters\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\n (closeRcList)=\"activateSelector('', false)\">\n </app-responsibility-center>\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\n (saveSelectedCategory)=\"\n saveSelectedList('responsibilityCategories', $event)\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\n (close)=\"activateSelector('', false)\">\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\n <div class=\"left-side vx-fs-12 vx-d-flex\">\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\n <button\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\n {{ allProgamSelected.length }}\n </button>\n <span class=\"selected-text\">\n Program\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\n Selected</span>\n </ng-container>\n </div>\n <div class=\"right-side vx-d-flex\">\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\n Next <i class=\"icons\"></i>\n </button>\n </div>\n </div>\n </app-list-container>\n\n </div>\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\n\n <div class=\"form-group\" [class.disabled]=\"disabled\">\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\n [class.hidden-scroll]=\"popoverService.stopScroll\">\n <!-- Dashboard Name -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\n !dashboardForm.dashboardName || activeSelector === 'name'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\n Name\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div class=\"vx-input-group\">\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\n\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\n dashboardForm.dashboardName.length }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardName?.length > 30 ||\n !dashboardForm?.dashboardName)\n \">\n {{\n dashboardForm.dashboardName.length > 30\n ? \"You have exceeded the maximum character limit of 30 characters.\"\n : \"Please enter a name for this Dashboard.\"\n }}\n </p>\n\n <div class=\"vx-input-group vx-mt-2\">\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\n 250 -\n (dashboardForm?.dashboardDescriptionText | textCount)\n }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\n \">\n You have exceeded the maximum character limit of 250\n characters.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Dashboard Display Criteria -->\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\n Dashboard Display Criteria\n </span>\n <app-information-block></app-information-block>\n\n <!-- Who -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'whoCanView' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length == 0 ||\n activeSelector === 'whoCanView'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length > 0 &&\n activeSelector !== 'whoCanView'\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Who can view this dashboard?\n </div>\n </div>\n\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n )\n \" (click)=\"remove('whoCanView', user)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\n }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedViewers?.length > 1 &&\n !groupsEnabled\n \"\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userList.popover()\" placement=\"left\">\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\n </button>\n </div>\n <app-popover #userList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let user of dashboardForm?.selectedViewers\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n ) && !groupsEnabled\n \" (click)=\"remove('whoCanView', user)\"></i>\n {{ user?.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </ng-container>\n\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\n <button\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\n {{ dashboardForm?.selectedViewers?.length }}\n </button>\n </div>\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\n dashboardForm?.selectedGroup?.length &&\n dashboardForm?.selectedViewers?.length\n \">&</span>\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\n <button\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\n {{ dashboardForm?.selectedGroup?.length }}\n </button>\n </div>\n\n <app-popover #userCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n data.member_id\n )\n \" (click)=\"remove('whoCanView', data)\"></i>\n {{ data.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n\n <app-popover #groupCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\"></i>\n {{ data.group_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Responsibility Center -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'rcList' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\n activeSelector === 'rcList'\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\n activeSelector !== 'rcList'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\n CENTER(S)</label>\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Responsibility Center(s) that you would like<br />displayed\n in the Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\n +{{\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\n .length\n }}\n </button>\n\n <app-popover #rcList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\"></i>\n {{ rc?.item_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'rcList'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Program -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'responsibilityCategories' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n allProgamSelected?.length ==\n 0 || activeSelector === 'responsibilityCategories'\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n allProgamSelected?.length > 0 &&\n activeSelector !== 'responsibilityCategories'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\n <div *ngIf=\"\n allProgamSelected?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Program(s) that you would like displayed in\n the<br />Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n allProgamSelected?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rCategory of allProgamSelected?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\n (click)=\"remove('responsibilityCategories', rCategory)\"></i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\n }}</span>\n <button *ngIf=\"\n allProgamSelected\n ?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\n +{{\n allProgamSelected?.slice(\n 1\n ).length\n }}\n </button>\n\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rCategory of allProgamSelected\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"\n remove(\n 'responsibilityCategories',\n rCategory\n )\n \"></i>\n {{ rCategory?.name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\">\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Timeframe -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img *ngIf=\"\n !dashboardForm?.selectedFromDate ||\n !dashboardForm?.selectedToDate\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedFromDate &&\n dashboardForm?.selectedToDate\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\n <label class=\"vx-control-panel-sub-label\">Select how long you would like the information selected to be\n displayed for. If no timeframe is selected, the information\n will be displayed permanently.</label>\n <div class=\"input-group vx-d-flex vx-justify-between\">\n <div class=\"date-select\">\n <i class=\"icons\"></i>\n <input type=\"text\" id=\"from_date\" [value]=\"\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker()\" readonly />\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\n placeholder=\"Select Date\" (onSelect)=\"\n closeFromDatePicker(); datePickerOverlay = false\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\n <i class=\"icons\"></i>\n <input type=\"text\" id=\"to_date\" [value]=\"\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker()\" readonly />\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\n (onSelect)=\"\n closeToDatePicker(); datePickerOverlay = false\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n </div>\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n dashboardForm.selectedFromDate &&\n !dashboardForm.selectedToDate\n \">\n Select a time-frame.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Email Summary -->\n <!-- <div\n class=\"form-group-row\"\n [class.active]=\"activeSelector === 'frequency'\"\n [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'frequency' &&\n activeSelector !== 'name'\n \"\n >\n <div class=\"image\">\n <img\n *ngIf=\"!dashboardForm.frequencyMessage\"\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\n alt=\"\"\n width=\"36\"\n height=\"36\"\n />\n <svg\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"checkIcon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 52 52\"\n >\n <circle\n class=\"checkIcon__circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkIcon__check\"\n fill=\"none\"\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\n />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\n >Email Summaries</label\n >\n <label class=\"vx-control-panel-sub-label\"\n >If you would like to send a summary of this Dashboard, please\n select a frequency(By default VComply sends a weekly\n Summary).</label\n >\n <div\n *ngIf=\"!dashboardForm.frequencyMessage\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <div\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\n >\n Email Summaries\n </div>\n </div>\n\n <div\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\n >\n <div\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\n [arTooltip]=\"dashboardForm.frequencyMessage\"\n placement=\"bottom-left\"\n type=\"black\"\n delay=\"0\"\n [tooltipMandatory]=\"false\"\n [innerHTML]=\"dashboardForm.frequencyMessage\"\n ></div>\n\n <button\n *ngIf=\"\n dashboardForm.frequencyMessage &&\n activeSelector !== 'frequency'\n \"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <i class=\"icons vx-mr-1\"></i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"button-block\">\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"configureDashboard()\">\n Next: Configure Widgets\n </button>\n </div>\n </div>\n\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\n <i class=\"icons\"></i>\n </button>\n <div class=\"global-confirmation-alert\" *ngIf=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \n \">\n <div class=\"global-confirmation-alert-top\">\n <span class=\"icon-block\">\n <i class=\"icons\"></i>\n </span>\n <p class=\"text\" *ngIf=\"showRiskCategory\">\n Select a Responsibility Center or Risk Category.\n </p>\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\n Select a Responsibility Center.\n </p>\n </div>\n <div class=\"global-confirmation-alert-bottom\">\n <p class=\"message\"></p>\n <div class=\"button-group\">\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\n OKAY\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\n\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"] }]
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
}
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBU3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRCxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLCtCQUErQixFQUMvQiw4QkFBOEIsRUFDOUIseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUMxQiw0QkFBNEIsRUFDNUIscUJBQXFCLEdBQ3RCLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF0QyxNQUFNLE9BQU8sd0JBQXdCO0lBc0t6QjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUExS0QsT0FBTyxDQUFNO0lBQ3RCLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNSLElBQUksR0FBRyxRQUFRLENBQUM7SUFDaEIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixnQkFBZ0IsR0FBUSxJQUFJLENBQUMsQ0FBQyxxQkFBcUI7SUFDNUQsOEZBQThGO0lBQ3RGLGdCQUFnQixHQUFRLElBQUksQ0FBQztJQUMzQixLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM1QixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ00sY0FBYyxDQUF1QjtJQUN2QyxZQUFZLENBQXVCO0lBQzlELFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDUixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLE1BQU0sR0FBUSxNQUFNLENBQUM7SUFFckIsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNmLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCxTQUFTLEdBQVUsRUFBRSxDQUFDO0lBQ3RCLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFdBQVcsR0FBMEI7UUFDbkMsaUJBQWlCLEVBQUUsRUFBRTtRQUNyQixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLHFCQUFxQixFQUFFLEVBQUU7UUFDekIsaUJBQWlCLEVBQUUsYUFBYTtRQUNoQyxlQUFlLEVBQUUsWUFBWTtRQUM3QixVQUFVLEVBQUUsVUFBVTtRQUN0QixZQUFZLEVBQUUsV0FBVztRQUN6QixVQUFVLEVBQUUsY0FBYztLQUMzQixDQUFDO0lBQ0Ysb0JBQW9CLEdBQWlCO1FBQ25DLFdBQVcsRUFBRSx5Q0FBeUM7UUFDdEQsSUFBSSxFQUFFLE9BQU87UUFDYixFQUFFLEVBQUUsYUFBYTtLQUNsQixDQUFDO0lBQ0YsNEJBQTRCLEdBQVE7UUFDbEMsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLEVBQUU7WUFDUixZQUFZLEVBQUUsRUFBRTtTQUNqQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxFQUFFO1lBQ1IsWUFBWSxFQUFFLEVBQUU7U0FDakI7UUFDRCxnQkFBZ0IsRUFBRTtZQUNoQixJQUFJLEVBQUUsRUFBRTtZQUNSLFlBQVksRUFBRSxFQUFFO1NBQ2pCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLEVBQUU7WUFDUixZQUFZLEVBQUUsRUFBRTtTQUNqQjtLQUNGLENBQUM7SUFDRix1QkFBdUIsR0FBVSxFQUFFLENBQUM7SUFDcEMsaUJBQWlCLEdBQVUsRUFBRSxDQUFDO0lBQzlCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRXBCLGFBQWEsR0FBd0I7UUFDbkMsYUFBYSxFQUFFLEVBQUU7UUFDakIsd0JBQXdCLEVBQUUsRUFBRTtRQUM1QixlQUFlLEVBQUUsRUFBRTtRQUNuQixhQUFhLEVBQUUsRUFBRTtRQUNqQixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLDZCQUE2QixFQUFFLEVBQUU7UUFDakMsZ0NBQWdDLEVBQUUsRUFBRTtRQUNwQyxzQkFBc0IsRUFBRSxFQUFFO1FBQzFCLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGdCQUFnQixFQUFFLEVBQUU7UUFDcEIscUJBQXFCLEVBQUUsRUFBRTtRQUN6QixtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QixnQkFBZ0IsRUFBRSxFQUFFO1FBQ3BCLGFBQWEsRUFBRSxDQUFDO0tBQ2pCLENBQUM7SUFFRixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0IsZUFBZSxHQUFRLEVBQUUsQ0FBQztJQUMxQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFFM0IseUJBQXlCLEdBQVUsRUFBRSxDQUFDO0lBQ3RDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixRQUFRLEdBQUc7UUFDVCxRQUFRO1FBQ1IsU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsUUFBUTtRQUNSLFVBQVU7UUFDVixRQUFRO0tBQ1QsQ0FBQztJQUNGLFVBQVUsR0FBRztRQUNYLFNBQVM7UUFDVCxVQUFVO1FBQ1YsT0FBTztRQUNQLE9BQU87UUFDUCxLQUFLO1FBQ0wsTUFBTTtRQUNOLE1BQU07UUFDTixRQUFRO1FBQ1IsV0FBVztRQUNYLFNBQVM7UUFDVCxVQUFVO1FBQ1YsVUFBVTtLQUNYLENBQUM7SUFDRixRQUFRLEdBQUc7UUFDVCwrQkFBK0I7UUFDL0IsaUNBQWlDO1FBQ2pDLGtDQUFrQztLQUNuQyxDQUFDO0lBRUYsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixxQkFBcUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUU5QixnQkFBZ0IsR0FBRztRQUNqQixTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsRUFBRTtZQUNSLFlBQVksRUFBRSxFQUFFO1NBQ2pCO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLEVBQUU7WUFDUixZQUFZLEVBQUUsRUFBRTtTQUNqQjtRQUNELFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFFO1lBQ1IsWUFBWSxFQUFFLEVBQUU7U0FDakI7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsRUFBRTtZQUNSLFlBQVksRUFBRSxFQUFFO1NBQ2pCO0tBQ0YsQ0FBQztJQUNGLGNBQWMsR0FBUSxnQkFBZ0IsQ0FBQztJQUV2QyxvQkFBb0IsR0FBc0I7UUFDeEMsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7S0FDM0IsQ0FBQztJQUVGLGtCQUFrQixHQUFzQixFQUFFLENBQUM7SUFFM0MsUUFBUSxDQUFXO0lBQ25CLGFBQWEsR0FBVyxFQUFFLENBQUM7SUFDM0IsU0FBUyxDQUFNO0lBQ2YsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixXQUFXLENBQU07SUFFakIsbUJBQW1CLENBQWM7SUFFakMsaUJBQWlCLENBQWM7SUFDL0IsZ0JBQWdCLEdBQVcsRUFBRSxDQUFDO0lBQzlCLGdCQUFnQixHQUFRLEVBQUUsQ0FBQztJQUMzQixpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFDdEIsZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztJQUNqQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDakMsOEVBQThFO0lBQ3RFLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUUvQixZQUNVLHNCQUE4QyxFQUM5QyxpQkFBb0MsRUFDcEMsR0FBc0IsRUFDdEIsUUFBeUIsRUFDMUIsY0FBOEIsRUFDN0IsU0FBd0I7UUFMeEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFlO0lBQy9CLENBQUM7SUFFSixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQ0UsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3BCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFlBQVk7WUFDekMsSUFBSSxDQUFDLFlBQVk7WUFDakIsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGVBQWUsRUFDcEI7WUFDQSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRW9ELGdCQUFnQixDQUNuRSxLQUFvQjtRQUVwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUN4RCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNqQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtRQUNILENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBUyxFQUFFLEtBQWM7UUFDeEMsSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksV0FBVyxFQUFFO1lBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxJQUFJLElBQUksS0FBSywwQkFBMEIsSUFBSSxLQUFLLEVBQUU7WUFDaEQsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7U0FDekM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWlCO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFJLEVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQztZQUNqRCwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxLQUFVO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUNwRCxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUM1QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QixDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQVk7UUFDeEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssT0FBTyxFQUFFLEVBQUUsQ0FDeEMsQ0FBQztZQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM3QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLCtCQUErQjtRQUNyQyxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ25ELE9BQU87U0FDUjtRQUNELE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztZQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsSUFBSSxFQUFFLENBQUM7UUFDaEUsTUFBTSxRQUFRLEdBQUcsc0NBQXNDLENBQ3JELElBQUksRUFDSixJQUFJLENBQUMsdUJBQXVCLENBQzdCLENBQUM7UUFDRixJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxJQUFTO1FBQ2hELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxFQUFFLFFBQVEsSUFBSSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxVQUFVLENBQUM7UUFDMUUsSUFDRSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMxQixXQUFXLENBQUMsTUFBTTtZQUNsQixPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQ2xDO1lBQ0EsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLFNBQVM7Z0JBQ3pCLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxTQUFTO2dCQUNsQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsU0FBUztnQkFDN0IsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLFNBQVM7Z0JBQ2xDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxTQUFTO2FBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUc7Z0JBQ3BELEdBQUcsSUFBSSxDQUFDLGlCQUFpQjthQUMxQixDQUFDO1lBQ0YsTUFBTSxHQUFHLEdBQUcsc0NBQXNDLENBQ2hELEtBQUssRUFDTCxJQUFJLENBQUMsdUJBQXVCLENBQzdCLENBQUM7WUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO2FBQzdCO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxJQUFJLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3hELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNwRCxJQUFJLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsTUFBTSxHQUFHLEdBQUcsc0NBQXNDLENBQ2hELFdBQVcsRUFDWCxJQUFJLENBQUMsdUJBQXVCLENBQzdCLENBQUM7Z0JBQ0YsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNuQyxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUc7b0JBQ3BELEdBQUcsSUFBSSxDQUFDLGlCQUFpQjtpQkFDMUIsQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQzFDO1NBQ0Y7UUFFRCxNQUFNLFdBQVcsR0FBRywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsRUFBRTtnQkFDRixTQUFTLEVBQUUsWUFBWSxFQUFFLEVBQUU7YUFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsaUJBQWlCLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRztnQkFDcEQsR0FBRyxJQUFJLENBQUMsaUJBQWlCO2FBQzFCLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sMEJBQTBCLENBQUMsVUFBaUI7UUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUU7WUFDdkIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUc7WUFDcEQsR0FBRyxJQUFJLENBQUMsaUJBQWlCO1NBQzFCLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxzQ0FBc0MsQ0FDaEQsVUFBVSxFQUNWLElBQUksQ0FBQyx1QkFBdUIsQ0FDN0IsQ0FBQztRQUNGLElBQUksd0JBQXdCLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLHdDQUF3QztRQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUNoRCxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQ3RELENBQUM7U0FDSDthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ2hELENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FDaEQsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBRXBDLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFFbEMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBRTdDLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxNQUFNLFdBQVcsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RCxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNSO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQWdCO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBWTtRQUNwQixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE9BQU8sQ0FDTCxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQzNFLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFHRCxrQkFBa0I7UUFDaEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUUzQixDQUFDO0lBSUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEdBQVE7UUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBRTNCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7YUFDekI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDL0MsSUFBSSxDQUFDLFNBQVMsRUFDZCxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDaEIsV0FBVyxDQUNaLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDdEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUM3QyxJQUFJLENBQUMsU0FBUyxFQUNkLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUNoQixVQUFVLENBQ1gsQ0FBQztnQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO2dCQUN0RSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdEOztPQUVHO0lBQ0gsMEJBQTBCO1FBQ3hCLGtIQUFrSDtRQUNsSCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtTQUNGO2FBQU07WUFDTCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNUO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVM7UUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixNQUFNLFlBQVksR0FBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO2dCQUM1QixJQUFJLEdBQUcsR0FBUSxFQUFFLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDakMsR0FBRyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDckIsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7d0JBQzVDLElBQUksZUFBZSxHQUFRLEVBQUUsQ0FBQzt3QkFDOUIsZUFBZSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO3dCQUM5QyxlQUFlLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQzNDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7d0JBQ2hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztvQkFDdkQsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztTQUNuRDthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDL0IsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFDO1lBRTdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDNUIsSUFDRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FDbkUsT0FBTyxDQUFDLEVBQUUsQ0FDWCxFQUNEO29CQUNBLElBQUksR0FBRyxHQUFRLEVBQUUsQ0FBQztvQkFDbEIsR0FBRyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUNqQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDYixHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ2hDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsR0FBRyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3JCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO29CQUNyQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTs0QkFDNUMsSUFBSSxlQUFlLEdBQVEsRUFBRSxDQUFDOzRCQUM5QixlQUFlLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQzs0QkFDekIsZUFBZSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDOzRCQUM5QyxlQUFlLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7NEJBQzNDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7NEJBQ2hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUN4QyxDQUFDLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUMxQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUM1QyxDQUFDO29CQUNGLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzt3QkFDN0MsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzdDLENBQUMsYUFBa0IsRUFBRSxFQUFFO2dDQUNyQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FDL0MsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FDbEQsQ0FBQztnQ0FDRixJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsRUFBRTtvQ0FDdEIsYUFBYSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUs7d0NBQzFELENBQUMsQ0FBQyxRQUFRO3dDQUNWLENBQUMsQ0FBQyxVQUFVLENBQUM7aUNBQ2hCOzRCQUNILENBQUMsQ0FDRixDQUFDO3lCQUNIO3FCQUNGO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUU7Z0JBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQzFCLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUNoRSxDQUFDO2dCQUNGLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUNmLFdBQVcsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO29CQUMvQixJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDdEMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFrQixFQUFFLEVBQUU7NEJBQ3JELGFBQWEsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO3dCQUNuQyxDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBYztRQUMvQixNQUFNLFdBQVcsR0FBVSxFQUFFLENBQUM7UUFFOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQy9CLElBQUksTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDdkM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNoQixDQUFDLEVBQ0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsS0FBSyxDQUFDO29CQUN0QyxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVc7Z0JBQ3hDLElBQUksRUFBRSxzQkFBc0I7Z0JBQzVCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXO29CQUNwQyxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVc7YUFDdkMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxzQkFBc0IsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLFNBQVMsQ0FDakUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDLENBQUM7YUFDM0U7UUFDSCxDQUFDLEVBQ0QsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FBQyxLQUFVLEVBQUUsR0FBVztRQUNsQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2YsS0FBSzthQUNGLE1BQU0sQ0FDTCxDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQ3ZCLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUNuRCxFQUNELElBQUksR0FBRyxFQUFFLENBQ1Y7YUFDQSxNQUFNLEVBQUUsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVksRUFBRSxhQUFrQjtRQUMvQyxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssSUFBSTtnQkFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQzdELElBQUksQ0FBQyx5QkFBeUIsRUFDOUIsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29CQUNoRSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWSxDQUN0RCxDQUFDO3FCQUNIO3lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUNoRCxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQ2hELENBQUM7cUJBQ0g7aUJBQ0Y7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssWUFBWTtnQkFDZixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNwRCxhQUFhLEVBQUUsS0FBSyxFQUNwQixXQUFXLENBQ1osQ0FBQztnQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNsRCxhQUFhLEVBQUUsTUFBTSxFQUNyQixVQUFVLENBQ1gsQ0FBQztnQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO2dCQUN0RSxNQUFNO1lBQ1IsS0FBSywwQkFBMEI7Z0JBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDO29CQUNqRCwwQkFBMEIsQ0FDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7d0JBQzFCLENBQUMsQ0FBQyxhQUFhO3dCQUNmLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQ3BELENBQUM7Z0JBQ0osSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7Z0JBQ2hELE1BQU07WUFDUixLQUFLLGNBQWM7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEdBQUcsYUFBYSxDQUFDO2dCQUMxRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQkFDaEUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ2hELENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FDdEQsQ0FBQztxQkFDSDt5QkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUNoRCxDQUFDO3FCQUNIO2lCQUNGO2dCQUNELE1BQU07U0FDVDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFdBQWlCO1FBQzdDLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxJQUFJO2dCQUNQLE1BQU0sT0FBTyxHQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUN4RCxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUNyQyxDQUFDO2dCQUNKLElBQUksT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNsQixNQUFNLFFBQVEsR0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBRXBFLElBQUksUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN4QyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQWlCLEVBQUUsRUFBRTs0QkFDcEQsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQ3hELENBQUMsYUFBa0IsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQzVELENBQUM7NEJBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQ3JELFdBQVcsRUFDWCxDQUFDLENBQ0YsQ0FBQzt3QkFDSixDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtnQkFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQkFDaEUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ2hELENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FDdEQsQ0FBQztxQkFDSDt5QkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUNoRCxDQUFDO3FCQUNIO2lCQUNGO2dCQUNELE1BQU07WUFFUixLQUFLLFlBQVk7Z0JBQ2YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUNoRSxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUNyRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE1BQU07WUFDUixLQUFLLGlCQUFpQjtnQkFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUN2RCxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxLQUFLLEVBQUUsUUFBUSxDQUMvQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE1BQU07WUFDUixLQUFLLDBCQUEwQjtnQkFDN0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxNQUFNO1lBRVIsS0FBSyxjQUFjO2dCQUNqQixNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDakQsQ0FBQyxZQUFpQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQ3JFLENBQUM7Z0JBQ0osSUFBSSxpQkFBaUIsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDNUIsTUFBTSxNQUFNLEdBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDOUMsaUJBQWlCLEVBQ2pCLENBQUMsQ0FDRixDQUFDO29CQUNGLElBQUksTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQWlCLEVBQUUsRUFBRTs0QkFDakQsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQ2pELENBQUMsYUFBa0IsRUFBRSxFQUFFLENBQ3JCLGFBQWEsQ0FBQyxXQUFXLElBQUksWUFBWSxDQUM1QyxDQUFDOzRCQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDbkUsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29CQUNoRSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWSxDQUN0RCxDQUFDO3FCQUNIO3lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUNoRCxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQ2hELENBQUM7cUJBQ0g7aUJBQ0Y7Z0JBQ0QsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFXLEVBQUUsR0FBVSxFQUFFLEdBQVc7UUFDMUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVyxFQUFFLEdBQVUsRUFBRSxJQUFjO1FBQzFELE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUN0QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUMxQixPQUFPO2FBQ1I7WUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDMUIsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUMxQyxDQUFDO2dCQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN2QixNQUFNO2lCQUNQO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFVO1FBQzlCLE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFO1lBQzFCLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtvQkFDckMsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNyQjtnQkFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNsQjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDbkM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFTO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLEdBQUcsRUFBRTtZQUNMLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLE9BQU87WUFDMUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsSUFBSTtZQUM3QyxTQUFTLEVBQ1AsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsRUFBRSxFQUFFLGdCQUFnQjtnQkFDcEIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUM7Z0JBQ25FLEVBQUU7U0FDTCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFXLEVBQUUsR0FBYTtRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDL0IsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE1BQU0sUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRS9CLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDckIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNMLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssUUFBUTtnQkFDaEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxRQUFRO2dCQUM5QixNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLFFBQVE7Z0JBQzdCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssUUFBUTtnQkFDM0IsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7Z0JBQ3hFLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQzlFLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLE9BQU87YUFDUjtZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFO1lBQ3RDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksRUFBRSxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRSxNQUFNLFFBQVEsR0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQztnQkFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDaEQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsR0FBRyxRQUFRLENBQUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUMxQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGlDQUFpQztRQUN2QyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQ3ZELE9BQU87U0FDUjtRQUNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFDOUIsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUNuQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7WUFDbEQsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDL0IsSUFBSSxDQUFDLHlCQUF5QixFQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQ3RCLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEdBQUcsUUFBUSxDQUFDO1FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTyxlQUFlLENBQ3JCLFFBQXVCLEVBQ3ZCLE1BQTBCO1FBRTFCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7UUFDRCxRQUFRO2FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO2FBQ2hELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNuQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsSUFBUztRQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyw2QkFBNkIsQ0FDaEMsOEJBQThCLENBQUMsSUFBSSxDQUFDLEVBQ3BDLCtCQUErQixDQUFDLElBQUksQ0FBQyxFQUNyQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFDNUIsSUFBSSxFQUFFLE9BQU8sQ0FDZCxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQ2pDLElBQUksQ0FBQyx1QkFBdUIsRUFDNUIsV0FBVyxFQUNYLGFBQWEsQ0FDZCxDQUFDO1lBQ0YsSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtnQkFDM0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7UUFDRCxJQUNFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLEVBQzFEO1lBQ0EsSUFBSSxDQUFDLGlCQUFpQixHQUFHO2dCQUN2QixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDO2FBQ3ZELENBQUM7U0FDSDtRQUNELElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTyw2QkFBNkIsQ0FDbkMsVUFBb0IsRUFDcEIsV0FBcUIsRUFDckIsbUJBQTJDLEVBQzNDLGNBQWtFO1FBRWxFLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQ3RCLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGNBQWMsQ0FDZixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3JCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFTyxnQ0FBZ0M7UUFDdEMsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUNuRCxPQUFPO1NBQ1I7UUFDRCxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLENBQ3RELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQ3BDLElBQUksRUFBRSxDQUNSLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLElBQUksR0FBRyxDQUNSLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQzdELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsSUFBSSxDQUFDLEVBQUUsVUFBVSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FDakUsQ0FDRjtTQUNGLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUMzQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QixDQUFDLEdBQTBCO1FBQ3pELE1BQU0sVUFBVSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQztZQUNqRCwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxHQUFRLEVBQUUsYUFBMEI7UUFDNUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FDTCxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsVUFBb0IsRUFDcEIsY0FBd0IsRUFBRSxFQUMxQixtQkFBMkMsRUFDM0MsY0FBa0U7UUFFbEUsSUFDRSxtQkFBbUI7WUFDbkIsT0FBTyxtQkFBbUIsS0FBSyxRQUFRO1lBQ3ZDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUNuQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUM3QztZQUNBLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25ELE9BQU87U0FDUjtRQUVELElBQ0UsY0FBYztZQUNkLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUNsRTtZQUNBLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUM3QyxPQUFPO1NBQ1I7UUFFRCxNQUFNLHdCQUF3QixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDMUQsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLGdCQUFnQixHQUNwQixVQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDakUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFFZixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtvQkFDdkIsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO3dCQUNyQixJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FCQUNyRDtvQkFDRCx3QkFBd0IsRUFBRSxDQUFDO29CQUMzQixPQUFPO2lCQUNSO2dCQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLGVBQWUsR0FDbkIsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFFNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7b0JBQzNCLHdCQUF3QixFQUFFLENBQUM7b0JBQzNCLE9BQU87aUJBQ1I7Z0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDcEIsT0FBTztvQkFDUCxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLElBQUksTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFO2lCQUNqRSxDQUFDLENBQUMsQ0FDSixDQUNGLENBQUM7Z0JBQ0YsUUFBUSxDQUFDLGdCQUFnQixDQUFDO3FCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztxQkFDaEQsU0FBUyxDQUFDO29CQUNULElBQUksRUFBRSxDQUFDLFVBQW1CLEVBQUUsRUFBRTt3QkFDNUIsTUFBTSxPQUFPLEdBQUcsVUFHZCxDQUFDO3dCQUNILE1BQU0sR0FBRyxHQUEwQixFQUFFLENBQUM7d0JBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFOzRCQUMxQyxNQUFNLFFBQVEsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUMzQyxDQUFDOzRCQUNGLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtnQ0FDbkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7NkJBQ3BDO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILElBQUksd0JBQXdCLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDcEM7NkJBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFOzRCQUN4QyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQzt5QkFDeEM7b0JBQ0gsQ0FBQztvQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2lCQUNuQyxDQUFDLENBQUM7WUFDUCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsd0JBQXdCLEVBQUUsQ0FBQztZQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFGQUFxRjtJQUM3RSx3QkFBd0IsQ0FDOUIsVUFBb0IsRUFDcEIsZ0JBQXdCO1FBRXhCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBZSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ3pDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUNuQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLE9BQU87YUFDUjtZQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDUixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ2pCLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRTthQUNoQixDQUFDLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxpQkFBaUIsR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxHQUFHO2dCQUNwRCxHQUFHLElBQUksQ0FBQyxpQkFBaUI7YUFDMUIsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUEwQixFQUFFLENBQUM7WUFDdEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN6QixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUM7UUFFRixJQUFJLGdCQUFnQixFQUFFLE1BQU0sRUFBRTtZQUM1QixLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQjthQUN4QixtQkFBbUIsRUFBRTthQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7YUFDaEQsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ25DLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsaUJBQWlCLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxHQUFHLENBQUM7UUFDN0QsTUFBTSxhQUFhLEdBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLFNBQVM7WUFDZixHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsRUFBRSxTQUFTO1lBQ2QsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQ1osSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixJQUFJLEVBQUUsc0JBQXNCO1lBQzVCLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QixJQUFJLEVBQUUsR0FBRztZQUNULEdBQUcsRUFBRSxxQkFBcUI7WUFDMUIsR0FBRyxFQUFFLHFCQUFxQixDQUFDO1FBRTdCLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTixHQUFHLElBQUk7WUFDUCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsSUFBSTtZQUM3QixjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsY0FBYztZQUNqRCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsY0FBYztZQUN2QyxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsSUFBSSxHQUFHLEVBQUUsV0FBVztZQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsT0FBTztZQUN0QyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLElBQUksR0FBRyxFQUFFLGdCQUFnQjtZQUNqRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLElBQUksR0FBRyxFQUFFLGlCQUFpQjtZQUNwRSxRQUFRLEVBQUUsYUFBYTtZQUN2QixTQUFTLEVBQUUsOEJBQThCLENBQUM7Z0JBQ3hDLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsT0FBTzthQUN2QyxDQUFDO1lBQ0YsdUJBQXVCLEVBQ3JCLElBQUksRUFBRSx1QkFBdUI7Z0JBQzdCLEdBQUcsRUFBRSx1QkFBdUI7Z0JBQzVCLElBQUksRUFBRSxzQkFBc0I7Z0JBQzVCLEVBQUU7WUFDSixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixpQkFBaUIsRUFDZixHQUFHLEVBQUUsaUJBQWlCO2dCQUN0QixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixFQUFFO1lBQ0oscUJBQXFCLEVBQUUsUUFBUTtZQUMvQixxQkFBcUIsRUFBRSxRQUFRO1lBQy9CLHNCQUFzQixFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxPQUFPO1lBQ3RDLFNBQVMsRUFDUCxJQUFJLEVBQUUsU0FBUztnQkFDZixDQUFDLEdBQUcsRUFBRSxlQUFlLElBQUksR0FBRyxFQUFFLGFBQWE7b0JBQ3pDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFO29CQUN4RCxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLGVBQWUsRUFDYixJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUk7Z0JBQ3JCLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVTtnQkFDM0IsR0FBRyxFQUFFLGVBQWU7WUFDdEIsYUFBYSxFQUNYLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxhQUFhO1lBQ3hFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxVQUFVLElBQUksR0FBRyxFQUFFLFVBQVU7WUFDbEUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFVBQVUsSUFBSSxHQUFHLEVBQUUsU0FBUztTQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEI7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxJQUFXLEVBQUUsR0FBVztRQUNoQyxPQUFPLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDWixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBQy9DLE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEdBQUcsV0FBVzthQUN0RCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNmLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFDRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYTtZQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsd0JBQXdCLENBQUM7Z0JBQ3BFLEdBQUc7WUFDTCxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCO2dCQUNuQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDO1lBQ3RDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQzlEO1lBQ0EsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQVE7WUFDbkIsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDO2dCQUN4RCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQzthQUM3RDtZQUVELGNBQWMsRUFBRSxTQUFTLENBQUMsZUFBZTtZQUN6QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDL0IsQ0FBQztRQUVGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDL0QsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLDBFQUEwRTtnQkFDMUUsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7b0JBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO29CQUNoQyxHQUFHLENBQUMsYUFBYSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7b0JBQ25DLEtBQUssRUFDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSzt3QkFDNUIsYUFBYSxFQUFFLEtBQUs7d0JBQ3BCLGFBQWEsRUFBRSxJQUFJO3dCQUNuQixhQUFhLEVBQUUsbUJBQW1CO29CQUNwQyxJQUFJLEVBQ0YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUk7d0JBQzNCLGFBQWEsRUFBRSxJQUFJO3dCQUNuQixhQUFhLEVBQUUsS0FBSzt3QkFDcEIsYUFBYSxFQUFFLG1CQUFtQjtvQkFDcEMsbUJBQW1CLEVBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUI7d0JBQzFDLGFBQWEsRUFBRSxtQkFBbUI7d0JBQ2xDLGFBQWEsRUFBRSxpQkFBaUI7b0JBQ2xDLGlCQUFpQixFQUNmLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUI7d0JBQ3hDLGFBQWEsRUFBRSxpQkFBaUI7d0JBQ2hDLGFBQWEsRUFBRSxtQkFBbUI7aUJBQ3JDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDLENBQUM7Z0JBQ2xILFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUzt3QkFDbEQsRUFBRSxFQUFFLElBQUk7d0JBQ1IsSUFBSTt3QkFDSixpQkFBaUIsRUFDZixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1COzRCQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCO3dCQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtxQkFDakMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7U0FDRixDQUFDLENBQUE7SUFHSixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQVE7WUFDbkIsY0FBYyxFQUFFLFNBQVMsQ0FBQyxhQUFhO1lBQ3ZDLFdBQVcsRUFBRTtnQkFDWDtvQkFDRSxPQUFPLEVBQUUsU0FBUyxDQUFDLHdCQUF3QjtvQkFDM0MsV0FBVyxFQUFFLEVBQUU7aUJBQ2hCO2FBQ0Y7WUFDRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDO1lBQ2xFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7WUFDbEUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDbkMsU0FBUyxDQUFDLDZCQUE2QixFQUN2QyxNQUFNLENBQ1A7WUFDRCx1QkFBdUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUNyQyxTQUFTLENBQUMsZ0NBQWdDLEVBQzFDLGFBQWEsQ0FDZDtZQUNELGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUMzQixTQUFTLENBQUMsc0JBQXNCLEVBQ2hDLGFBQWEsQ0FDZDtZQUNELGdCQUFnQixFQUNkLFNBQVMsQ0FBQyxlQUFlLEtBQUssS0FBSztnQkFDakMsQ0FBQyxDQUFDLHNCQUFzQjtnQkFDeEIsQ0FBQyxDQUFDLGdCQUFnQjtZQUV0QixjQUFjLEVBQUUsU0FBUyxDQUFDLGVBQWU7WUFDekMsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUNwQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQ3pDO1lBQ0QsU0FBUyxFQUFFO2dCQUNULFVBQVUsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO29CQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7b0JBQ2xELENBQUMsQ0FBQyxFQUFFO2dCQUNOLFFBQVEsRUFBRSxTQUFTLENBQUMsY0FBYztvQkFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQztvQkFDaEQsQ0FBQyxDQUFDLEVBQUU7YUFDUDtTQUVGLENBQUM7UUFDRixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRTdDLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBWTtRQUN4QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLElBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDdkIsT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNqRztRQUNELE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNoQixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFDekIsT0FBTyxDQUNSLENBQUM7aUJBQVM7WUFDZixDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQ1IsSUFBSSxFQUFFLEtBQUs7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLElBQUksRUFBRSxTQUFTLEVBQUUsbUJBQW1CO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkIsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxrQ0FBa0MsQ0FBQyxPQUcxQztRQUNDLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxjQUFjLEdBQUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNO1lBQ3JELENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZTtZQUN6QixDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCx3REFBd0Q7SUFDaEQsbUJBQW1CLENBQUMsSUFBWTtRQUN0QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxlQUFlLENBQ2xCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsRUFDbkUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsb0JBQW9CO1lBQ3ZCLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUI7Z0JBQ3hDLEVBQUUsQ0FBQztRQUNMLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUNuQyxJQUFJLEVBQ0osSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsR0FBRztZQUN2QyxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxVQUFVO1NBQ3BDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksUUFBUSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFTO1FBQzdCLElBQUk7WUFDRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ1QsTUFBTSxlQUFlLEdBQ25CLGdCQUFnQixFQUFFLE9BQU87Z0JBQ3pCLENBQUMsT0FBTyxJQUFJLEVBQUUsV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvRCxJQUFJLEVBQUUsd0JBQXdCO2dCQUM5QixFQUFFLENBQUM7WUFFTCxNQUFNLFlBQVksR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1lBQzNFLE1BQU0sY0FBYyxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQzVELE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUc7Z0JBQzFDLENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztZQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksRUFBRSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDbEYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDL0QsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNoRixDQUFDO1lBQ0YsSUFBSSxDQUFDLG9CQUFvQjtnQkFDdkIsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQjtvQkFDeEMsRUFBRSxDQUFDO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxHQUFHLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO1lBQ2pELE1BQU0sZUFBZSxHQUFHLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQy9ELE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2hFLENBQUM7WUFDRixNQUFNLFNBQVMsR0FDYixJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVU7Z0JBQzNCLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSTtnQkFDckIsSUFBSSxFQUFFLGVBQWUsQ0FBQztZQUN4QixNQUFNLE9BQU8sR0FDWCxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVE7Z0JBQ3pCLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxFQUFFLGFBQWEsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWE7Z0JBQzlCLElBQUksRUFBRSxjQUFjLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLENBQUM7WUFDOUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDcEQsSUFBSSxDQUFDLFNBQVMsRUFDZCxjQUFjLEVBQ2QsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUMzQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNsRCxJQUFJLENBQUMsU0FBUyxFQUNkLGVBQWUsRUFDZixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzNCLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQjtnQkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FDWixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLGVBQWUsRUFDZixhQUFhLENBQ2QsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtnQkFDaEMsSUFBSSxFQUFFLGdCQUFnQixLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuRSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLFNBQVM7Z0JBQzdDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBRyxPQUFPO2dCQUN6QyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sZ0JBQWdCLEdBQ3BCLElBQUksRUFBRSxjQUFjLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7b0JBQ25ELENBQUMsQ0FBQyxnQkFBZ0I7b0JBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsTUFBTSxhQUFhLEdBQUcsSUFBSSxFQUFFLFdBQVcsSUFBSSxhQUFhLENBQUM7Z0JBQ3pELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxlQUFlO29CQUNsQixhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdCQUFnQjtvQkFDbkIsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDekQ7WUFDRCxJQUFJLFNBQVMsRUFBRTtnQkFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7YUFDOUM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBR0Qsa0JBQWtCO1FBQ2hCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxhQUFhLENBQUMsV0FBZ0I7UUFDNUIsSUFBSSxXQUFXLEdBQUcsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUMxRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzlDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7Z0JBQy9DLFFBQVEsVUFBVSxFQUFFLElBQUksRUFBRTtvQkFDeEIsS0FBSyxNQUFNLENBQUMsQ0FBQzt3QkFDWCxJQUFJLFVBQVUsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLElBQUksVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUU7NEJBQ2pFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO3lCQUMxQjt3QkFDRCxNQUFNO3FCQUNQO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxFQUFPO1FBQ3pCLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkIsSUFBSSxPQUFPLEVBQUUsRUFBRSxTQUFTLEtBQUssUUFBUTtZQUFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sRUFBRSxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUU7WUFDbkUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQztTQUMvQjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUdELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxNQUFpQixDQUFDO1FBQy9DLE1BQU0sb0JBQW9CLEdBQ3hCLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ3ZFLE1BQU0sMkJBQTJCLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUNqRSwyQkFBMkIsQ0FDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNMLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDN0MsOEJBQThCLENBQy9CLENBQUM7UUFDRixNQUFNLHFCQUFxQixHQUFHLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsZ0JBQWdCLEtBQUssV0FBVztZQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzdCLE1BQU0sc0JBQXNCLEdBQzFCLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQUUsTUFBTSxLQUFLLG9CQUFvQixDQUFDO1FBQ3BFLE1BQU0sbUJBQW1CLEdBQ3ZCLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXO1lBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUV4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVyRSxJQUNFLHNCQUFzQjtZQUN0QixvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLGtCQUFrQjtZQUNsQixxQkFBcUI7WUFDckIsMkJBQTJCLEVBQzNCO1lBQ0EsSUFBSSxDQUFDLHFCQUFxQixDQUN4QixLQUFLLENBQUMsTUFBTSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUNuQixNQUFXLEVBQ1gsY0FBMEIsRUFDMUIsa0JBQXVCO1FBRXZCLElBQ0UsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDaEQsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQ3JDO1lBQ0Esa0JBQWtCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7U0FDaEM7SUFDSCxDQUFDO3dHQXp5RFUsd0JBQXdCOzRGQUF4Qix3QkFBd0IsbVhBRnhCLENBQUMsYUFBYSxDQUFDLDhUQTBKVyxVQUFVLDRHQUVaLFVBQVUsa0RDN00vQyx5NmtDQWtwQmtGOzs0RkQvbEJyRSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCLENBQUMsYUFBYSxDQUFDO29RQUdqQixPQUFPO3NCQUFmLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdJLEtBQUs7c0JBQWQsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLO2dCQUN1QixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDQSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBRWhCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBMklOLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHaEUsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFtQ1QsZ0JBQWdCO3NCQUFwRSxZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1qRG5ELGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVkaXRvckNvbmZpZyB9IGZyb20gJ0B2Y29tcGx5L2VkaXRvcic7XG5pbXBvcnQgeyBEYXRlUGlja2VyQ29tcG9uZW50LCBJRGF0ZVBpY2tlckNvbmZpZyB9IGZyb20gJ25nMi1kYXRlLXBpY2tlcic7XG5pbXBvcnQgeyBDcmVhdGVEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9jcmVhdGUtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyTGlzdENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3VzZXItbGlzdC91c2VyLWxpc3QuY29uZmlnJztcbmltcG9ydCB7IENyZWF0ZURhc2hib2FyZEZvcm0gfSBmcm9tICcuL2NyZWF0ZS1kYXNoYm9hcmQtY29uZmlnJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uL3VpLWtpdC9zbmFjay1iYXIvc25hY2stYmFyLnNlcnZpY2UnO1xuXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQb3BvdmVyU2VydmljZSB9IGZyb20gJy4uL3VpLWtpdC9wb3BvdmVyL3BvcG92ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZXh0Q291bnRQaXBlIH0gZnJvbSAnLi9waXBlcy90ZXh0LWNvdW50LnBpcGUnO1xuaW1wb3J0IHsgQVNTRVRTIH0gZnJvbSAnLi9jb25zdGFudHMvYXNzZXRzLmNvbnN0YW50JztcbmltcG9ydCB7IFBST0dSQU1fTElTVF9BUEkgfSBmcm9tICcuL3Byb2dyYW0tbGlzdC9jb25zdGFudCc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4vcHJvZ3JhbS1saXN0L2ludGVyZmFjZXMvbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBidWlsZFByb2dyYW1TZWxlY3Rpb25NYXBGcm9tQ2F0ZWdvcmllcyxcbiAgZXh0cmFjdENhdGVnb3J5SWRzRnJvbURhc2hib2FyZCxcbiAgZXh0cmFjdFByb2dyYW1JZHNGcm9tRGFzaGJvYXJkLFxuICBleHRyYWN0UmNJZHNGcm9tRGFzaGJvYXJkLFxuICBmaWx0ZXJBY3RpdmVXaWRnZXRzLFxuICBmbGF0dGVuUHJvZ3JhbVNlbGVjdGlvbk1hcCxcbiAgZ2V0RWRpdERhc2hib2FyZENkaWQsXG4gIGdldFNlbGVjdGVkUHJvZ3JhbXNNYXAsXG4gIGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcCxcbiAgbm9ybWFsaXplSWRBcnJheSxcbiAgbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMsXG4gIG5vcm1hbGl6ZVByb2dyYW1TZWxlY3Rpb25NYXAsXG4gIHBhcnNlU2FpbHNQcm9ncmFtTGlzdCxcbn0gZnJvbSAnLi91dGlscy9kYXNoYm9hcmQtZWRpdC51dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jcmVhdGUtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcmVhdGUtZGFzaGJvYXJkLmNvbXBvbmVudC5sZXNzJ10sXG4gIHByb3ZpZGVyczogW1RleHRDb3VudFBpcGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVEYXNoYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGZlYXR1cmU6IGFueTtcbiAgYWN0aXZlU2VsZWN0b3IgPSAnJztcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbW9kZSA9ICdDUkVBVEUnO1xuICBASW5wdXQoKSBkYXNoYm9hcmRJZCA9ICcnO1xuICBASW5wdXQoKSBkYXNoYm9hcmREZXRhaWxzOiBhbnkgPSBudWxsOyAvLyBmb3IgZWRpdCBkYXNoYm9hcmRcbiAgLyoqIEFQSSBkYXNoYm9hcmQgb2JqZWN0IGZyb20gY3JlYXRlRGFzaGJvYXJkIHJlc3BvbnNlICh1c2VkIHdoZW4gbmF2aWdhdGluZyBhZnRlciBjcmVhdGUpLiAqL1xuICBwcml2YXRlIGNyZWF0ZWREYXNoYm9hcmQ6IGFueSA9IG51bGw7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgY3JlYXRlZEJ5ID0gMDtcbiAgQFZpZXdDaGlsZCgnZnJvbURhdGVQaWNrZXInKSBmcm9tRGF0ZVBpY2tlciE6IERhdGVQaWNrZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RvRGF0ZVBpY2tlcicpIHRvRGF0ZVBpY2tlciE6IERhdGVQaWNrZXJDb21wb25lbnQ7XG4gIGFuaW1hdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbmZpZ3VyZVdpZGdldCA9IGZhbHNlO1xuICBBU1NFVFM6IGFueSA9IEFTU0VUUztcblxuICB0b3RhbFBhZ2VzID0gMTtcbiAgdG90YWxMaXN0ID0gMTtcbiAgdXNlcnNMaXN0OiBhbnlbXSA9IFtdO1xuICB2TG9hZGVyID0gdHJ1ZTtcbiAgdXNlckxpc3RMb2FkZWQgPSBmYWxzZTtcbiAgZ3JvdXBMaXN0TG9hZGVkID0gZmFsc2U7XG4gIHJjTGlzdExvYWRlZCA9IGZhbHNlO1xuICBoaWRlVG9EYXRlID0gZmFsc2U7XG4gIGxpc3REZXRhaWxzOiBVc2VyTGlzdENvbmZpZ3VyYXRpb24gPSB7XG4gICAgc2VsZWN0ZWRVc2Vyc0xpc3Q6IFtdLFxuICAgIHNlbGVjdGVkR3JvdXBMaXN0OiBbXSxcbiAgICBub25SZW1vdmFibGVVc2Vyc0xpc3Q6IFtdLFxuICAgIGRpc3BsYXlFbGVtZW50S2V5OiAnbWVtYmVyX25hbWUnLFxuICAgIGRpc3BsYXlHcm91cEtleTogJ2dyb3VwX25hbWUnLFxuICAgIGdyb3VwSWRrZXk6ICdncm91cF9pZCcsXG4gICAgZWxlbWVudElkS2V5OiAnbWVtYmVyX2lkJyxcbiAgICB0b29sdGlwS2V5OiAnbWVtYmVyX2VtYWlsJyxcbiAgfTtcbiAgZGFzaGJvYXJkRGVzY3JpcHRpb246IEVkaXRvckNvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlcjogJ0Rlc2NyaXB0aW9uIChNYXggbGltaXQ6IDI1MCBjaGFyYWN0ZXJzKScsXG4gICAgbW9kZTogJ3ByaW1lJyxcbiAgICBpZDogJ2Rlc2NyaXB0aW9uJyxcbiAgfTtcbiAgcmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzVHJlZTogYW55ID0ge1xuICAgIHJlZ3VsYXRpb25zOiB7XG4gICAgICBsaXN0OiBbXSxcbiAgICAgIHNlbGVjdGVkTGlzdDogW10sXG4gICAgfSxcbiAgICBzdGFuZGFyZHM6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIGludGVybmFsQ29udHJvbHM6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIG90aGVyczoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gIH07XG4gIGFsbENvbXBsaWFuY2VDYXRlZ29yaWVzOiBhbnlbXSA9IFtdO1xuICBhbGxSaXNrQ2F0ZWdvcmllczogYW55W10gPSBbXTtcbiAgc2hvd1Jpc2tDYXRlZ29yeSA9IGZhbHNlO1xuICBzaG93Q3JpdGVyaWEgPSB0cnVlO1xuXG4gIGRhc2hib2FyZEZvcm06IENyZWF0ZURhc2hib2FyZEZvcm0gPSB7XG4gICAgZGFzaGJvYXJkTmFtZTogJycsXG4gICAgZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0OiAnJyxcbiAgICBzZWxlY3RlZFZpZXdlcnM6IFtdLFxuICAgIHNlbGVjdGVkR3JvdXA6IFtdLFxuICAgIHNlbGVjdGVkRnJvbURhdGU6IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RlZFRvRGF0ZTogdW5kZWZpbmVkLFxuICAgIHNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzOiBbXSxcbiAgICBzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllczogW10sXG4gICAgc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllczogW10sXG4gICAgZGlzcGxheUNyaXRlcmlhOiAnb3InLFxuICAgIGNvbmZpZ3VyZVdpZGdldDogW10sXG4gICAgZnJlcXVlbmN5RGV0YWlsczogJycsXG4gICAgc2VsZWN0ZWRGcmVxdWVuY3lUeXBlOiAnJyxcbiAgICBzZWxlY3RlZEZyZXF1ZW5jaWVzOiBbMF0sXG4gICAgZnJlcXVlbmN5TWVzc2FnZTogJycsXG4gICAgZnJlcXVlbmN5RGF0ZTogMSxcbiAgfTtcblxuICBvcGVuQ29uZmlndXJlV2lkZ2V0cyA9IGZhbHNlO1xuICBzZWxlY3RlZFdpZGdldHM6IGFueSA9IFtdO1xuICBkaXNwbGF5ZWRXaWRnZXRzOiBhbnkgPSBbXTtcblxuICByZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0OiBhbnlbXSA9IFtdO1xuICBkYXRlUGlja2VyT3ZlcmxheSA9IGZhbHNlO1xuICBkYXlOYW1lcyA9IFtcbiAgICAnTW9uZGF5JyxcbiAgICAnVHVlc2RheScsXG4gICAgJ1dlZG5lc2RheScsXG4gICAgJ1RodXJzZGF5JyxcbiAgICAnRnJpZGF5JyxcbiAgICAnU2F0dXJkYXknLFxuICAgICdTdW5kYXknLFxuICBdO1xuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JyxcbiAgICAnRmVicnVhcnknLFxuICAgICdNYXJjaCcsXG4gICAgJ0FwcmlsJyxcbiAgICAnTWF5JyxcbiAgICAnSnVuZScsXG4gICAgJ0p1bHknLFxuICAgICdBdWd1c3QnLFxuICAgICdTZXB0ZW1iZXInLFxuICAgICdPY3RvYmVyJyxcbiAgICAnTm92ZW1iZXInLFxuICAgICdEZWNlbWJlcicsXG4gIF07XG4gIHF1YXJ0ZXJzID0gW1xuICAgICdKYW51YXJ5LCBBcHJpbCwgSnVseSwgT2N0b2JlcicsXG4gICAgJ0ZlYnJ1YXJ5LCBNYXksIEF1Z3VzdCwgTm92ZW1iZXInLFxuICAgICdNYXJjaCwgSnVuZSwgU2VwdGVtYmVyLCBEZWNlbWJlcicsXG4gIF07XG5cbiAgc2hvd1Jpc2tXaWRnZXRzID0gZmFsc2U7XG4gIHNob3dDb21wbGlhbmNlV2lkZ2V0cyA9IGZhbHNlO1xuICBpc01hbmFnZVJpc2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByaXNrQ2F0ZWdvcnlMaXN0ID0ge1xuICAgIHN0cmF0ZWdpYzoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gICAgb3BlcmF0aW9uYWw6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIGNvbXBsaWFuY2U6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIG90aGVyczoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gIH07XG4gIHByb2dyYW1MaXN0VXJsOiBhbnkgPSBQUk9HUkFNX0xJU1RfQVBJO1xuXG4gIGZyb21EYXRlUGlja2VyQ29uZmlnOiBJRGF0ZVBpY2tlckNvbmZpZyA9IHtcbiAgICBtaW46IHRoaXMuZ2V0Q3VycmVudERhdGUoKSxcbiAgfTtcblxuICB0b0RhdGVQaWNrZXJDb25maWc6IElEYXRlUGlja2VyQ29uZmlnID0ge307XG5cbiAgaXNTbWlsZXkhOiBib29sZWFuO1xuICBzbWlsZXlNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZ3JvdXBMaXN0OiBhbnk7XG4gIGdyb3Vwc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB0b3RhbGdyb3VwczogYW55O1xuICBAVmlld0NoaWxkKCdmcm9tRGF0ZVBpY2tlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBmcm9tRGF0ZVBpY2tlclBvcHVwITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndG9EYXRlUGlja2VyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gIHRvRGF0ZVBpY2tlclBvcHVwITogRWxlbWVudFJlZjtcbiAgb3BlbmVkRGF0ZVBpY2tlcjogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkUHJvZ3JhbXM6IGFueSA9IHt9O1xuICBhbGxQcm9nYW1TZWxlY3RlZDogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBwZW5kaW5nRWRpdFJjSWRzOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHBlbmRpbmdFZGl0UmNFbnRyaWVzOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIGVkaXRGb3JtSHlkcmF0ZWQgPSBmYWxzZTtcbiAgLyoqIFRyYWNrcyBpbi1mbGlnaHQgRURJVCBoeWRyYXRpb24gSFRUUCBjYWxsczsgbG9hZGVyIHN0YXlzIG9uIHVudGlsIHplcm8uICovXG4gIHByaXZhdGUgZWRpdEh5ZHJhdGlvbkNvdW50ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNyZWF0ZURhc2hib2FyZFNlcnZpY2U6IENyZWF0ZURhc2hib2FyZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IFNuYWNrQmFyU2VydmljZSxcbiAgICBwdWJsaWMgcG9wb3ZlclNlcnZpY2U6IFBvcG92ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGV4dENvdW50OiBUZXh0Q291bnRQaXBlXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5KSB7XG4gICAgICB0aGlzLmxpc3REZXRhaWxzLm5vblJlbW92YWJsZVVzZXJzTGlzdC5wdXNoKHRoaXMuY3JlYXRlZEJ5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5tb2RlID09PSAnRURJVCcgJiZcbiAgICAgIGNoYW5nZXNbJ2Rhc2hib2FyZERldGFpbHMnXT8uY3VycmVudFZhbHVlICYmXG4gICAgICB0aGlzLnJjTGlzdExvYWRlZCAmJlxuICAgICAgdGhpcy51c2VyTGlzdExvYWRlZCAmJlxuICAgICAgdGhpcy5ncm91cExpc3RMb2FkZWRcbiAgICApIHtcbiAgICAgIHRoaXMuaHlkcmF0ZUVkaXRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50XG4gICkge1xuICAgIHRoaXMuY2xvc2UuZW1pdCh7IG1vZGU6ICdkaXNjYXJkJyB9KTtcbiAgICB0aGlzLmlzU21pbGV5ID0gZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFuaW1hdGVDb250YWluZXIoKTtcbiAgICB0aGlzLmdldFJDTGlzdCgpO1xuICAgIHRoaXMuY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKTtcbiAgICB0aGlzLmdldFVzZXJzTGlzdCgnJyk7XG4gICAgdGhpcy5nZXRHcm91cExpc3QoKTtcbiAgICB0aGlzLmdldFVzZXJJbmZvKCk7XG4gIH1cbiAgXG4gIGFuaW1hdGVDb250YWluZXIoKSB7XG4gICAgdGhpcy5hbmltYXRpb24gPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgZ2V0VXNlckluZm8oKXtcbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0UGVybWlzc2lvbihyZXM/LnJvbGVBY3Rpb25zKTtcbiAgICAgICAgY29uc3QgcXVpY2tMaW5rID0gcmVzLnF1aWNrX2xpbms7XG4gICAgICAgIGlmIChxdWlja0xpbmsucmlzaykge1xuICAgICAgICAgIHRoaXMuc2hvd1Jpc2tDYXRlZ29yeSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93Umlza0NhdGVnb3J5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyB0aGUgbGlzdGluZyBwYWdlcyB0aGUgbGVmdCBzaWRlIG9mIHBvbGljeSBmb3JtIHRvIHNldCBhbmQgZWRpdCB0aGUgZHJvcGRvd24gZmllbGRzIHZhbHVlc1xuICAgKiBAcGFyYW0gdHlwZSBob2xkcyBuYW1lIG9mIHBhcnRpY3VsYXIgbGlzdCBpcyB0byBiZSBkaXNwbGF5ZWRcbiAgICogQHBhcmFtIGV2ZW50IGNvbnRhaW5zIGJvb2xlYW4gdmFsdWUgdG8gZGlzcGxheSB0aGUgbGlzdCBvciBub3RcbiAgICovXG4gIGFjdGl2YXRlU2VsZWN0b3IodHlwZTogYW55LCBldmVudDogYm9vbGVhbikge1xuICAgIGlmICh0eXBlID09ICdmcmVxdWVuY3knIHx8IHRoaXMuYWN0aXZlU2VsZWN0b3IgPT0gJ2ZyZXF1ZW5jeScpIHtcbiAgICAgIHRoaXMuc2hvd0NyaXRlcmlhID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93Q3JpdGVyaWEgPSB0cnVlO1xuICAgICAgfSwgMSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJyAmJiBldmVudCkge1xuICAgICAgdGhpcy5zeW5jUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21Gb3JtKCk7XG4gICAgICB0aGlzLmVuc3VyZVByb2dyYW1TZWxlY3Rpb25NYXBGb3JMaXN0KCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlU2VsZWN0b3IgPSBldmVudCA/IHR5cGUgOiAnJztcbiAgfVxuXG4gIG9uUHJvZ3JhbVNlbGVjdGlvbkNoYW5nZShpdGVtczogTGlzdEl0ZW1bXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyA9IGl0ZW1zO1xuICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSAoW10gYXMgYW55KS5jb25jYXQoLi4uT2JqZWN0LnZhbHVlcyhpdGVtcykpO1xuICB9XG5cbiAgc2VsZWN0Q2F0ZWdvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID1cbiAgICAgIG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQpO1xuICAgIHRoaXMuYXBwbHlSZXNwb25zaWJpbGl0eUNhdGVnb3J5V2lkZ2V0RmlsdGVycygpO1xuICAgIHRoaXMuYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1xuICB9XG5cbiAgY2hlY2tEZWZhdWx0UHJvZ3JhbU9uUmVtb3ZlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gdGhpcy5hbGxQcm9nYW1TZWxlY3RlZC5maWx0ZXIoXG4gICAgICAocHJvZ3JhbTogYW55KSA9PiBwcm9ncmFtPy5pZCAhPT0gZXZlbnQ/LmlkXG4gICAgKTtcbiAgICB0aGlzLnJlbW92ZVByb2dyYW0oZXZlbnQpO1xuXG4gIH1cblxuICByZW1vdmVQcm9ncmFtKHByb2dyYW06IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGVkUHJvZ3JhbXMpO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFByb2dyYW1zW2tleV0uZmluZEluZGV4KFxuICAgICAgICAoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PT0gcHJvZ3JhbT8uaWRcbiAgICAgICk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtc1trZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTogdm9pZCB7XG4gICAgaWYgKGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcCh0aGlzLnNlbGVjdGVkUHJvZ3JhbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZsYXQgPVxuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWRcbiAgICAgICAgOiB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPz8gW107XG4gICAgY29uc3QgZnJvbUZvcm0gPSBidWlsZFByb2dyYW1TZWxlY3Rpb25NYXBGcm9tQ2F0ZWdvcmllcyhcbiAgICAgIGZsYXQsXG4gICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXG4gICAgKTtcbiAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKGZyb21Gb3JtKSkge1xuICAgICAgdGhpcy5hcHBseVByb2dyYW1TZWxlY3Rpb25NYXAoZnJvbUZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaHlkcmF0ZVByb2dyYW1zRnJvbURhc2hib2FyZERhdGEoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW1zUmF3ID0gZGF0YT8ucHJvZ3JhbXMgPz8gZGF0YT8ucHJvZ3JhbUlkID8/IGRhdGE/LnByb2dyYW1JZHM7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShwcm9ncmFtc1JhdykgJiZcbiAgICAgIHByb2dyYW1zUmF3Lmxlbmd0aCAmJlxuICAgICAgdHlwZW9mIHByb2dyYW1zUmF3WzBdID09PSAnb2JqZWN0J1xuICAgICkge1xuICAgICAgY29uc3QgY2hpcHMgPSBwcm9ncmFtc1Jhdy5tYXAoKHA6IGFueSkgPT4gKHtcbiAgICAgICAgaWQ6IHA/LmlkID8/IHA/LnByb2dyYW1JZCxcbiAgICAgICAgY2F0ZWdvcnlfaWQ6IHA/LmlkID8/IHA/LnByb2dyYW1JZCxcbiAgICAgICAgbmFtZTogcD8ubmFtZSA/PyBwPy5pdGVtX25hbWUsXG4gICAgICAgIGl0ZW1fbmFtZTogcD8ubmFtZSA/PyBwPy5pdGVtX25hbWUsXG4gICAgICAgIHByb2dyYW1JZDogcD8uaWQgPz8gcD8ucHJvZ3JhbUlkLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGNoaXBzKTtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgLi4udGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcbiAgICAgIF07XG4gICAgICBjb25zdCBtYXAgPSBidWlsZFByb2dyYW1TZWxlY3Rpb25NYXBGcm9tQ2F0ZWdvcmllcyhcbiAgICAgICAgY2hpcHMsXG4gICAgICAgIHRoaXMuYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcbiAgICAgICk7XG4gICAgICBpZiAoT2JqZWN0LmtleXMobWFwKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb2dyYW1zID0gbWFwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbSA9IGRhdGE/LnByb2dyYW0gPz8ge307XG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSBnZXRTZWxlY3RlZFByb2dyYW1zTWFwKGRhdGEpO1xuICAgIGlmIChzZWxlY3RlZE1hcCAmJiBoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAoc2VsZWN0ZWRNYXApKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChzZWxlY3RlZE1hcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9ncmFtcyA9IHByb2dyYW0/LmFsbF9wcm9ncmFtcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhbGxQcm9ncmFtcykgJiYgYWxsUHJvZ3JhbXMubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIGFsbFByb2dyYW1zWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBtYXAgPSBidWlsZFByb2dyYW1TZWxlY3Rpb25NYXBGcm9tQ2F0ZWdvcmllcyhcbiAgICAgICAgICBhbGxQcm9ncmFtcyxcbiAgICAgICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAobWFwKSkge1xuICAgICAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGFsbFByb2dyYW1zKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xuICAgICAgICAgIC4uLnRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQsXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLmFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2F0ZWdvcnlJZHMgPSBleHRyYWN0Q2F0ZWdvcnlJZHNGcm9tRGFzaGJvYXJkKGRhdGEpO1xuICAgIGlmIChjYXRlZ29yeUlkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHN0dWJzID0gY2F0ZWdvcnlJZHMubWFwKChpZCkgPT4gKHtcbiAgICAgICAgY2F0ZWdvcnlfaWQ6IGlkLFxuICAgICAgICBpZCxcbiAgICAgICAgaXRlbV9uYW1lOiBgQ2F0ZWdvcnkgJHtpZH1gLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKHN0dWJzKTtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgLi4udGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcbiAgICAgIF07XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZsYXRQcm9ncmFtQ2F0ZWdvcmllcyhjYXRlZ29yaWVzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghY2F0ZWdvcmllcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSBub3JtYWxpemVQcm9ncmFtQ2F0ZWdvcmllcyhjYXRlZ29yaWVzKTtcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPSBbXG4gICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxuICAgIF07XG4gICAgY29uc3QgbWFwID0gYnVpbGRQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUNhdGVnb3JpZXMoXG4gICAgICBjYXRlZ29yaWVzLFxuICAgICAgdGhpcy5hbGxDb21wbGlhbmNlQ2F0ZWdvcmllc1xuICAgICk7XG4gICAgaWYgKGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChtYXApKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBtYXA7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlSZXNwb25zaWJpbGl0eUNhdGVnb3J5V2lkZ2V0RmlsdGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXG4gICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb3BlbkZyb21EYXRlUGlja2VyKCkge1xuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICdGUk9NX0RBVEUnO1xuXG4gICAgdGhpcy5mcm9tRGF0ZVBpY2tlcj8uYXBpPy5vcGVuKCk7XG4gICAgdGhpcy5kYXRlUGlja2VyT3ZlcmxheSA9IHRydWU7XG4gIH1cblxuICBvcGVuVG9EYXRlUGlja2VyKCkge1xuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICdUT19EQVRFJztcblxuICAgIHRoaXMudG9EYXRlUGlja2VyPy5hcGk/Lm9wZW4oKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VGcm9tRGF0ZVBpY2tlcigpIHtcbiAgICB0aGlzLmZyb21EYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XG4gICAgaWYgKCF0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSkge1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5oaWRlVG9EYXRlID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGVUb0RhdGUgPSBmYWxzZTtcbiAgICAgIH0sIDIwKTtcbiAgICAgIHRoaXMuZnJvbURhdGVQaWNrZXIuYXBpLmNsb3NlKCk7XG4gICAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5Ub0RhdGUgPSB0aGlzLnNldFRvRGF0ZSh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSk7XG4gICAgdGhpcy50b0RhdGVQaWNrZXJDb25maWcgPSB7IG1pbjogbWluVG9EYXRlIH07XG5cbiAgICBjb25zdCBmcm9tRGF0ZSA9IG5ldyBEYXRlKG1pblRvRGF0ZS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCctJykpO1xuICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZSk7XG4gICAgY29uc3QgaW5WYWxpZERhdGUgPSBmcm9tRGF0ZSA+PSB0b0RhdGUgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKGluVmFsaWREYXRlKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRUb0RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmhpZGVUb0RhdGUgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVRvRGF0ZSA9IGZhbHNlO1xuICAgICAgfSwgMjApO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlVG9EYXRlUGlja2VyKCkge1xuICAgIHRoaXMudG9EYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XG4gICAgdGhpcy5kYXRlUGlja2VyT3ZlcmxheSA9IGZhbHNlO1xuICB9XG5cbiAgYW5pbWF0ZUltYWdlKCkge1xuICAgIGNvbnN0IGNpcmNsZUltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW1hZ2UnKTtcbiAgfVxuXG4gIHNhdmVGcmVxdWVuY3koZXZlbnRWYWx1ZXM6IGFueSkge1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyZXF1ZW5jeVR5cGUgPSBldmVudFZhbHVlcy5mcmVxdWVuY3lUeXBlO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyZXF1ZW5jaWVzID0gZXZlbnRWYWx1ZXMuZnJlcXVlbmNpZXM7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2UgPSBldmVudFZhbHVlcy5mcmVxdWVuY3lTdHJpbmc7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeURhdGUgPSBldmVudFZhbHVlcy5zZWxlY3RlZERhdGU7XG4gICAgdGhpcy5hY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSk7XG4gIH1cblxuICBnZXRDdXJyZW50RGF0ZSgpIHtcbiAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBkYXlqcyh0b2RheSkuZm9ybWF0KCdERC1NTS1ZWVlZJyk7XG4gIH1cblxuICBzZXRUb0RhdGUoZGF0YTogc3RyaW5nKSB7XG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgcmV0dXJuIGRheWpzKHRvZGF5KS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcbiAgfVxuXG4gIGdldEZyb21EYXRlKGRhdGE6IHN0cmluZykge1xuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKGRhdGEpO1xuICAgIHJldHVybiAoXG4gICAgICB0b2RheS5nZXREYXRlKCkgKyAnLScgKyAodG9kYXkuZ2V0TW9udGgoKSArIDEpICsgJy0nICsgdG9kYXkuZ2V0RnVsbFllYXIoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRhdGEgLSB0aGUgZGF0ZSB5b3Ugd2FudCB0byBmb3JtYXRcbiAgICogQHJldHVybnMgRGF0ZSBzdHJpbmcgaW4gWVlZWS1NTS1ERCBmb3JtYXQsIGUuZy4gMjAyNi0wNS0xOVxuICAgKi9cbiAgZ2V0RGF0ZUZvcm1hdGUoZGF0YTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRheWpzKGRhdGEpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICB9XG5cblxuICBjb25maWd1cmVEYXNoYm9hcmQoKSB7XG4gICAgbGV0IGZpZWxkc1N0YXR1cyA9IHRoaXMudmFsaWRhdGVEYXNoYm9hcmQoKTtcbiAgICBpZiAoIWZpZWxkc1N0YXR1cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMub25TdWJtaXREYXNoYm9hcmQoKTtcbiAgXG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBsaXN0IGJ5IG1ha2luZyBhcGkgY2FsbCBhbmQgcHJlIHNlbGVjdHMgYWxsIGFkbWlucyBieSBhZGRpbmcgdG8gdmlld2Vyc1xuICAgKiBAcGFyYW0gdXJsIGNvbnRhaW5zIHF1ZXJ5IHBhcmFtcyBmb3Igb3JnYW5pemF0aW9uIHVzZXJzIGFwaVxuICAgKi9cbiAgZ2V0VXNlcnNMaXN0KHVybDogYW55KSB7XG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldEFsbFVzZXJzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy51c2Vyc0xpc3QgPSByZXM7XG4gICAgICB0aGlzLnVzZXJMaXN0TG9hZGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy5zZXRMaXN0KFxuICAgICAgICAgIHRoaXMudXNlcnNMaXN0LFxuICAgICAgICAgIFt0aGlzLmNyZWF0ZWRCeV0sXG4gICAgICAgICAgJ21lbWJlcl9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZFVzZXJzTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnM7XG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0R3JvdXBMaXN0KCkge1xuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRBbGxHcm91cHMoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnRvdGFsZ3JvdXBzID0gcmVzLnRvdGFsX2l0ZW1zO1xuICAgICAgdGhpcy5ncm91cExpc3QgPSByZXMuZGF0YTtcbiAgICAgIHRoaXMuZ3JvdXBMaXN0TG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAgPSB0aGlzLnNldExpc3QoXG4gICAgICAgICAgdGhpcy5ncm91cExpc3QsXG4gICAgICAgICAgW3RoaXMuY3JlYXRlZEJ5XSxcbiAgICAgICAgICAnZ3JvdXBfaWQnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGlzdERldGFpbHMuc2VsZWN0ZWRHcm91cExpc3QgPSB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cDtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJdCBpcyB0byBlbnN1cmUgd2hldGhlciBhbGwgcmVxdWlyZWQgbGlzdHMgb24gUG9saWN5IGZyb20gaXMgbG9hZGVkIGZyb20gdGhlIGFwaSBjYWxsIG9yIG5vdFxuICAgKi9cbiAgY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKSB7XG4gICAgLy8gQ2F0ZWdvcnkgdHJlZXMgYXJlIG5vIGxvbmdlciBlYWdlcmx5IGxvYWRlZCBoZXJlOyB0aGVzZSBmbGFncyB3ZXJlIG5ldmVyIGZsaXBwZWQgYW5kIGJsb2NrZWQgRURJVCBpbmRlZmluaXRlbHkuXG4gICAgaWYgKHRoaXMucmNMaXN0TG9hZGVkICYmIHRoaXMudXNlckxpc3RMb2FkZWQgJiYgdGhpcy5ncm91cExpc3RMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgICB0aGlzLmh5ZHJhdGVFZGl0Rm9ybSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrV2hldGhlckFsbExpc3RzTG9hZGVkKCk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGVkV2lkZ2V0cyhkYXRhOiBhbnkpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnQ1JFQVRFJykge1xuICAgICAgY29uc3Qgd2lkZ2V0c0FycmF5OiBhbnkgPSBbXTtcbiAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xuICAgICAgICBvYmoubW9kdWxlX25hbWUgPSBlbGVtZW50Lm1vZHVsZTtcbiAgICAgICAgb2JqLndpZGdldF9uYW1lID0gZWxlbWVudC50aXRsZTtcbiAgICAgICAgb2JqLndpZGdldF9jb2RlID0gZWxlbWVudC5pZDtcbiAgICAgICAgb2JqLnN1Yl93aWRnZXRzID0gW107XG4gICAgICAgIG9iai5zdGF0ZSA9ICdBQ1RJVkUnO1xuICAgICAgICBpZiAoZWxlbWVudC5zdWJXaWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlbGVtZW50LnN1YldpZGdldHMuZm9yRWFjaCgoc3ViV2lkZ2V0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBzdWJXaWRnZXRPYmplY3Q6IGFueSA9IHt9O1xuICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LndpZGdldF9uYW1lID0gc3ViV2lkZ2V0LnRpdGxlO1xuICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LndpZGdldF9jb2RlID0gc3ViV2lkZ2V0LmlkO1xuICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LnN0YXRlID0gc3ViV2lkZ2V0LnZhbHVlID8gJ0FDVElWRScgOiAnSU5BQ1RJVkUnO1xuICAgICAgICAgICAgb2JqLnN1Yl93aWRnZXRzLnB1c2goT2JqZWN0LmFzc2lnbihzdWJXaWRnZXRPYmplY3QpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB3aWRnZXRzQXJyYXkucHVzaChvYmopO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQgPSB3aWRnZXRzQXJyYXk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgY29uc3Qgd2lkZ2V0c0FycmF5OiBhbnkgPSBbXTtcblxuICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmV4dHJhY3RXaWRnZXRDb2Rlcyh0aGlzLmRhc2hib2FyZEZvcm0uY29uZmlndXJlV2lkZ2V0KS5pbmNsdWRlcyhcbiAgICAgICAgICAgIGVsZW1lbnQuaWRcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xuICAgICAgICAgIG9iai5tb2R1bGVfbmFtZSA9IGVsZW1lbnQubW9kdWxlO1xuICAgICAgICAgIG9iai5faWQgPSAnJztcbiAgICAgICAgICBvYmoud2lkZ2V0X25hbWUgPSBlbGVtZW50LnRpdGxlO1xuICAgICAgICAgIG9iai53aWRnZXRfY29kZSA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgb2JqLnN1Yl93aWRnZXRzID0gW107XG4gICAgICAgICAgb2JqLnN0YXRlID0gJ0FDVElWRSc7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuc3ViV2lkZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN1YldpZGdldHMuZm9yRWFjaCgoc3ViV2lkZ2V0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHN1YldpZGdldE9iamVjdDogYW55ID0ge307XG4gICAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC5faWQgPSAnJztcbiAgICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LndpZGdldF9uYW1lID0gc3ViV2lkZ2V0LnRpdGxlO1xuICAgICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X2NvZGUgPSBzdWJXaWRnZXQuaWQ7XG4gICAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC5zdGF0ZSA9IHN1YldpZGdldC52YWx1ZSA/ICdBQ1RJVkUnIDogJ0lOQUNUSVZFJztcbiAgICAgICAgICAgICAgb2JqLnN1Yl93aWRnZXRzLnB1c2goc3ViV2lkZ2V0T2JqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uY29uZmlndXJlV2lkZ2V0LnB1c2gob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChlbGU6IGFueSkgPT4gZWxlLndpZGdldF9jb2RlID09IGVsZW1lbnQuaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHNbaW5kZXhdLnN0YXRlID0gJ0FDVElWRSc7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFdpZGdldHNbaW5kZXhdLnN1Yl93aWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHNbaW5kZXhdLnN1Yl93aWRnZXRzLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKHN1YldpZGdldERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gZWxlbWVudC5zdWJXaWRnZXRzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgKGVsZTogYW55KSA9PiBlbGUuaWQgPT0gc3ViV2lkZ2V0RGF0YS53aWRnZXRfY29kZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50SW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViV2lkZ2V0RGF0YS5zdGF0ZSA9IGVsZW1lbnQuc3ViV2lkZ2V0c1tlbGVtZW50SW5kZXhdLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPyAnQUNUSVZFJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ0lOQUNUSVZFJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQuZm9yRWFjaCgoc2F2ZWRXaWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IGRhdGEuZmluZEluZGV4KFxuICAgICAgICAgIChkYXRhRWxlbWVudDogYW55KSA9PiBkYXRhRWxlbWVudC5pZCA9PSBzYXZlZFdpZGdldC53aWRnZXRfY29kZVxuICAgICAgICApO1xuICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHtcbiAgICAgICAgICBzYXZlZFdpZGdldC5zdGF0ZSA9ICdJTkFDVElWRSc7XG4gICAgICAgICAgaWYgKHNhdmVkV2lkZ2V0LnN1Yl93aWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNhdmVkV2lkZ2V0LnN1Yl93aWRnZXRzLmZvckVhY2goKHNhdmVTdWJXaWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBzYXZlU3ViV2lkZ2V0LnN0YXRlID0gJ0lOQUNUSVZFJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gZGF0YTtcbiAgICB0aGlzLm9wZW5Db25maWd1cmVXaWRnZXRzID0gZmFsc2U7XG4gICAgdGhpcy5zdWJtaXREYXNoYm9hcmQoKTtcbiAgfVxuXG4gIGV4dHJhY3RXaWRnZXRDb2Rlcyh3aWRnZXRzOiBhbnlbXSkge1xuICAgIGNvbnN0IHdpZGdldENvZGVzOiBhbnlbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cz8uZm9yRWFjaCgod2lkZ2V0OiBhbnkpID0+IHtcbiAgICAgIGlmICh3aWRnZXQ/LndpZGdldF9jb2RlKSB7XG4gICAgICAgIHdpZGdldENvZGVzLnB1c2god2lkZ2V0Py53aWRnZXRfY29kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0Q29kZXM7XG4gIH1cblxuICBjbG9zZUNvbmZpZ3VyZVdpZGdldHMoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wZW5Db25maWd1cmVXaWRnZXRzID0gZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGxpc3QgdXNlcidzIGxpc3QgYmFzZWQgb24gcGFnaW5hdGlvbiBieSBtYWtpbmcgYXBpIGNhbGxcbiAgICogQHBhcmFtIGV2ZW50IHNwZWNpZmllcyBhIGJvb2xlYW4gdmFsdWUgdG8gY2FsbCBhcGlcbiAgICovXG4gIHBhZ2luYXRpb25GaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5nZXRVc2Vyc0xpc3Qoe1xuICAgICAgICBwOlxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuY3VycmVudFBhZ2UgPT09IDFcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogdGhpcy5wYWdpbmF0aW9uU2VydmljZS5jdXJyZW50UGFnZSxcbiAgICAgICAgdHlwZTogJ2FsbF9leGNlcHRfZXhlY3V0aXZlJyxcbiAgICAgICAgcTogIXRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2VhcmNoVmFsdWVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnNlYXJjaFZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UkNMaXN0KCkge1xuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRSZXNwb25zaWJpbGl0eUNlbnRlckxpc3QoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0ID0gdGhpcy5ub3JtYWxpemVSY0xpc3QocmVzKTtcbiAgICAgICAgdGhpcy5yY0xpc3RMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1Jlc3BvbnNpYmlsaXR5Q2VudGVycygpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcpIHtcbiAgICAgICAgICB0aGlzLnNhdmVTZWxlY3RlZExpc3QoJ3JjJywgdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5yZXNwb25zaWJpbGl0eUNlbnRlcnMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5yY0xpc3RMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1Jlc3BvbnNpYmlsaXR5Q2VudGVycygpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqICMjIyMgRGVzY3JpcHRpb25cbiAgICpcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGFycmF5IG9mIG9iamVjdCBiYXNlZCBvbiB1bmlxdWUga2V5XG4gICAqIEBwYXJhbSBhcnJheVxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bmlxdWVCeVByb3AoYXJyYXk6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIGFycmF5XG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYzogYW55LCBpdGVtOiBhbnkpID0+IChcbiAgICAgICAgICAgIGl0ZW0gJiYgaXRlbVtrZXldICYmIGFjYy5zZXQoaXRlbVtrZXldLCBpdGVtKSwgYWNjXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgTWFwKClcbiAgICAgICAgKVxuICAgICAgICAudmFsdWVzKClcbiAgICApO1xuICB9XG5cbiAgc2F2ZVNlbGVjdGVkTGlzdCh0eXBlOiBzdHJpbmcsIHNlbGVjdGVkSXRlbXM6IGFueSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAncmMnOlxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMgPSB0aGlzLnNldExpc3QoXG4gICAgICAgICAgdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0LFxuICAgICAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICAgICAgJ2l0ZW1faWQnXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnQ09NUExJQU5DRSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ1JJU0snXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dob0NhblZpZXcnOlxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy51bmlxdWVCeVByb3AoXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz8udXNlcnMsXG4gICAgICAgICAgJ21lbWJlcl9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZFVzZXJzTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnM7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwID0gdGhpcy51bmlxdWVCeVByb3AoXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz8uZ3JvdXBzLFxuICAgICAgICAgICdncm91cF9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZEdyb3VwTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyc6XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9XG4gICAgICAgICAgbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpXG4gICAgICAgICAgICAgID8gc2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgICA6IGZsYXR0ZW5Qcm9ncmFtU2VsZWN0aW9uTWFwKHNlbGVjdGVkSXRlbXMgPz8ge30pXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hcHBseVJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnlXaWRnZXRGaWx0ZXJzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlza0NhdGVnb3J5JzpcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMgPSBzZWxlY3RlZEl0ZW1zO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdSSVNLJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlKHR5cGU6IGFueSwgZXZlbnQ6IGFueSwgcmVtb3ZlSW5kZXg/OiBhbnkpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3JjJzpcbiAgICAgICAgY29uc3QgcmNJbmRleCA9XG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChyYzogYW55KSA9PiByYy5yY19pZCA9PSBldmVudC5yY19pZFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChyY0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudFJjOiBhbnkgPVxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzW3JjSW5kZXhdO1xuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5zcGxpY2UocmNJbmRleCwgMSk7XG5cbiAgICAgICAgICBpZiAocGFyZW50UmM/Lml0ZW1fY2hpbGRfaWRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXJlbnRSYy5pdGVtX2NoaWxkX2lkcy5mb3JFYWNoKChjaGlsZEVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZW1vdmVJbmRleCA9XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgIChyZW1vdmVFbGVtZW50OiBhbnkpID0+IHJlbW92ZUVsZW1lbnQucmNfaWQgPT0gY2hpbGRFbGVtZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLnNwbGljZShcbiAgICAgICAgICAgICAgICByZW1vdmVJbmRleCxcbiAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdDT01QTElBTkNFJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd3aG9DYW5WaWV3JzpcbiAgICAgICAgY29uc3QgcmV2aWV3ZXJJbmRleCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnMuZmluZEluZGV4KFxuICAgICAgICAgICh2aWV3ZXI6IGFueSkgPT4gdmlld2VyLm1lbWJlcl9pZCA9PSBldmVudC5tZW1iZXJfaWRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2Vycy5zcGxpY2UocmV2aWV3ZXJJbmRleCwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2hvQ2FuVmlld0dyb3VwJzpcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgIChlbGU6IGFueSkgPT4gZWxlPy5ncm91cF9pZCA9PSBldmVudD8uZ3JvdXBfaWRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAuc3BsaWNlKGdyb3VwcywgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJzpcbiAgICAgICAgdGhpcy5jaGVja0RlZmF1bHRQcm9ncmFtT25SZW1vdmUoZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlza0NhdGVnb3J5JzpcbiAgICAgICAgY29uc3Qgcmlza0NhdGVnb3J5SW5kZXggPVxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChyaXNrQ2F0ZWdvcnk6IGFueSkgPT4gcmlza0NhdGVnb3J5LmNhdGVnb3J5X2lkID09IGV2ZW50LmNhdGVnb3J5X2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHJpc2tDYXRlZ29yeUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudDogYW55ID1cbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzW3Jpc2tDYXRlZ29yeUluZGV4XTtcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5zcGxpY2UoXG4gICAgICAgICAgICByaXNrQ2F0ZWdvcnlJbmRleCxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnQ/LmNoaWxkX2NhdF9pZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZF9jYXRfaWRzLmZvckVhY2goKGNoaWxkRWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID1cbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlRWxlbWVudDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50LmNhdGVnb3J5X2lkID09IGNoaWxkRWxlbWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMuc3BsaWNlKHJpc2tDYXRlZ29yeUluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdDT01QTElBTkNFJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNldExpc3QobGlzdDogYW55W10sIGlkczogYW55W10sIGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGlzdEJ5SWRzKGxpc3QsIGlkcywgW2tleV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMaXN0QnlJZHMobGlzdDogYW55W10sIGlkczogYW55W10sIGtleXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgZGF0YTogYW55W10gPSBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkgfHwgIUFycmF5LmlzQXJyYXkoaWRzKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWRzLmZvckVhY2goKGlkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldElkID0gTnVtYmVyKGlkKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odGFyZ2V0SWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAobGlzdEVsZW1lbnQ6IGFueSkgPT5cbiAgICAgICAgICAgIE51bWJlcihsaXN0RWxlbWVudD8uW2tleV0pID09PSB0YXJnZXRJZFxuICAgICAgICApO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZGF0YS5wdXNoKGxpc3RbaW5kZXhdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuUmNUcmVlKG5vZGVzOiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgZmxhdDogYW55W10gPSBbXTtcbiAgICBjb25zdCB3YWxrID0gKGFycjogYW55W10pID0+IHtcbiAgICAgIChhcnIgPz8gW10pLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmbGF0LnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgd2Fsayhub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLml0ZW1zKSkge1xuICAgICAgICAgIHdhbGsobm9kZS5pdGVtcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpIHtcbiAgICAgIHdhbGsobm9kZXMpO1xuICAgICAgcmV0dXJuIGZsYXQubGVuZ3RoID8gZmxhdCA6IG5vZGVzO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2Rlcz8uZGF0YSkpIHtcbiAgICAgIHdhbGsobm9kZXMuZGF0YSk7XG4gICAgICByZXR1cm4gZmxhdDtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVSY0xpc3QobGlzdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5mbGF0dGVuUmNUcmVlKGxpc3QpO1xuICAgIHJldHVybiBpdGVtcy5tYXAoKHJjOiBhbnkpID0+ICh7XG4gICAgICAuLi5yYyxcbiAgICAgIHJjaWQ6IHJjPy5yY2lkID8/IHJjPy5yY19pZCA/PyByYz8uaXRlbV9pZCxcbiAgICAgIGl0ZW1faWQ6IHJjPy5pdGVtX2lkID8/IHJjPy5yY19pZCA/PyByYz8ucmNpZCxcbiAgICAgIGl0ZW1fbmFtZTpcbiAgICAgICAgcmM/Lml0ZW1fbmFtZSA/P1xuICAgICAgICByYz8uaXRlbV9uYW1lX3N0cmluZyA/P1xuICAgICAgICAoQXJyYXkuaXNBcnJheShyYz8ucmNfbmFtZSkgPyByYy5yY19uYW1lLmpvaW4oJyA8ICcpIDogcmM/LnJjX25hbWUpID8/XG4gICAgICAgICcnLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVJjRnJvbVRyZWUodHJlZTogYW55W10sIGlkczogbnVtYmVyW10pOiBhbnlbXSB7XG4gICAgaWYgKCFpZHMubGVuZ3RoIHx8ICF0cmVlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldElkID0gTnVtYmVyKGlkKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHJlZS5maW5kKFxuICAgICAgICAocmMpID0+XG4gICAgICAgICAgTnVtYmVyKHJjPy5pdGVtX2lkKSA9PT0gdGFyZ2V0SWQgfHxcbiAgICAgICAgICBOdW1iZXIocmM/LnJjX2lkKSA9PT0gdGFyZ2V0SWQgfHxcbiAgICAgICAgICBOdW1iZXIocmM/LnJjaWQpID09PSB0YXJnZXRJZCB8fFxuICAgICAgICAgIE51bWJlcihyYz8uaWQpID09PSB0YXJnZXRJZCB8fFxuICAgICAgICAgIHJjPy5pdGVtX2NoaWxkX2lkcz8uc29tZSgoY2hpbGRJZDogYW55KSA9PiBOdW1iZXIoY2hpbGRJZCkgPT09IHRhcmdldElkKSB8fFxuICAgICAgICAgIHJjPy5pdGVtX3BhcmVudF9pZHM/LnNvbWUoKHBhcmVudElkOiBhbnkpID0+IE51bWJlcihwYXJlbnRJZCkgPT09IHRhcmdldElkKVxuICAgICAgKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gTnVtYmVyKG1hdGNoPy5pdGVtX2lkID8/IG1hdGNoPy5yY19pZCA/PyBtYXRjaD8ucmNpZCA/PyBpZCk7XG4gICAgICBpZiAoIXNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgc2VsZWN0ZWQucHVzaChtYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVByZXJlc29sdmVkUmNFbnRyaWVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5wZW5kaW5nRWRpdFJjRW50cmllcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHRyZWUgPSB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QgPz8gW107XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnBlbmRpbmdFZGl0UmNFbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJjaWQgPSBOdW1iZXIoZW50cnk/LnJjaWQgPz8gZW50cnk/LnJjX2lkID8/IGVudHJ5Py5pdGVtX2lkKTtcbiAgICAgIGNvbnN0IGZyb21UcmVlID1cbiAgICAgICAgdHJlZS5maW5kKChyYykgPT4gTnVtYmVyKHJjPy5pdGVtX2lkKSA9PT0gcmNpZCkgPz9cbiAgICAgICAgdHJlZS5maW5kKChyYykgPT4gTnVtYmVyKHJjPy5yY2lkKSA9PT0gcmNpZCkgPz9cbiAgICAgICAgdHJlZS5maW5kKChyYykgPT4gTnVtYmVyKHJjPy5yY19pZCkgPT09IHJjaWQpO1xuICAgICAgcmV0dXJuIGZyb21UcmVlID8geyAuLi5mcm9tVHJlZSB9IDogeyAuLi5lbnRyeSB9O1xuICAgIH0pO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycyA9IHNlbGVjdGVkO1xuICAgIHRoaXMucGVuZGluZ0VkaXRSY0lkcyA9IHNlbGVjdGVkLm1hcCgocmMpID0+XG4gICAgICBOdW1iZXIocmM/LnJjaWQgPz8gcmM/LnJjX2lkID8/IHJjPy5pdGVtX2lkKVxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UGVuZGluZ1Jlc3BvbnNpYmlsaXR5Q2VudGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hcHBseVByZXJlc29sdmVkUmNFbnRyaWVzKCkpIHtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJjTGlzdExvYWRlZCB8fCAhdGhpcy5wZW5kaW5nRWRpdFJjSWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLnNldExpc3RCeUlkcyhcbiAgICAgIHRoaXMucmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdCxcbiAgICAgIHRoaXMucGVuZGluZ0VkaXRSY0lkcyxcbiAgICAgIFsnaXRlbV9pZCcsICdyY2lkJywgJ3JjX2lkJywgJ2lkJ11cbiAgICApO1xuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPCB0aGlzLnBlbmRpbmdFZGl0UmNJZHMubGVuZ3RoKSB7XG4gICAgICBzZWxlY3RlZCA9IHRoaXMucmVzb2x2ZVJjRnJvbVRyZWUoXG4gICAgICAgIHRoaXMucmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdCxcbiAgICAgICAgdGhpcy5wZW5kaW5nRWRpdFJjSWRzXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMgPSBzZWxlY3RlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGJlZ2luRWRpdEh5ZHJhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnRURJVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQrKztcbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hFZGl0SHlkcmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdFRElUJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRIeWRyYXRpb25Db3VudCA9IE1hdGgubWF4KDAsIHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50IC0gMSk7XG4gICAgaWYgKHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyeUNvbXBsZXRlRWRpdEh5ZHJhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcgJiYgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgPT09IDApIHtcbiAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd3JhcEVkaXRSZXF1ZXN0PFQ+KFxuICAgIHJlcXVlc3QkOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG9uTmV4dDogKHZhbHVlOiBUKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgdGhpcy5iZWdpbkVkaXRIeWRyYXRpb24oKTtcbiAgICB9XG4gICAgcmVxdWVzdCRcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuZmluaXNoRWRpdEh5ZHJhdGlvbigpKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBvbk5leHQsXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVyciksXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Byb2dyYW1zRm9yRWRpdChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oeWRyYXRlUHJvZ3JhbXNGcm9tRGFzaGJvYXJkRGF0YShkYXRhKTtcbiAgICB0aGlzLmFwcGx5UHJvZ3JhbXNGcm9tRGFzaGJvYXJkSWRzKFxuICAgICAgZXh0cmFjdFByb2dyYW1JZHNGcm9tRGFzaGJvYXJkKGRhdGEpLFxuICAgICAgZXh0cmFjdENhdGVnb3J5SWRzRnJvbURhc2hib2FyZChkYXRhKSxcbiAgICAgIGdldFNlbGVjdGVkUHJvZ3JhbXNNYXAoZGF0YSksXG4gICAgICBkYXRhPy5wcm9ncmFtXG4gICAgKTtcbiAgICBjb25zdCBjYXRlZ29yeUlkcyA9IGV4dHJhY3RDYXRlZ29yeUlkc0Zyb21EYXNoYm9hcmQoZGF0YSk7XG4gICAgaWYgKGNhdGVnb3J5SWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgZnJvbUNvbXBsaWFuY2UgPSB0aGlzLnNldExpc3QoXG4gICAgICAgIHRoaXMuYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXMsXG4gICAgICAgIGNhdGVnb3J5SWRzLFxuICAgICAgICAnY2F0ZWdvcnlfaWQnXG4gICAgICApO1xuICAgICAgaWYgKGZyb21Db21wbGlhbmNlLmxlbmd0aCAmJiAhdGhpcy5hbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hcHBseUZsYXRQcm9ncmFtQ2F0ZWdvcmllcyhmcm9tQ29tcGxpYW5jZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgICF0aGlzLmFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCAmJlxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IFtcbiAgICAgICAgLi4udGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLFxuICAgICAgXTtcbiAgICB9XG4gICAgdGhpcy5zeW5jUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21Gb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UHJvZ3JhbXNGcm9tRGFzaGJvYXJkSWRzKFxuICAgIHByb2dyYW1JZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5SWRzOiBudW1iZXJbXSxcbiAgICBzZWxlY3RlZFByb2dyYW1zTWFwPzogUmVjb3JkPHN0cmluZywgYW55W10+LFxuICAgIHByb2dyYW1QYXlsb2FkPzogeyBhbGxfcHJvZ3JhbXM/OiBhbnlbXTsgc2VsZWN0ZWRfcHJvZ3JhbXM/OiBhbnkgfVxuICApOiB2b2lkIHtcbiAgICBpZiAoY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvYWRQcm9ncmFtc0ZvckVkaXQoXG4gICAgICAgIHByb2dyYW1JZHMsXG4gICAgICAgIGNhdGVnb3J5SWRzLFxuICAgICAgICBzZWxlY3RlZFByb2dyYW1zTWFwLFxuICAgICAgICBwcm9ncmFtUGF5bG9hZFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByb2dyYW1JZHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc29sdmVQcm9ncmFtSWRzRm9yRWRpdChwcm9ncmFtSWRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVByb2dyYW1TZWxlY3Rpb25NYXBGb3JMaXN0KCk6IHZvaWQge1xuICAgIGlmIChoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAodGhpcy5zZWxlY3RlZFByb2dyYW1zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYXRlZ29yeUlkcyA9IG5vcm1hbGl6ZUlkQXJyYXkoXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXM/Lm1hcChcbiAgICAgICAgKGM6IGFueSkgPT4gYz8uY2F0ZWdvcnlfaWQgPz8gYz8uaWRcbiAgICAgICkgPz8gW11cbiAgICApO1xuICAgIGNvbnN0IHByb2dyYW1JZHMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID8/IFtdKS5tYXAoXG4gICAgICAgICAgKGM6IGFueSkgPT4gTnVtYmVyKGM/LnByb2dyYW1JZCA/PyBjPy5wcm9ncmFtX2lkID8/IGM/LnBhcmVudElkKVxuICAgICAgICApXG4gICAgICApLFxuICAgIF0uZmlsdGVyKChpZCkgPT4gIU51bWJlci5pc05hTihpZCkpO1xuICAgIGlmIChwcm9ncmFtSWRzLmxlbmd0aCB8fCBjYXRlZ29yeUlkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9hZFByb2dyYW1zRm9yRWRpdChwcm9ncmFtSWRzLCBjYXRlZ29yeUlkcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVByb2dyYW1TZWxlY3Rpb25NYXAobWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4pOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJvZ3JhbVNlbGVjdGlvbk1hcChtYXApO1xuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBub3JtYWxpemVkO1xuICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSBmbGF0dGVuUHJvZ3JhbVNlbGVjdGlvbk1hcCh0aGlzLnNlbGVjdGVkUHJvZ3JhbXMpO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9XG4gICAgICBub3JtYWxpemVQcm9ncmFtQ2F0ZWdvcmllcyh0aGlzLmFsbFByb2dhbVNlbGVjdGVkKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGNhdGVnb3J5TWF0Y2hlc0lkKGNhdDogYW55LCBjYXRlZ29yeUlkU2V0OiBTZXQ8bnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gTnVtYmVyKGNhdD8uaWQpO1xuICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBOdW1iZXIoY2F0Py5jYXRlZ29yeV9pZCk7XG4gICAgcmV0dXJuIChcbiAgICAgICghTnVtYmVyLmlzTmFOKGlkKSAmJiBjYXRlZ29yeUlkU2V0LmhhcyhpZCkpIHx8XG4gICAgICAoIU51bWJlci5pc05hTihjYXRlZ29yeUlkKSAmJiBjYXRlZ29yeUlkU2V0LmhhcyhjYXRlZ29yeUlkKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUHJvZ3JhbXNGb3JFZGl0KFxuICAgIHByb2dyYW1JZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5SWRzOiBudW1iZXJbXSA9IFtdLFxuICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXA/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4sXG4gICAgcHJvZ3JhbVBheWxvYWQ/OiB7IGFsbF9wcm9ncmFtcz86IGFueVtdOyBzZWxlY3RlZF9wcm9ncmFtcz86IGFueSB9XG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXAgJiZcbiAgICAgIHR5cGVvZiBzZWxlY3RlZFByb2dyYW1zTWFwID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWRQcm9ncmFtc01hcCkgJiZcbiAgICAgIGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChzZWxlY3RlZFByb2dyYW1zTWFwKVxuICAgICkge1xuICAgICAgdGhpcy5hcHBseVByb2dyYW1TZWxlY3Rpb25NYXAoc2VsZWN0ZWRQcm9ncmFtc01hcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvZ3JhbVBheWxvYWQgJiZcbiAgICAgIHRoaXMuaHlkcmF0ZVByb2dyYW1zRnJvbURhc2hib2FyZERhdGEoeyBwcm9ncmFtOiBwcm9ncmFtUGF5bG9hZCB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbUlkcy5sZW5ndGggJiYgIWNhdGVnb3J5SWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbiA9ICgpID0+IHRoaXMuZmluaXNoRWRpdEh5ZHJhdGlvbigpO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgdGhpcy5iZWdpbkVkaXRIeWRyYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuZ2V0U2FpbHNQcm9ncmFtTGlzdCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbXMgPSBwYXJzZVNhaWxzUHJvZ3JhbUxpc3QocmVzKTtcbiAgICAgICAgY29uc3QgcmVsZXZhbnRQcm9ncmFtcyA9XG4gICAgICAgICAgcHJvZ3JhbUlkcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHByb2dyYW1zLmZpbHRlcigocDogYW55KSA9PiBwcm9ncmFtSWRzLmluY2x1ZGVzKE51bWJlcihwPy5pZCkpKVxuICAgICAgICAgICAgOiBwcm9ncmFtcztcblxuICAgICAgICBpZiAoIWNhdGVnb3J5SWRzLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChwcm9ncmFtSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlUHJvZ3JhbUlkc0ZvckVkaXQocHJvZ3JhbUlkcywgcHJvZ3JhbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wbGV0ZVByb2dyYW1IeWRyYXRpb24oKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXRlZ29yeUlkU2V0ID0gbmV3IFNldChjYXRlZ29yeUlkcyk7XG4gICAgICAgIGNvbnN0IHByb2dyYW1zVG9GZXRjaCA9XG4gICAgICAgICAgcmVsZXZhbnRQcm9ncmFtcy5sZW5ndGggPiAwID8gcmVsZXZhbnRQcm9ncmFtcyA6IHByb2dyYW1zO1xuXG4gICAgICAgIGlmICghcHJvZ3JhbXNUb0ZldGNoLmxlbmd0aCkge1xuICAgICAgICAgIGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5UmVxdWVzdHMgPSBwcm9ncmFtc1RvRmV0Y2gubWFwKChwcm9ncmFtOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldFByb2dyYW1DYXRlZ29yaWVzKHByb2dyYW0uaWQpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGNhdFJlczogYW55KSA9PiAoe1xuICAgICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBjYXRSZXM/LmRhdGE/LmNhdGVnb3JpZXMgPz8gY2F0UmVzPy5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBmb3JrSm9pbihjYXRlZ29yeVJlcXVlc3RzKVxuICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbigpKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyYXdSZXN1bHRzOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSByYXdSZXN1bHRzIGFzIEFycmF5PHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtOiBhbnk7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllczogYW55W107XG4gICAgICAgICAgICAgIH0+O1xuICAgICAgICAgICAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xuICAgICAgICAgICAgICByZXN1bHRzLmZvckVhY2goKHsgcHJvZ3JhbSwgY2F0ZWdvcmllcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAoY2F0ZWdvcmllcyA/PyBbXSkuZmlsdGVyKChjYXQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlNYXRjaGVzSWQoY2F0LCBjYXRlZ29yeUlkU2V0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgbWFwW1N0cmluZyhwcm9ncmFtLmlkKV0gPSBzZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKG1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChtYXApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21Gb3JtKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgY29tcGxldGVQcm9ncmFtSHlkcmF0aW9uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEN1c3RvbSBkYXNoYm9hcmRzIG9mdGVuIHN0b3JlIHByb2dyYW0gaWRzIG9ubHkg4oCUIHJlc29sdmUgbmFtZXMgZm9yIGZvcm0gY2hpcHMuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb2dyYW1JZHNGb3JFZGl0KFxuICAgIHByb2dyYW1JZHM6IG51bWJlcltdLFxuICAgIHByb2dyYW1zRnJvbUxpc3Q/OiBhbnlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXByb2dyYW1JZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFwcGx5ID0gKHByb2dyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHByb2dyYW1zLmZpbHRlcigocDogYW55KSA9PlxuICAgICAgICBwcm9ncmFtSWRzLmluY2x1ZGVzKE51bWJlcihwPy5pZCkpXG4gICAgICApO1xuICAgICAgaWYgKCFtYXRjaGVkLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlwcyA9IG1hdGNoZWQubWFwKChwOiBhbnkpID0+ICh7XG4gICAgICAgIGlkOiBwLmlkLFxuICAgICAgICBjYXRlZ29yeV9pZDogcC5pZCxcbiAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICBpdGVtX25hbWU6IHAubmFtZSxcbiAgICAgICAgcHJvZ3JhbUlkOiBwLmlkLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGNoaXBzKTtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgLi4udGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcbiAgICAgIF07XG4gICAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xuICAgICAgbWF0Y2hlZC5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgICAgbWFwW1N0cmluZyhwLmlkKV0gPSBbXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZFByb2dyYW1zID0gbWFwO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBpZiAocHJvZ3JhbXNGcm9tTGlzdD8ubGVuZ3RoKSB7XG4gICAgICBhcHBseShwcm9ncmFtc0Zyb21MaXN0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcpIHtcbiAgICAgIHRoaXMuYmVnaW5FZGl0SHlkcmF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZVxuICAgICAgLmdldFNhaWxzUHJvZ3JhbUxpc3QoKVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5maW5pc2hFZGl0SHlkcmF0aW9uKCkpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGFwcGx5KHBhcnNlU2FpbHNQcm9ncmFtTGlzdChyZXMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXREYXNoYm9hcmREYXRhKCk6IGFueSB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXNoYm9hcmREZXRhaWxzID8/IHt9O1xuICAgIGNvbnN0IGNvcmUgPSByb3c/LmRhc2hib2FyZF9kZXRhaWxzID8/IHJvdz8uZGFzaGJvYXJkID8/IHJvdztcbiAgICBjb25zdCBwcm9ncmFtU291cmNlID1cbiAgICAgIGNvcmU/LnByb2dyYW1zID8/XG4gICAgICBjb3JlPy5wcm9ncmFtSWQgPz9cbiAgICAgIHJvdz8ucHJvZ3JhbXMgPz9cbiAgICAgIHJvdz8ucHJvZ3JhbUlkID8/XG4gICAgICBjb3JlPy5wcm9ncmFtPy5hbGxfcHJvZ3JhbXM7XG4gICAgY29uc3QgcmNTb3VyY2UgPVxuICAgICAgY29yZT8ucmVzcG9uc2liaWxpdHlDZW50ZXJzID8/XG4gICAgICBjb3JlPy5yZXNwb25zaWJpbGl0eUNlbnRlcklkID8/XG4gICAgICBjb3JlPy5yZXNwb25zaWJpbGl0eV9jZW50ZXIgPz9cbiAgICAgIGNvcmU/LnJlc3BvbnNpYmlsaXR5X2NlbnRlcnMgPz9cbiAgICAgIGNvcmU/LnJjcyA/P1xuICAgICAgcm93Py5yZXNwb25zaWJpbGl0eUNlbnRlcnMgPz9cbiAgICAgIHJvdz8ucmVzcG9uc2liaWxpdHlfY2VudGVyO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIC4uLmNvcmUsXG4gICAgICBjZGlkOiBjb3JlPy5jZGlkID8/IHJvdz8uY2RpZCxcbiAgICAgIGRhc2hib2FyZF9uYW1lOiBjb3JlPy5uYW1lID8/IHJvdz8uZGFzaGJvYXJkX25hbWUsXG4gICAgICBuYW1lOiBjb3JlPy5uYW1lID8/IHJvdz8uZGFzaGJvYXJkX25hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogY29yZT8uZGVzY3JpcHRpb24gPz8gcm93Py5kZXNjcmlwdGlvbixcbiAgICAgIHZpZXdlcnM6IGNvcmU/LnZpZXdlcnMgPz8gcm93Py52aWV3ZXJzLFxuICAgICAgdmlzaWJsZV90b191c2VyczogY29yZT8udmlzaWJsZV90b191c2VycyA/PyByb3c/LnZpc2libGVfdG9fdXNlcnMsXG4gICAgICB2aXNpYmxlX3RvX2dyb3VwczogY29yZT8udmlzaWJsZV90b19ncm91cHMgPz8gcm93Py52aXNpYmxlX3RvX2dyb3VwcyxcbiAgICAgIHByb2dyYW1zOiBwcm9ncmFtU291cmNlLFxuICAgICAgcHJvZ3JhbUlkOiBleHRyYWN0UHJvZ3JhbUlkc0Zyb21EYXNoYm9hcmQoe1xuICAgICAgICBwcm9ncmFtczogcHJvZ3JhbVNvdXJjZSxcbiAgICAgICAgcHJvZ3JhbTogY29yZT8ucHJvZ3JhbSA/PyByb3c/LnByb2dyYW0sXG4gICAgICB9KSxcbiAgICAgIHJlc3BvbnNpYmlsaXR5X2NhdGVnb3J5OlxuICAgICAgICBjb3JlPy5yZXNwb25zaWJpbGl0eV9jYXRlZ29yeSA/P1xuICAgICAgICByb3c/LnJlc3BvbnNpYmlsaXR5X2NhdGVnb3J5ID8/XG4gICAgICAgIGNvcmU/LnJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnkgPz9cbiAgICAgICAgW10sXG4gICAgICByY0lkOiBjb3JlLnJjSWQsXG4gICAgICBzZWxlY3RlZFJjRW50cmllczpcbiAgICAgICAgcm93Py5zZWxlY3RlZFJjRW50cmllcyA/P1xuICAgICAgICBjb3JlPy5zZWxlY3RlZFJjRW50cmllcyA/P1xuICAgICAgICBbXSxcbiAgICAgIHJlc3BvbnNpYmlsaXR5Q2VudGVyczogcmNTb3VyY2UsXG4gICAgICByZXNwb25zaWJpbGl0eV9jZW50ZXI6IHJjU291cmNlLFxuICAgICAgcmVzcG9uc2liaWxpdHlDZW50ZXJJZDogY29yZS5yY0lkLFxuICAgICAgcHJvZ3JhbTogY29yZT8ucHJvZ3JhbSA/PyByb3c/LnByb2dyYW0sXG4gICAgICB0aW1lZnJhbWU6XG4gICAgICAgIGNvcmU/LnRpbWVmcmFtZSA/P1xuICAgICAgICAocm93Py50aW1lX2ZyYW1lX2Zyb20gfHwgcm93Py50aW1lX2ZyYW1lX3RvXG4gICAgICAgICAgPyB7IGZyb206IHJvdz8udGltZV9mcmFtZV9mcm9tLCB0bzogcm93Py50aW1lX2ZyYW1lX3RvIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCksXG4gICAgICB0aW1lX2ZyYW1lX2Zyb206XG4gICAgICAgIGNvcmU/LnRpbWVmcmFtZT8uZnJvbSA/P1xuICAgICAgICBjb3JlPy50aW1lZnJhbWU/LnN0YXJ0X2RhdGUgPz9cbiAgICAgICAgcm93Py50aW1lX2ZyYW1lX2Zyb20sXG4gICAgICB0aW1lX2ZyYW1lX3RvOlxuICAgICAgICBjb3JlPy50aW1lZnJhbWU/LnRvID8/IGNvcmU/LnRpbWVmcmFtZT8uZW5kX2RhdGUgPz8gcm93Py50aW1lX2ZyYW1lX3RvLFxuICAgICAgY3JlYXRlZF9ieTogY29yZT8uY3JlYXRlZEJ5ID8/IGNvcmU/LmNyZWF0ZWRfYnkgPz8gcm93Py5jcmVhdGVkX2J5LFxuICAgICAgY3JlYXRlZEJ5OiBjb3JlPy5jcmVhdGVkQnkgPz8gY29yZT8uY3JlYXRlZF9ieSA/PyByb3c/LmNyZWF0ZWRCeSxcbiAgICB9O1xuICB9XG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlkJ3MgZnJvbSBhIHBhcnRpY3VsYXIgbGlzdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gbGlzdCBhY3R1YWwgc2VsZWN0ZWQgbGlzdFxuICAgKiBAcGFyYW0ga2V5IGNvbnRhaW5zIGtleSB0byBleHRyYWN0IGlkIGZyb20gdGhlIGxpc3RcbiAgICovXG4gIHJldHVybklkcyhsaXN0OiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbGlzdD8ubWFwKChlbGUpID0+IHtcbiAgICAgIGlmIChlbGVba2V5XSkge1xuICAgICAgICByZXR1cm4gZWxlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBkYXRhIHN1Ym1pdHRlZCBvbiBjcmVhdGUgZGFzaGJvYXJkIGZvcm1cbiAgICovXG4gIHZhbGlkYXRlRGFzaGJvYXJkKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIH0sIDEwMCk7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZTtcbiAgICBjb25zdCByZSA9IC8mbmJzcDt8PGJyPi9nO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lID0gZXZlbnQucmVwbGFjZShyZSwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQ7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uXG4gICAgICAucmVwbGFjZShyZSwgJycpXG4gICAgICAudHJpbSgpO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZSB8fFxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUudHJpbSgpID09ICcnIHx8XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZS5sZW5ndGggPiAzMCB8fFxuICAgICAgdGhpcy50ZXh0Q291bnQudHJhbnNmb3JtKHRoaXMuZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0KSA+XG4gICAgICAgIDI1MCB8fFxuICAgICAgKHRoaXMuZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSAmJlxuICAgICAgICAhdGhpcy5kYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFRvRGF0ZSkgfHxcbiAgICAgICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoID09IDApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGFuIGFwaSBjYWxsIHRvIGNyZWF0ZSBhIGRhc2hib2FkXG4gICAqIEBwYXJhbSBkYXNoYm9hcmQgY29udGFpbnMgZGFzaGJvYXJkRm9ybSBkYXRhXG4gICAqL1xuICBzdWJtaXREYXNoYm9hcmQoKSB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCB2YWxpZCA9IHRoaXMudmFsaWRhdGVEYXNoYm9hcmQoKTtcbiAgICBpZiAoIXZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMudkxvYWRlciA9IHRydWU7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gdGhpcy5kYXNoYm9hcmRGb3JtO1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIHZpZXdlcjoge1xuICAgICAgICB1c2VySWQ6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZFZpZXdlcnMsICd1aWQnKSxcbiAgICAgICAgdXNlckdyb3VwSWQ6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZEdyb3VwLCAndWdpZCcpLFxuICAgICAgfSxcblxuICAgICAgd2lkZ2V0X2RldGFpbHM6IGRhc2hib2FyZC5jb25maWd1cmVXaWRnZXQsXG4gICAgICBkYXNoYm9hcmRfaWQ6IHRoaXMuZGFzaGJvYXJkSWQsXG4gICAgfTtcbiAgXG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLnNhdmVXaWRnZXREZXRhaWxzKHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8gc2F2ZVdpZGdldERldGFpbHMgY2FuIHJldHVybiBmcmVzaGVzdCBicmlkZ2UgaWQ7IG1lcmdlIGl0IGZvciByZWRpcmVjdC5cbiAgICAgICAgY29uc3Qgd2lkZ2V0UGF5bG9hZCA9IHJlcz8uZGF0YSA/PyByZXMgPz8ge307XG4gICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZCA9IHtcbiAgICAgICAgICAuLi4odGhpcy5jcmVhdGVkRGFzaGJvYXJkID8/IHt9KSxcbiAgICAgICAgICAuLi4od2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkID8/IHt9KSxcbiAgICAgICAgICBjZGRpZDpcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uY2RkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmNkZGlkID8/XG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5jZGlkID8/XG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmRfYnJpZGdlX2lkLFxuICAgICAgICAgIGNkaWQ6XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmNkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmNkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmNkZGlkID8/XG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmRfYnJpZGdlX2lkLFxuICAgICAgICAgIGRhc2hib2FyZF9icmlkZ2VfaWQ6XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZEJyaWRnZUlkLFxuICAgICAgICAgIGRhc2hib2FyZEJyaWRnZUlkOlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkPy5kYXNoYm9hcmRCcmlkZ2VJZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkQnJpZGdlSWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZF9icmlkZ2VfaWQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkSWQgPSB0aGlzLmdldENyZWF0ZWREYXNoYm9hcmRDZGlkKCk7XG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU21pbGV5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zbWlsZXlNZXNzYWdlID0gdGhpcy5tb2RlID09PSAnRURJVCcgPyAnVGhlIGRhc2hib2FyZCBoYXMgYmVlbiB1cGRhdGVkLicgOiAnVGhlIGRhc2hib2FyZCBoYXMgYmVlbiBjcmVhdGVkLic7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTbWlsZXkgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjZGlkID0gdGhpcy5nZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpO1xuICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh7XG4gICAgICAgICAgICBtb2RlOiB0aGlzLm1vZGUgPT09ICdFRElUJyA/ICd1cGRhdGVkJyA6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIGlkOiBjZGlkLFxuICAgICAgICAgICAgY2RpZCxcbiAgICAgICAgICAgIGRhc2hib2FyZEJyaWRnZUlkOlxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkPy5kYXNoYm9hcmRCcmlkZ2VJZCxcbiAgICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5jcmVhdGVkRGFzaGJvYXJkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignc2F2ZVdpZGdldERldGFpbHMgZXJyb3IgPT4nLCBlcnJvcik7XG4gICAgICAgIHRoaXMuc25hY2tCYXIuc2hvdyhlcnJvci5lcnJvci5zdGF0dXNNZXNzYWdlLCAnYWxlcnQnKTtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcblxuXG4gIH1cblxuICBjbG9zZUNvbnRhaW5lcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQobWVzc2FnZSk7XG4gIH1cblxuICBvblN1Ym1pdERhc2hib2FyZCgpIHtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmRhc2hib2FyZEZvcm07XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgZGFzaGJvYXJkX25hbWU6IGRhc2hib2FyZC5kYXNoYm9hcmROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IGRhc2hib2FyZC5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQsXG4gICAgICAgICAgYXR0YWNobWVudHM6IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHZpc2libGVfdG9fdXNlcnM6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZFZpZXdlcnMsICd1aWQnKSxcbiAgICAgIHZpc2libGVfdG9fZ3JvdXBzOiB0aGlzLnJldHVybklkcyhkYXNoYm9hcmQuc2VsZWN0ZWRHcm91cCwgJ3VnaWQnKSxcbiAgICAgIHJlc3BvbnNpYmlsaXR5X2NlbnRlcjogdGhpcy5yZXR1cm5JZHMoXG4gICAgICAgIGRhc2hib2FyZC5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycyxcbiAgICAgICAgJ3JjaWQnXG4gICAgICApLFxuICAgICAgcmVzcG9uc2liaWxpdHlfY2F0ZWdvcnk6IHRoaXMucmV0dXJuSWRzKFxuICAgICAgICBkYXNoYm9hcmQuc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMsXG4gICAgICAgICdjYXRlZ29yeV9pZCdcbiAgICAgICksXG4gICAgICByaXNrX2NhdGVnb3J5OiB0aGlzLnJldHVybklkcyhcbiAgICAgICAgZGFzaGJvYXJkLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMsXG4gICAgICAgICdjYXRlZ29yeV9pZCdcbiAgICAgICksXG4gICAgICBkaXNwbGF5X2NyaXRlcmlhOlxuICAgICAgICBkYXNoYm9hcmQuZGlzcGxheUNyaXRlcmlhID09PSAnYW5kJ1xuICAgICAgICAgID8gJ0JPVEhfUkNfQU5EX0NBVEVHT1JZJ1xuICAgICAgICAgIDogJ1JDX09SX0NBVEVHT1JZJyxcblxuICAgICAgd2lkZ2V0X2RldGFpbHM6IGRhc2hib2FyZC5jb25maWd1cmVXaWRnZXQsXG4gICAgICBwcm9ncmFtOiB7XG4gICAgICAgIGFsbF9wcm9ncmFtczogdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcbiAgICAgICAgc2VsZWN0ZWRfcHJvZ3JhbXM6IHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyxcbiAgICAgIH0sXG4gICAgICB0aW1lZnJhbWU6IHtcbiAgICAgICAgc3RhcnRfZGF0ZTogZGFzaGJvYXJkLnNlbGVjdGVkRnJvbURhdGVcbiAgICAgICAgICA/IHRoaXMuZ2V0RGF0ZUZvcm1hdGUoZGFzaGJvYXJkPy5zZWxlY3RlZEZyb21EYXRlKVxuICAgICAgICAgIDogJycsXG4gICAgICAgIGVuZF9kYXRlOiBkYXNoYm9hcmQuc2VsZWN0ZWRUb0RhdGVcbiAgICAgICAgICA/IHRoaXMuZ2V0RGF0ZUZvcm1hdGUoZGFzaGJvYXJkPy5zZWxlY3RlZFRvRGF0ZSlcbiAgICAgICAgICA6ICcnLFxuICAgICAgfSxcblxuICAgIH07XG4gICAgY29uc3QgY3JlYXRlRGFzaGJvYXJkUGF5bG9hZCA9IHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5idWlsZFBheWxvYWQocGF5bG9hZCk7XG4gICAgdGhpcy5zYXZlRGFzaGJvYXJkKGNyZWF0ZURhc2hib2FyZFBheWxvYWQpO1xuXG4gIH1cblxuICBzYXZlRGFzaGJvYXJkKHBheWxvYWQ6IGFueSkge1xuICAgIGxldCBhcGlDYWxsID0gdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmNyZWF0ZURhc2hib2FyZChwYXlsb2FkKTtcbiAgICBpZih0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgYXBpQ2FsbCA9IHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS51cGRhdGVEYXNoYm9hcmQocGF5bG9hZCwgdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5yZWNvcmRJZCk7XG4gICAgfVxuICAgIGFwaUNhbGwuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQgPSByZXM/LmRhdGE/LmRhc2hib2FyZCA/PyBudWxsO1xuICAgICAgICB0aGlzLmRhc2hib2FyZElkID0gdGhpcy5nZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpO1xuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuQ29uZmlndXJlV2lkZ2V0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0NvbXBsaWFuY2VXaWRnZXRzID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgICBpZihlcnJvci5zdGF0dXMgPT0gNDIyKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5zaG93KFxuICAgICAgICAgICAgZXJyb3IuZXJyb3Iuc3RhdHVzTWVzc2FnZSxcbiAgICAgICAgICAgICdhbGVydCdcbiAgICAgICAgICApOyAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGdldENyZWF0ZWREYXNoYm9hcmRDZGlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGFzaCA9IHRoaXMuY3JlYXRlZERhc2hib2FyZDtcbiAgICBjb25zdCBjZGlkID1cbiAgICAgIGRhc2g/LmNkZGlkID8/XG4gICAgICBkYXNoPy5jZGlkID8/XG4gICAgICBkYXNoPy5jZElkID8/XG4gICAgICBkYXNoPy5kYXNoYm9hcmRfYnJpZGdlX2lkID8/XG4gICAgICBkYXNoPy5kYXNoYm9hcmRCcmlkZ2VJZCA/P1xuICAgICAgZGFzaD8uZGFzaGJvYXJkPy5kYXNoYm9hcmRfYnJpZGdlX2lkID8/XG4gICAgICB0aGlzLmRhc2hib2FyZElkO1xuICAgIHJldHVybiBjZGlkICE9IG51bGwgJiYgY2RpZCAhPT0gJycgPyBTdHJpbmcoY2RpZCkgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgaHlkcmF0ZUVkaXRGb3JtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRGb3JtSHlkcmF0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0Rm9ybUh5ZHJhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXREYXNoYm9hcmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlXaWRnZXRzRnJvbUdldFdpZGdldHNSZXNwb25zZSh3aWRnZXRzOiB7XG4gICAgd2lkZ2V0QXJyOiBhbnlbXTtcbiAgICBhbGxXaWRnZXRzQXJyYXk6IGFueVtdO1xuICB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2F2ZWRXaWRnZXRzID0gZmlsdGVyQWN0aXZlV2lkZ2V0cyh3aWRnZXRzPy53aWRnZXRBcnIgPz8gW10pO1xuICAgIGNvbnN0IGNhdGFsb2dXaWRnZXRzID0gd2lkZ2V0cz8uYWxsV2lkZ2V0c0FycmF5Py5sZW5ndGhcbiAgICAgID8gd2lkZ2V0cy5hbGxXaWRnZXRzQXJyYXlcbiAgICAgIDogc2F2ZWRXaWRnZXRzO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQgPSBzYXZlZFdpZGdldHM7XG4gICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSBbLi4uc2F2ZWRXaWRnZXRzXTtcbiAgICB0aGlzLmRpc3BsYXllZFdpZGdldHMgPSBbLi4uY2F0YWxvZ1dpZGdldHNdO1xuICB9XG5cbiAgLyoqIEVESVQgbW9kZSBvbmx5OiBHRVQgZ2V0V2lkZ2V0cz9kYXNoYm9hcmRJZD17Y2RpZH0gKi9cbiAgcHJpdmF0ZSBsb2FkRWRpdE1vZGVXaWRnZXRzKGNkaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdFRElUJyB8fCAhY2RpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndyYXBFZGl0UmVxdWVzdChcbiAgICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5mZXRjaEN1c3RvbURhc2hib2FyZFdpZGdldERldGFpbHMoY2RpZCksXG4gICAgICAod2lkZ2V0cykgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5V2lkZ2V0c0Zyb21HZXRXaWRnZXRzUmVzcG9uc2Uod2lkZ2V0cyk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZWRpdERhc2hib2FyZCgpIHtcbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgPSAwO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gdGhpcy5idWlsZEVkaXREYXNoYm9hcmREYXRhKCk7XG4gICAgdGhpcy5wZW5kaW5nRWRpdFJjRW50cmllcyA9XG4gICAgICBkYXRhPy5zZWxlY3RlZFJjRW50cmllcyA/P1xuICAgICAgdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5zZWxlY3RlZFJjRW50cmllcyA/P1xuICAgICAgW107XG4gICAgY29uc3QgZWRpdENkaWQgPSBnZXRFZGl0RGFzaGJvYXJkQ2RpZChcbiAgICAgIGRhdGEsXG4gICAgICB0aGlzLmRhc2hib2FyZERldGFpbHMsXG4gICAgICB0aGlzLmRhc2hib2FyZElkXG4gICAgKTtcblxuICAgIHRoaXMubGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0ID0gW1xuICAgICAgZGF0YT8uY3JlYXRlZEJ5ID8/IGRhdGE/LmNyZWF0ZWRfYnksXG4gICAgXS5maWx0ZXIoKHgpID0+IHggIT0gbnVsbCk7XG4gICAgdGhpcy5wb3B1bGF0ZURhc2hib2FyZEZvcm0oZGF0YSk7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcgJiYgZWRpdENkaWQpIHtcbiAgICAgIHRoaXMubG9hZEVkaXRNb2RlV2lkZ2V0cyhlZGl0Q2RpZCk7XG4gICAgfVxuXG4gICAgdGhpcy50cnlDb21wbGV0ZUVkaXRIeWRyYXRpb24oKTtcbiAgfVxuXG4gIHBvcHVsYXRlRGFzaGJvYXJkRm9ybShkYXRhOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25CbG9jayA9IEFycmF5LmlzQXJyYXkoZGF0YT8uZGVzY3JpcHRpb24pXG4gICAgICAgID8gZGF0YS5kZXNjcmlwdGlvblswXVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblRleHQgPVxuICAgICAgICBkZXNjcmlwdGlvbkJsb2NrPy5jb250ZW50ID8/XG4gICAgICAgICh0eXBlb2YgZGF0YT8uZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnID8gZGF0YS5kZXNjcmlwdGlvbiA6ICcnKSA/P1xuICAgICAgICBkYXRhPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQgPz9cbiAgICAgICAgJyc7XG5cbiAgICAgIGNvbnN0IHZpc2libGVVc2VycyA9IGRhdGE/LnZpc2libGVfdG9fdXNlcnMgPz8gZGF0YT8udmlld2Vycz8udXNlcklkID8/IFtdO1xuICAgICAgY29uc3QgdmlzaWJsZVVzZXJJZHMgPSAodmlzaWJsZVVzZXJzID8/IFtdKS5tYXAoKHVzZXI6IGFueSkgPT5cbiAgICAgICAgdHlwZW9mIHVzZXIgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB1c2VyPy5tZW1iZXJfaWQgPz8gdXNlcj8uaWQgPz8gdXNlcj8udWlkXG4gICAgICAgICAgOiB1c2VyXG4gICAgICApO1xuICAgICAgY29uc3QgdmlzaWJsZUdyb3VwcyA9IGRhdGE/LnZpc2libGVfdG9fZ3JvdXBzID8/IGRhdGE/LnZpZXdlcnM/LnVzZXJHcm91cElkID8/IFtdO1xuICAgICAgY29uc3QgdmlzaWJsZUdyb3VwSWRzID0gKHZpc2libGVHcm91cHMgPz8gW10pLm1hcCgoZ3JvdXA6IGFueSkgPT5cbiAgICAgICAgdHlwZW9mIGdyb3VwID09PSAnb2JqZWN0JyA/IGdyb3VwPy5ncm91cF9pZCA/PyBncm91cD8uaWQgPz8gZ3JvdXA/LnVnaWQgOiBncm91cFxuICAgICAgKTtcbiAgICAgIHRoaXMucGVuZGluZ0VkaXRSY0VudHJpZXMgPVxuICAgICAgICBkYXRhPy5zZWxlY3RlZFJjRW50cmllcyA/P1xuICAgICAgICB0aGlzLmRhc2hib2FyZERldGFpbHM/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICAgIFtdO1xuICAgICAgdGhpcy5wZW5kaW5nRWRpdFJjSWRzID0gZXh0cmFjdFJjSWRzRnJvbURhc2hib2FyZChkYXRhKTtcbiAgICAgIHRoaXMuYXBwbHlQcmVyZXNvbHZlZFJjRW50cmllcygpO1xuICAgICAgY29uc3Qgcmlza0NhdGVnb3JpZXMgPSBkYXRhPy5yaXNrX2NhdGVnb3J5ID8/IFtdO1xuICAgICAgY29uc3Qgcmlza0NhdGVnb3J5SWRzID0gKHJpc2tDYXRlZ29yaWVzID8/IFtdKS5tYXAoKHJpc2s6IGFueSkgPT5cbiAgICAgICAgdHlwZW9mIHJpc2sgPT09ICdvYmplY3QnID8gcmlzaz8uY2F0ZWdvcnlfaWQgPz8gcmlzaz8uaWQgOiByaXNrXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RhcnREYXRlID1cbiAgICAgICAgZGF0YT8udGltZWZyYW1lPy5zdGFydF9kYXRlID8/XG4gICAgICAgIGRhdGE/LnRpbWVmcmFtZT8uZnJvbSA/P1xuICAgICAgICBkYXRhPy50aW1lX2ZyYW1lX2Zyb207XG4gICAgICBjb25zdCBlbmREYXRlID1cbiAgICAgICAgZGF0YT8udGltZWZyYW1lPy5lbmRfZGF0ZSA/P1xuICAgICAgICBkYXRhPy50aW1lZnJhbWU/LnRvID8/XG4gICAgICAgIGRhdGE/LnRpbWVfZnJhbWVfdG87XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZSA9XG4gICAgICAgIGRhdGE/LmRhc2hib2FyZF9uYW1lID8/IGRhdGE/Lm5hbWUgPz8gJyc7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb25UZXh0O1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2VycyA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxuICAgICAgICB0aGlzLnVzZXJzTGlzdCxcbiAgICAgICAgdmlzaWJsZVVzZXJJZHMsXG4gICAgICAgIFsnbWVtYmVyX2lkJywgJ3VpZCcsICdpZCddXG4gICAgICApO1xuICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZFVzZXJzTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnM7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cCA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxuICAgICAgICB0aGlzLmdyb3VwTGlzdCxcbiAgICAgICAgdmlzaWJsZUdyb3VwSWRzLFxuICAgICAgICBbJ2dyb3VwX2lkJywgJ3VnaWQnLCAnaWQnXVxuICAgICAgKTtcbiAgICAgIHRoaXMubGlzdERldGFpbHMuc2VsZWN0ZWRHcm91cExpc3QgPSB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cDtcbiAgICAgIHRoaXMuYXBwbHlQZW5kaW5nUmVzcG9uc2liaWxpdHlDZW50ZXJzKCk7XG4gICAgICB0aGlzLnN5bmNQcm9ncmFtc0ZvckVkaXQoZGF0YSk7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcyA9XG4gICAgICAgIHRoaXMuc2V0TGlzdChcbiAgICAgICAgdGhpcy5hbGxSaXNrQ2F0ZWdvcmllcyxcbiAgICAgICAgcmlza0NhdGVnb3J5SWRzLFxuICAgICAgICAnY2F0ZWdvcnlfaWQnXG4gICAgICApO1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRpc3BsYXlDcml0ZXJpYSA9XG4gICAgICAgIGRhdGE/LmRpc3BsYXlfY3JpdGVyaWEgPT09ICdCT1RIX1JDX0FORF9DQVRFR09SWScgPyAnYW5kJyA6ICdvcic7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSA9IHN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKHN0YXJ0RGF0ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRUb0RhdGUgPSBlbmREYXRlXG4gICAgICAgID8gbmV3IERhdGUoZW5kRGF0ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5tb2RlICE9PSAnRURJVCcpIHtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHdpZGdldERldGFpbHNSYXcgPVxuICAgICAgICAgIGRhdGE/LndpZGdldF9kZXRhaWxzID8/IGRhdGE/LndpZGdldHMgPz8gW107XG4gICAgICAgIGNvbnN0IHdpZGdldERldGFpbHMgPSBBcnJheS5pc0FycmF5KHdpZGdldERldGFpbHNSYXcpXG4gICAgICAgICAgPyB3aWRnZXREZXRhaWxzUmF3XG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgYWxsV2lkZ2V0c1JhdyA9IGRhdGE/LmFsbF93aWRnZXRzID8/IHdpZGdldERldGFpbHM7XG4gICAgICAgIGNvbnN0IGFsbFdpZGdldHMgPSBBcnJheS5pc0FycmF5KGFsbFdpZGdldHNSYXcpID8gYWxsV2lkZ2V0c1JhdyA6IFtdO1xuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uY29uZmlndXJlV2lkZ2V0ID0gd2lkZ2V0RGV0YWlscztcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPVxuICAgICAgICAgIHdpZGdldERldGFpbHMubGVuZ3RoID4gMCA/IFsuLi5uZXcgU2V0KHdpZGdldERldGFpbHMpXSA6IFtdO1xuICAgICAgICB0aGlzLmRpc3BsYXllZFdpZGdldHMgPVxuICAgICAgICAgIGFsbFdpZGdldHMubGVuZ3RoID4gMCA/IFsuLi5uZXcgU2V0KGFsbFdpZGdldHMpXSA6IFtdO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgICBjb25zdCBtaW5Ub0RhdGUgPSB0aGlzLnNldFRvRGF0ZShzdGFydERhdGUpO1xuICAgICAgICB0aGlzLnRvRGF0ZVBpY2tlckNvbmZpZyA9IHsgbWluOiBtaW5Ub0RhdGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZVRvRGF0ZSA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlVG9EYXRlID0gZmFsc2U7XG4gICAgICB9LCAyMCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3BvcHVsYXRlIGRhc2hib2FyZCBlcnJvciA9PicsIGVycm9yKTtcbiAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIC8veW91ciBjb2RlIHRvIHVwZGF0ZSB0aGUgbW9kZWxcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzZXRQZXJtaXNzaW9uKHJvbGVBY3Rpb25zOiBhbnkpIHtcbiAgICBsZXQgaWZFeGlzdFJpc2sgPSByb2xlQWN0aW9ucz8uZmluZCgoZWw6IGFueSkgPT4gZWwubW9kdWxlTmFtZSA9PSAncmlzaycpO1xuICAgIGlmRXhpc3RSaXNrPy5zdWJNb2R1bGU/LmZvckVhY2goKG1vZHVsZTogYW55KSA9PiB7XG4gICAgICBtb2R1bGU/LnBlcm1pc3Npb25zPy5mb3JFYWNoKChwZXJtaXNzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgc3dpdGNoIChwZXJtaXNzaW9uPy5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnUlJNUic6IHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uPy5kZWZhdWx0UGVybWlzc2lvbiA9PSAxIHx8IHBlcm1pc3Npb24/LmVuYWJsZSA9PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNNYW5hZ2VSaXNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRFbGVtZW50Q2xhc3NOYW1lKGVsOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghZWwpIHJldHVybiAnJztcbiAgICBpZiAodHlwZW9mIGVsPy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSByZXR1cm4gZWw/LmNsYXNzTmFtZTtcbiAgICBpZiAodHlwZW9mIGVsPy5jbGFzc05hbWUgPT09ICdvYmplY3QnICYmICdiYXNlVmFsJyBpbiBlbD8uY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gZWw/LmNsYXNzTmFtZT8uYmFzZVZhbDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBkb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQ/LnRhcmdldCBhcyBFbGVtZW50O1xuICAgIGNvbnN0IGZyb21EYXRlSW5wdXRFbGVtZW50ID1cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3BlbmVkRGF0ZVBpY2tlci50b0xvd2VyQ2FzZSgpKSB8fCBudWxsO1xuICAgIGNvbnN0IGRhdGVQaWNrZXJDYWxlbmRhckNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAnZHAtZGF5LWNhbGVuZGFyLWNvbnRhaW5lcidcbiAgICApWzBdO1xuICAgIGNvbnN0IG1vbnRoWWVhckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy5kcC1tb250aC1jYWxlbmRhci1jb250YWluZXInXG4gICAgKTtcbiAgICBjb25zdCBpc05vdE1vbnRoWWVhckVsZW1lbnQgPSAhbW9udGhZZWFyRWxlbWVudD8uY29udGFpbnModGFyZ2V0RWxlbWVudCk7XG5cbiAgICBjb25zdCBvcGVuZWRFbGVtZW50ID1cbiAgICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9PT0gJ0ZST01fREFURSdcbiAgICAgICAgPyB0aGlzLmZyb21EYXRlUGlja2VyUG9wdXBcbiAgICAgICAgOiB0aGlzLnRvRGF0ZVBpY2tlclBvcHVwO1xuICAgIGNvbnN0IGlzT3V0c2lkZUZyb21EYXRlSW5wdXQgPVxuICAgICAgIW9wZW5lZEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKHRhcmdldEVsZW1lbnQpO1xuICAgIGNvbnN0IGlzTm90RnJvbURhdGVFbGVtZW50ID0gZXZlbnQ/LnRhcmdldCAhPT0gZnJvbURhdGVJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgaXNOb3RJbnNpZGVDYWxlbmRhciA9XG4gICAgICAhZGF0ZVBpY2tlckNhbGVuZGFyQ29udGFpbmVyPy5jb250YWlucyh0YXJnZXRFbGVtZW50KTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGVQaWNrZXIgPVxuICAgICAgdGhpcy5vcGVuZWREYXRlUGlja2VyID09PSAnRlJPTV9EQVRFJ1xuICAgICAgICA/IHRoaXMuZnJvbURhdGVQaWNrZXJcbiAgICAgICAgOiB0aGlzLnRvRGF0ZVBpY2tlcjtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuZ2V0RWxlbWVudENsYXNzTmFtZSh0YXJnZXRFbGVtZW50KTtcbiAgICBjb25zdCBpc05vdENhbGVuZGFyTW9udGggPSAhY2xhc3NOYW1lPy5pbmNsdWRlcygnZHAtY2FsZW5kYXItbW9udGgnKTtcblxuICAgIGlmIChcbiAgICAgIGlzT3V0c2lkZUZyb21EYXRlSW5wdXQgJiZcbiAgICAgIGlzTm90RnJvbURhdGVFbGVtZW50ICYmXG4gICAgICBpc05vdEluc2lkZUNhbGVuZGFyICYmXG4gICAgICBpc05vdENhbGVuZGFyTW9udGggJiZcbiAgICAgIGlzTm90TW9udGhZZWFyRWxlbWVudCAmJlxuICAgICAgZGF0ZVBpY2tlckNhbGVuZGFyQ29udGFpbmVyXG4gICAgKSB7XG4gICAgICB0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lcihcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxuICAgICAgICBvcGVuZWRFbGVtZW50LFxuICAgICAgICBzZWxlY3RlZERhdGVQaWNrZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnRDbGlja0xpc3RlbmVyKFxuICAgIHRhcmdldDogYW55LFxuICAgIG9wZW5lZEVsZW1lbnRzOiBFbGVtZW50UmVmLFxuICAgIHNlbGVjdGVkRGF0ZVBpY2tlcjogYW55XG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFvcGVuZWRFbGVtZW50cz8ubmF0aXZlRWxlbWVudD8uY29udGFpbnModGFyZ2V0KSAmJlxuICAgICAgc2VsZWN0ZWREYXRlUGlja2VyPy5hcmVDYWxlbmRhcnNTaG93blxuICAgICkge1xuICAgICAgc2VsZWN0ZWREYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XG4gICAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8YXBwLXNuYWNrLWJhcj48L2FwcC1zbmFjay1iYXI+XG48ZGl2IGNsYXNzPVwiY3JlYXRlLWRhc2hib2FyZFwiICpuZ0lmPVwiIW9wZW5Db25maWd1cmVXaWRnZXRzXCI+XG4gIDxkaXYgY2xhc3M9XCJjcmVhdGUtZGFzaGJvYXJkLWNvbnRhaW5lciB2eC1kLWZsZXggdngtanVzdGlmeS1lbmRcIiBbY2xhc3MuYW5pbWF0ZS1zbGlkZUluUmlnaHRdPVwiYW5pbWF0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vcmUtb3B0aW9uXCIgKm5nSWY9XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XG4gICAgICA8YXBwLXVzZXItbGlzdCAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yID09PSAnd2hvQ2FuVmlldydcIlxuICAgICAgICAoc2F2ZVNlbGVjdGVkVXNlcnMpPVwic2F2ZVNlbGVjdGVkTGlzdCgnd2hvQ2FuVmlldycsICRldmVudClcIiAoY2xvc2VVc2VyTGlzdCk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIlxuICAgICAgICBbdG90YWxQYWdlc109XCJ0b3RhbFBhZ2VzXCIgW3RvdGFsTGlzdF09XCJ0b3RhbExpc3RcIiBbbGlzdERldGFpbHNdPVwibGlzdERldGFpbHNcIiBbdG90YWxncm91cHNjb3VudF09XCJ0b3RhbGdyb3Vwc1wiXG4gICAgICAgIFtmZWF0dXJlXT1cImZlYXR1cmVcIj48L2FwcC11c2VyLWxpc3Q+XG4gICAgICA8YXBwLXJlc3BvbnNpYmlsaXR5LWNlbnRlciAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yID09PSAncmNMaXN0J1wiXG4gICAgICAgIFtyZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0XT1cInJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3RcIiBbcmFkaW9TZWxlY3Rpb25dPVwiZmFsc2VcIlxuICAgICAgICBbc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnNdPVwiXG4gICAgICAgICAgZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVyc1xuICAgICAgICBcIiBbcmNJZEtleV09XCInaXRlbV9pZCdcIiAoc2F2ZVNlbGVjdGVkTGlzdCk9XCJzYXZlU2VsZWN0ZWRMaXN0KCdyYycsICRldmVudClcIlxuICAgICAgICAoY2xvc2VSY0xpc3QpPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpXCI+XG4gICAgICA8L2FwcC1yZXNwb25zaWJpbGl0eS1jZW50ZXI+XG4gICAgICA8IS0tIDxhcHAtY2F0ZWdvcmllcyAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJ1wiXG4gICAgICAgIFtjYXRlZ29yeUxpc3RdPVwicmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzVHJlZVwiIFthbGxDYXRlZ29yaWVzXT1cImFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXCJcbiAgICAgICAgW2NhdGVnb3J5SWRLZXldPVwiJ2NhdGVnb3J5X2lkJ1wiIFtzZWxlY3RlZENhdGVnb3JpZXNdPVwiZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllc1wiXG4gICAgICAgIChzYXZlU2VsZWN0ZWRDYXRlZ29yeSk9XCJcbiAgICAgICAgICBzYXZlU2VsZWN0ZWRMaXN0KCdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnLCAkZXZlbnQpXG4gICAgICAgIFwiIChjbG9zZUNhdGVnb3JpZXNMaXN0KT1cImFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKVwiPjwvYXBwLWNhdGVnb3JpZXM+IC0tPlxuICAgICAgPGFwcC1saXN0LWNvbnRhaW5lciBsaXN0ICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnXCJcbiAgICAgICAgKGNsb3NlKT1cImFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKVwiPlxuICAgICAgICA8YXBwLXByb2dyYW0tbGlzdCBib2R5IChpdGVtc1NlbGVjdGVkQ2hhbmdlKT1cIm9uUHJvZ3JhbVNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRJdGVtc109XCJzZWxlY3RlZFByb2dyYW1zXCIgW3VybF09XCJwcm9ncmFtTGlzdFVybFwiPjwvYXBwLXByb2dyYW0tbGlzdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1iZXR3ZWVuIHZ4LXctMTAwXCIgZm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgdngtZnMtMTIgdngtZC1mbGV4XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0ZWQtY291bnQtYm94IHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIj5cbiAgICAgICAgICAgICAgICB7eyBhbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGggfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtdGV4dFwiPlxuICAgICAgICAgICAgICAgIFByb2dyYW1cbiAgICAgICAgICAgICAgICB7eyBhbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGggPiAxID8gXCJDYXRlZ29yaWVzXCIgOiBcIkNhdGVnb3J5XCIgfX1cbiAgICAgICAgICAgICAgICBTZWxlY3RlZDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlIHZ4LWQtZmxleFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbEJ0blwiIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuZXh0QnRuXCIgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKTtcIj5cbiAgICAgICAgICAgICAgTmV4dCA8aSBjbGFzcz1cImljb25zXCI+JiN4ZTkxZTs8L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2FwcC1saXN0LWNvbnRhaW5lcj5cblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ2eC1kaWFsb2ctY29udGFpbmVyIHNpZGUtZGlhbG9nXCIgW2NsYXNzLnRhYmxldC13aWR0aF09XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XG4gICAgICA8YXBwLWxvYWRlci1pbmxpbmUgKm5nSWY9XCJ2TG9hZGVyXCI+PC9hcHAtbG9hZGVyLWlubGluZT5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZ4LWRpYWxvZy1ib2R5LWNvbnRhaW5lclwiIChzY3JvbGwpPVwiYW5pbWF0ZUltYWdlKClcIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW4tc2Nyb2xsXT1cInBvcG92ZXJTZXJ2aWNlLnN0b3BTY3JvbGxcIj5cbiAgICAgICAgICA8IS0tIERhc2hib2FyZCBOYW1lIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIFtjbGFzcy5kaXNhYmxlZF09XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cbiAgICAgICAgICAgICAgPGltZyBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZEljb25cIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgIWRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZSB8fCBhY3RpdmVTZWxlY3RvciA9PT0gJ25hbWUnXG4gICAgICAgICAgICAgICAgXCIgYWx0PVwiXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgLz5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNoZWNrSWNvblwiICpuZ0lmPVwiZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCIgY3g9XCIyNlwiIGN5PVwiMjZcIiByPVwiMjVcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5EYXNoYm9hcmRcbiAgICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZSB2eC10eHQtcmVkIHZ4LWZzLTE2IHZ4LWZ3LTQwMFwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRleHRGaWVsZFwiIHBsYWNlaG9sZGVyPVwiQWRkIGRhc2hib2FyZCBuYW1lIChNYXggbGltaXQ6IDMwIGNoYXJhY3RlcnMpLlwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lXCIgKGtleWRvd24pPVwiYWN0aXZlU2VsZWN0b3IgPSAnbmFtZSdcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXNpbik9XCJhY3RpdmF0ZVNlbGVjdG9yKCduYW1lJywgdHJ1ZSlcIiAoZm9jdXNvdXQpPVwiYWN0aXZhdGVTZWxlY3RvcignbmFtZScsIGZhbHNlKVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRlclwiICpuZ0lmPVwiZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkTmFtZT8ubGVuZ3RoID4gMFwiPnt7IDMwIC1cbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidngtdHh0LWVycm9yXCIgW2FwcFNjcm9sbEluVmlld109XCJ0cnVlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXG4gICAgICAgICAgICAgICAgICAgIChkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmROYW1lPy5sZW5ndGggPiAzMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmROYW1lKVxuICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLmxlbmd0aCA+IDMwXG4gICAgICAgICAgICAgICAgICA/IFwiWW91IGhhdmUgZXhjZWVkZWQgdGhlIG1heGltdW0gY2hhcmFjdGVyIGxpbWl0IG9mIDMwIGNoYXJhY3RlcnMuXCJcbiAgICAgICAgICAgICAgICAgIDogXCJQbGVhc2UgZW50ZXIgYSBuYW1lIGZvciB0aGlzIERhc2hib2FyZC5cIlxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtaW5wdXQtZ3JvdXAgdngtbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgPHZjb21wbHktZWRpdG9yIFtlZGl0b3JDb25maWddPVwiZGFzaGJvYXJkRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhc2hib2FyZEZvcm0uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0XCI+PC92Y29tcGx5LWVkaXRvcj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRlclwiICpuZ0lmPVwiZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0Py5sZW5ndGggPiAwXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgMjUwIC1cbiAgICAgICAgICAgICAgICAgICAgKGRhc2hib2FyZEZvcm0/LmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCB8IHRleHRDb3VudClcbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZ4LXR4dC1lcnJvclwiIFthcHBTY3JvbGxJblZpZXddPVwidHJ1ZVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAoZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0IHwgdGV4dENvdW50KSA+IDI1MFxuICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgbGltaXQgb2YgMjUwXG4gICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGFzaGJvYXJkIERpc3BsYXkgQ3JpdGVyaWEgIC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC1sYWJlbCB2eC1mcy0xMCB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wbC0xIHZ4LXByLTEgdngtbGgtNFwiPlxuICAgICAgICAgICAgRGFzaGJvYXJkIERpc3BsYXkgQ3JpdGVyaWFcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGFwcC1pbmZvcm1hdGlvbi1ibG9jaz48L2FwcC1pbmZvcm1hdGlvbi1ibG9jaz5cblxuICAgICAgICAgIDwhLS0gV2hvIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VsZWN0b3IgPT09ICd3aG9DYW5WaWV3J1wiIFtjbGFzcy5kaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgJiZcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICd3aG9DYW5WaWV3JyAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIFtuZ1NyY109XCJBU1NFVFMuZGFzaEJvYXJkVXNlcnNJY29uXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID09IDAgfHxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yID09PSAnd2hvQ2FuVmlldydcbiAgICAgICAgICAgICAgICBcIiBhbHQ9XCJcIiB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiAvPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hlY2tJY29uXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICd3aG9DYW5WaWV3J1xuICAgICAgICAgICAgICAgIFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCIgY3g9XCIyNlwiIGN5PVwiMjZcIiByPVwiMjVcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiPldob1xuICAgICAgICAgICAgICAgICAgY2FuIHZpZXcgdGhpcyBkYXNoYm9hcmQ/PHNwYW4gY2xhc3M9XCJyZXF1aXJlIHZ4LXR4dC1yZWQgdngtZnMtMTYgdngtZnctNDAwXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCA9PSAwXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Qm94RW5hYmxlIHZ4LXBsLTMgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCd3aG9DYW5WaWV3JywgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RCb3hQbGFjZWhvZGVyIHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtbGgtNFwiPlxuICAgICAgICAgICAgICAgICAgICBXaG8gY2FuIHZpZXcgdGhpcyBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFncm91cHNFbmFibGVkXCIgaWQ9XCJvbmx5dXNlcnNsaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCIgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlciBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/LnNsaWNlKDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcyB2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1yLTFcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhbGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0LmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWVtYmVyX2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIChjbGljayk9XCJyZW1vdmUoJ3dob0NhblZpZXcnLCB1c2VyKVwiPiYjeGU5YWU7PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCIgW2FyVG9vbHRpcF09XCJ1c2VyLm1lbWJlcl9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCIgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj57eyB1c2VyLm1lbWJlcl9uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZ3JvdXBzRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gZ3JlZW5CZyB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInVzZXJMaXN0LnBvcG92ZXIoKVwiIHBsYWNlbWVudD1cImxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICt7eyBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/LnNsaWNlKDEpLmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICN1c2VyTGlzdCBbZG9udENsb3Nlb25DbGlja109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlciBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZSA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCIgW2FyVG9vbHRpcF09XCJ1c2VyPy5tZW1iZXJfbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcy1pY29uXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWVtYmVyX2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmICFncm91cHNFbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlldycsIHVzZXIpXCI+JiN4ZTkwZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVzZXI/Lm1lbWJlcl9uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1wb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJncm91cHNFbmFibGVkXCIgY2xhc3M9XCJ2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIj5VU0VSKFMpPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gZ3JlZW5CZyB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInVzZXJDb3VudC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJsZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1sLTIgdngtbXItMlwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEdyb3VwPy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgXCI+Jjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhc2hib2FyZEZvcm0/LnNlbGVjdGVkR3JvdXA/Lmxlbmd0aFwiIGlkPVwidXNlcnNhbmRncm91cHNcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcENvbnRhaW5lciB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LXBsLTIgdngtcHItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCI+VVNFUiBHUk9VUChTKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdW50QnRuIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwiZ3JvdXBDb3VudC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRHcm91cD8ubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjdXNlckNvdW50IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIiBbYXJUb29sdGlwXT1cImRhdGEubWVtYmVyX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MtaWNvblwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0LmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1lbWJlcl9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIChjbGljayk9XCJyZW1vdmUoJ3dob0NhblZpZXcnLCBkYXRhKVwiPiYjeGU5MGQ7PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm1lbWJlcl9uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1wb3BvdmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjZ3JvdXBDb3VudCBbZG9udENsb3Nlb25DbGlja109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGRhdGEgb2YgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRHcm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwiZGF0YS5ncm91cF9uYW1lXCIgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzLWljb25cIiAoY2xpY2spPVwicmVtb3ZlKCd3aG9DYW5WaWV3R3JvdXAnLCBkYXRhKVwiPiYjeGU5MGQ7PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmdyb3VwX25hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yICE9PSAnd2hvQ2FuVmlldydcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRCdG4gdngtZnMtMTEgdngtZnctNjAwIHZ4LXR4dC1ibHVlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wLTAgdngtbS0wIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3Rvcignd2hvQ2FuVmlldycsIHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtbXItMVwiPiYjeGU5MGM7PC9pPiBFRElUXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUmVzcG9uc2liaWxpdHkgQ2VudGVyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdyY0xpc3QnXCIgW2NsYXNzLmRpc2FibGVkXT1cIlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3JjTGlzdCcgJiZcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1xuICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cbiAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciA9PT0gJ3JjTGlzdCdcbiAgICAgICAgICAgICAgICBcIiBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZFJjSWNvblwiIGFsdD1cIlwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIC8+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3JjTGlzdCdcbiAgICAgICAgICAgICAgICBcIiBjbGFzcz1cImNoZWNrSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCIgY3g9XCIyNlwiIGN5PVwiMjZcIiByPVwiMjVcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5SRVNQT05TSUJJTElUWVxuICAgICAgICAgICAgICAgICAgQ0VOVEVSKFMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPT0gMFxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3JjTGlzdCcsIHRydWUpXCIgW2NsYXNzLmVycm9yXT1cIlxuICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPT1cbiAgICAgICAgICAgICAgICAgICAgICAwICYmXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmlza0NhdGVnb3JpZXM/Lmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RCb3hQbGFjZWhvZGVyIHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtbGgtNFwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhlIFJlc3BvbnNpYmlsaXR5IENlbnRlcihzKSB0aGF0IHlvdSB3b3VsZCBsaWtlPGJyIC8+ZGlzcGxheWVkXG4gICAgICAgICAgICAgICAgICAgIGluIHRoZSBEYXNoYm9hcmQsIGlmIGFueS5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIiAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmMgb2YgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/LnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzIHZ4LWZzLTEyIHZ4LXBhcmFncmFwaC10eHQgdngtbXItMVwiIChjbGljayk9XCJyZW1vdmUoJ3JjJywgcmMpXCI+JiN4ZTlhZTs8L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCIgW2FyVG9vbHRpcF09XCJyYy5pdGVtX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXk9XCIwXCIgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj57eyByYy5pdGVtX25hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdW50QnRuIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInJjTGlzdC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJsZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgK3t7XG4gICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/LnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjcmNMaXN0IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYyBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIiBbYXJUb29sdGlwXT1cInJjPy5pdGVtX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MtaWNvblwiIChjbGljayk9XCJyZW1vdmUoJ3JjJywgcmMpXCI+JiN4ZTkwZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJjPy5pdGVtX25hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yICE9PSAncmNMaXN0J1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdEJ0biB2eC1mcy0xMSB2eC1mdy02MDAgdngtdHh0LWJsdWUgdngtdHQtdXBwZXJjYXNlIHZ4LXAtMCB2eC1tLTAgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCdyY0xpc3QnLCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIHZ4LW1yLTFcIj4mI3hlOTBjOzwvaT4gRURJVFxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFByb2dyYW0gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcIiBbY2xhc3MuZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJyAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID09XG4gICAgICAgICAgICAgICAgICAgIDAgfHwgYWN0aXZlU2VsZWN0b3IgPT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnXG4gICAgICAgICAgICAgICAgXCIgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRQcm9ncmFtSWNvblwiIGFsdD1cIlwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIC8+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcbiAgICAgICAgICAgICAgICBcIiBjbGFzcz1cImNoZWNrSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCIgY3g9XCIyNlwiIGN5PVwiMjZcIiByPVwiMjVcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5QUk9HUkFNPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPT0gMFxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsIHRydWUpXCIgW2NsYXNzLmVycm9yXT1cIlxuICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPT1cbiAgICAgICAgICAgICAgICAgICAgICAwICYmXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmlza0NhdGVnb3JpZXM/Lmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RCb3hQbGFjZWhvZGVyIHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtbGgtNFwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhlIFByb2dyYW0ocykgdGhhdCB5b3Ugd291bGQgbGlrZSBkaXNwbGF5ZWQgaW5cbiAgICAgICAgICAgICAgICAgICAgdGhlPGJyIC8+RGFzaGJvYXJkLCBpZiBhbnkuXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwic2VsZWN0Qm94U3VjY2VzcyB2eC1wbC0yIHZ4LXByLTMgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCIgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJDYXRlZ29yeSBvZiBhbGxQcm9nYW1TZWxlY3RlZD8uc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MgdngtZnMtMTIgdngtcGFyYWdyYXBoLXR4dCB2eC1tci0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlKCdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnLCByQ2F0ZWdvcnkpXCI+JiN4ZTlhZTs8L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCIgW2FyVG9vbHRpcF09XCJyQ2F0ZWdvcnkuaXRlbV9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiIHR5cGU9XCJibGFja1wiIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCI+e3sgckNhdGVnb3J5Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdW50QnRuIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInJDYXRlZ29yeUxpc3QucG9wb3ZlcigpXCIgcGxhY2VtZW50PVwibGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICt7e1xuICAgICAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YXBwLXBvcG92ZXIgI3JDYXRlZ29yeUxpc3QgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJDYXRlZ29yeSBvZiBhbGxQcm9nYW1TZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIiBbYXJUb29sdGlwXT1cInJDYXRlZ29yeT8ubmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcy1pY29uXCIgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckNhdGVnb3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+JiN4ZTkwZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJDYXRlZ29yeT8ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgIT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0QnRuIHZ4LWZzLTExIHZ4LWZ3LTYwMCB2eC10eHQtYmx1ZSB2eC10dC11cHBlcmNhc2UgdngtcC0wIHZ4LW0tMCB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsIHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtbXItMVwiPiYjeGU5MGM7PC9pPiBFRElUXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgPCEtLSBUaW1lZnJhbWUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmRpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAhZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgIWRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVG9EYXRlXG4gICAgICAgICAgICAgICAgXCIgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRUaW1lRnJhbWVJY29uXCIgYWx0PVwiXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgLz5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRUb0RhdGVcbiAgICAgICAgICAgICAgICBcIiBjbGFzcz1cImNoZWNrSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCIgY3g9XCIyNlwiIGN5PVwiMjZcIiByPVwiMjVcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5USU1FRlJBTUU8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInZ4LWNvbnRyb2wtcGFuZWwtc3ViLWxhYmVsXCI+U2VsZWN0IGhvdyBsb25nIHlvdSB3b3VsZCBsaWtlIHRoZSBpbmZvcm1hdGlvbiBzZWxlY3RlZCB0byBiZVxuICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGZvci4gSWYgbm8gdGltZWZyYW1lIGlzIHNlbGVjdGVkLCB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZGlzcGxheWVkIHBlcm1hbmVudGx5LjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHZ4LWQtZmxleCB2eC1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zXCI+JiN4ZTkyZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZnJvbV9kYXRlXCIgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSB8IGRhdGUgOiAnZGQgTU1NIHl5eXknXG4gICAgICAgICAgICAgICAgICAgICAgXCIgW3BsYWNlaG9sZGVyXT1cIidGcm9tJ1wiIChjbGljayk9XCJvcGVuRnJvbURhdGVQaWNrZXIoKVwiIHJlYWRvbmx5IC8+XG4gICAgICAgICAgICAgICAgICAgIDxkcC1kYXRlLXBpY2tlciAjZnJvbURhdGVQaWNrZXIgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERhdGVcIiAob25TZWxlY3QpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUZyb21EYXRlUGlja2VyKCk7IGRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICBcIiBbY29uZmlnXT1cImZyb21EYXRlUGlja2VyQ29uZmlnXCI+PC9kcC1kYXRlLXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAoY2xpY2spPVwiY2xvc2VGcm9tRGF0ZVBpY2tlcigpXCIgKm5nSWY9XCJkYXRlUGlja2VyT3ZlcmxheVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1zZWxlY3RcIiAqbmdJZj1cIiFoaWRlVG9EYXRlXCIgW2NsYXNzLmRpc2FibGVkXT1cIiFkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTJkOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0b19kYXRlXCIgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRUb0RhdGUgfCBkYXRlIDogJ2RkIE1NTSB5eXl5J1xuICAgICAgICAgICAgICAgICAgICAgIFwiIFtwbGFjZWhvbGRlcl09XCInVG8nXCIgKGNsaWNrKT1cIm9wZW5Ub0RhdGVQaWNrZXIoKVwiIHJlYWRvbmx5IC8+XG4gICAgICAgICAgICAgICAgICAgIDxkcC1kYXRlLXBpY2tlciAjdG9EYXRlUGlja2VyIFsobmdNb2RlbCldPVwiZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlVG9EYXRlUGlja2VyKCk7IGRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICBcIiBbY29uZmlnXT1cInRvRGF0ZVBpY2tlckNvbmZpZ1wiPjwvZHAtZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCIgKGNsaWNrKT1cImNsb3NlVG9EYXRlUGlja2VyKClcIiAqbmdJZj1cImRhdGVQaWNrZXJPdmVybGF5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZ4LXR4dC1lcnJvclwiIFthcHBTY3JvbGxJblZpZXddPVwidHJ1ZVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJlxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJvbURhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIWRhc2hib2FyZEZvcm0uc2VsZWN0ZWRUb0RhdGVcbiAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgdGltZS1mcmFtZS5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEVtYWlsIFN1bW1hcnkgLS0+XG4gICAgICAgICAgPCEtLSA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdmcmVxdWVuY3knXCJcbiAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgJiZcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICdmcmVxdWVuY3knICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtuZ1NyY109XCJBU1NFVFMuZGFzaEJvYXJkRW1haWxTdW1tYXJpZXNJY29uXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMzZcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjM2XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrSWNvblwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA1MiA1MlwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrSWNvbl9fY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgIGN4PVwiMjZcIlxuICAgICAgICAgICAgICAgICAgY3k9XCIyNlwiXG4gICAgICAgICAgICAgICAgICByPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tJY29uX19jaGVja1wiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgPkVtYWlsIFN1bW1hcmllczwvbGFiZWxcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidngtY29udHJvbC1wYW5lbC1zdWItbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgPklmIHlvdSB3b3VsZCBsaWtlIHRvIHNlbmQgYSBzdW1tYXJ5IG9mIHRoaXMgRGFzaGJvYXJkLCBwbGVhc2VcbiAgICAgICAgICAgICAgICAgIHNlbGVjdCBhIGZyZXF1ZW5jeShCeSBkZWZhdWx0IFZDb21wbHkgc2VuZHMgYSB3ZWVrbHlcbiAgICAgICAgICAgICAgICAgIFN1bW1hcnkpLjwvbGFiZWxcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Qm94RW5hYmxlIHZ4LXBsLTMgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCdmcmVxdWVuY3knLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveFBsYWNlaG9kZXIgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1saC00XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgRW1haWwgU3VtbWFyaWVzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Qm94U3VjY2VzcyB2eC1wbC0yIHZ4LXByLTMgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hUZXh0IHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHRcIlxuICAgICAgICAgICAgICAgICAgICBbYXJUb29sdGlwXT1cImRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgZGVsYXk9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ2ZyZXF1ZW5jeSdcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0QnRuIHZ4LWZzLTExIHZ4LWZ3LTYwMCB2eC10eHQtYmx1ZSB2eC10dC11cHBlcmNhc2UgdngtcC0wIHZ4LW0tMCB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ2ZyZXF1ZW5jeScsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkwYzs8L2k+IEVESVRcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tYmxvY2tcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidngtYnRuIGJsb2NrIHByaW1hcnlcIiBbZGlzYWJsZWRdPVwiYWN0aXZlU2VsZWN0b3IgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29uZmlndXJlRGFzaGJvYXJkKClcIj5cbiAgICAgICAgICAgIE5leHQ6IENvbmZpZ3VyZSBXaWRnZXRzXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1kaWFsb2dcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2UuZW1pdCh7IG1vZGU6ICdkaXNjYXJkJyB9KVwiIFthclRvb2x0aXBdPVwiJ1tFc2NdIHRvIGNsb3NlJ1wiIHBsYWNlbWVudD1cImxlZnRcIiB0eXBlPVwiYmxhY2tcIiBkZWxheT1cIjBcIlxuICAgICAgICBbdG9vbHRpcE1hbmRhdG9yeV09XCJ0cnVlXCIgW2NsYXNzLmhpZGVdPVwiYWN0aXZlU2VsZWN0b3IgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImljb25zXCI+JiN4ZTkzZjs8L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtY29uZmlybWF0aW9uLWFsZXJ0XCIgKm5nSWY9XCJcbiAgICAgICAgICBzdWJtaXR0ZWQgJiZcbiAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID09IDAgXG4gICAgICAgIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWNvbmZpcm1hdGlvbi1hbGVydC10b3BcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYmxvY2tcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTMwOzwvaT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0XCIgKm5nSWY9XCJzaG93Umlza0NhdGVnb3J5XCI+XG4gICAgICAgICAgICBTZWxlY3QgYSBSZXNwb25zaWJpbGl0eSBDZW50ZXIgb3IgUmlzayBDYXRlZ29yeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0XCIgKm5nSWY9XCIhc2hvd1Jpc2tDYXRlZ29yeVwiPlxuICAgICAgICAgICAgU2VsZWN0IGEgUmVzcG9uc2liaWxpdHkgQ2VudGVyLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtY29uZmlybWF0aW9uLWFsZXJ0LWJvdHRvbVwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwibWVzc2FnZVwiPjwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic3VibWl0dGVkID0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgT0tBWVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxhcHAtc21pbGV5LWRpYWxvZyAqbmdJZj1cImlzU21pbGV5XCIgW21lc3NhZ2VdPVwic21pbGV5TWVzc2FnZVwiPjwvYXBwLXNtaWxleS1kaWFsb2c+XG5cbjxhcHAtY29uZmlndXJlLXdpZGdldHMgKm5nSWY9XCJvcGVuQ29uZmlndXJlV2lkZ2V0c1wiIFttb2RlXT1cIm1vZGVcIiBbZGlzcGxheWVkV2lkZ2V0c109XCJkaXNwbGF5ZWRXaWRnZXRzXCJcbiAgW3Nob3dSaXNrXT1cInNob3dSaXNrV2lkZ2V0c1wiIFtzaG93Q29tcGxpYW5jZV09XCIhc2hvd0NvbXBsaWFuY2VXaWRnZXRzXCIgW3NlbGVjdGVkV2lkZ2V0c0RhdGFdPVwic2VsZWN0ZWRXaWRnZXRzXCJcbiAgKHdpZGdldHNEYXRhTW9kaWZpZWQpPVwic2V0U2VsZWN0ZWRXaWRnZXRzKCRldmVudClcIlxuICAoY2xvc2VDb25maWd1cmVXaWRnZXRzKT1cImNsb3NlQ29uZmlndXJlV2lkZ2V0cygkZXZlbnQpXCI+PC9hcHAtY29uZmlndXJlLXdpZGdldHM+Il19
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import { forkJoin } from 'rxjs';
|
|
4
|
+
import { finalize, map } from 'rxjs/operators';
|
|
5
|
+
import { TextCountPipe } from './pipes/text-count.pipe';
|
|
6
|
+
import { ASSETS } from './constants/assets.constant';
|
|
7
|
+
import { PROGRAM_LIST_API } from './program-list/constant';
|
|
8
|
+
import { buildProgramSelectionMapFromCategories, extractCategoryIdsFromDashboard, extractProgramIdsFromDashboard, extractRcIdsFromDashboard, filterActiveWidgets, flattenProgramSelectionMap, getEditDashboardCdid, getSelectedProgramsMap, hasProgramSelectionInMap, normalizeIdArray, normalizeProgramCategories, normalizeProgramSelectionMap, parseSailsProgramList, } from './utils/dashboard-edit.utils';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "./services/create-dashboard.service";
|
|
11
|
+
import * as i2 from "./services/pagination.service";
|
|
12
|
+
import * as i3 from "../ui-kit/snack-bar/snack-bar.service";
|
|
13
|
+
import * as i4 from "../ui-kit/popover/popover.service";
|
|
14
|
+
import * as i5 from "./pipes/text-count.pipe";
|
|
15
|
+
import * as i6 from "@angular/common";
|
|
16
|
+
import * as i7 from "@vcomply/editor";
|
|
17
|
+
import * as i8 from "@angular/forms";
|
|
18
|
+
import * as i9 from "../ui-kit/tooltip/tooltip.directive";
|
|
19
|
+
import * as i10 from "./configure-widgets/configure-widgets/configure-widgets.component";
|
|
20
|
+
import * as i11 from "../ui-kit/popover/popover.component";
|
|
21
|
+
import * as i12 from "../ui-kit/popover/popover.directive";
|
|
22
|
+
import * as i13 from "../ui-kit/v-loader/loader-inline/loader-inline.component";
|
|
23
|
+
import * as i14 from "../ui-kit/snack-bar/snack-bar/snack-bar.component";
|
|
24
|
+
import * as i15 from "./directives/scroll-in-view.directive";
|
|
25
|
+
import * as i16 from "../ui-kit/smiley-dialog/smiley-dialog.component";
|
|
26
|
+
import * as i17 from "ng2-date-picker";
|
|
27
|
+
import * as i18 from "./program-list/program-list/program-list.component";
|
|
28
|
+
import * as i19 from "./program-list/list-container/list-container.component";
|
|
29
|
+
import * as i20 from "./program-list/information-block/information-block.component";
|
|
30
|
+
import * as i21 from "./user-list/user-list.component";
|
|
31
|
+
import * as i22 from "./responsibility-center/responsibility-center.component";
|
|
32
|
+
export class CreateDashboardComponent {
|
|
33
|
+
createDashboardService;
|
|
34
|
+
paginationService;
|
|
35
|
+
cdr;
|
|
36
|
+
snackBar;
|
|
37
|
+
popoverService;
|
|
38
|
+
textCount;
|
|
39
|
+
feature;
|
|
40
|
+
activeSelector = '';
|
|
41
|
+
disabled = false;
|
|
42
|
+
mode = 'CREATE';
|
|
43
|
+
dashboardId = '';
|
|
44
|
+
dashboardDetails = null; // for edit dashboard
|
|
45
|
+
/** API dashboard object from createDashboard response (used when navigating after create). */
|
|
46
|
+
createdDashboard = null;
|
|
47
|
+
/** True after CREATE API succeeds; widget save should emit `created` for app redirect. */
|
|
48
|
+
redirectAfterCreate = false;
|
|
49
|
+
close = new EventEmitter();
|
|
50
|
+
createdBy = 0;
|
|
51
|
+
fromDatePicker;
|
|
52
|
+
toDatePicker;
|
|
53
|
+
animation = true;
|
|
54
|
+
configureWidget = false;
|
|
55
|
+
ASSETS = ASSETS;
|
|
56
|
+
totalPages = 1;
|
|
57
|
+
totalList = 1;
|
|
58
|
+
usersList = [];
|
|
59
|
+
vLoader = true;
|
|
60
|
+
userListLoaded = false;
|
|
61
|
+
groupListLoaded = false;
|
|
62
|
+
rcListLoaded = false;
|
|
63
|
+
hideToDate = false;
|
|
64
|
+
listDetails = {
|
|
65
|
+
selectedUsersList: [],
|
|
66
|
+
selectedGroupList: [],
|
|
67
|
+
nonRemovableUsersList: [],
|
|
68
|
+
displayElementKey: 'member_name',
|
|
69
|
+
displayGroupKey: 'group_name',
|
|
70
|
+
groupIdkey: 'group_id',
|
|
71
|
+
elementIdKey: 'member_id',
|
|
72
|
+
tooltipKey: 'member_email',
|
|
73
|
+
};
|
|
74
|
+
dashboardDescription = {
|
|
75
|
+
placeholder: 'Description (Max limit: 250 characters)',
|
|
76
|
+
mode: 'prime',
|
|
77
|
+
id: 'description',
|
|
78
|
+
};
|
|
79
|
+
responsibilityCategoriesTree = {
|
|
80
|
+
regulations: {
|
|
81
|
+
list: [],
|
|
82
|
+
selectedList: [],
|
|
83
|
+
},
|
|
84
|
+
standards: {
|
|
85
|
+
list: [],
|
|
86
|
+
selectedList: [],
|
|
87
|
+
},
|
|
88
|
+
internalControls: {
|
|
89
|
+
list: [],
|
|
90
|
+
selectedList: [],
|
|
91
|
+
},
|
|
92
|
+
others: {
|
|
93
|
+
list: [],
|
|
94
|
+
selectedList: [],
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
allComplianceCategories = [];
|
|
98
|
+
allRiskCategories = [];
|
|
99
|
+
showRiskCategory = false;
|
|
100
|
+
showCriteria = true;
|
|
101
|
+
dashboardForm = {
|
|
102
|
+
dashboardName: '',
|
|
103
|
+
dashboardDescriptionText: '',
|
|
104
|
+
selectedViewers: [],
|
|
105
|
+
selectedGroup: [],
|
|
106
|
+
selectedFromDate: undefined,
|
|
107
|
+
selectedToDate: undefined,
|
|
108
|
+
selectedResponsibilityCenters: [],
|
|
109
|
+
selectedResponsibilityCategories: [],
|
|
110
|
+
selectedRiskCategories: [],
|
|
111
|
+
displayCriteria: 'or',
|
|
112
|
+
configureWidget: [],
|
|
113
|
+
frequencyDetails: '',
|
|
114
|
+
selectedFrequencyType: '',
|
|
115
|
+
selectedFrequencies: [0],
|
|
116
|
+
frequencyMessage: '',
|
|
117
|
+
frequencyDate: 1,
|
|
118
|
+
};
|
|
119
|
+
openConfigureWidgets = false;
|
|
120
|
+
selectedWidgets = [];
|
|
121
|
+
displayedWidgets = [];
|
|
122
|
+
responsibilityCentersList = [];
|
|
123
|
+
datePickerOverlay = false;
|
|
124
|
+
dayNames = [
|
|
125
|
+
'Monday',
|
|
126
|
+
'Tuesday',
|
|
127
|
+
'Wednesday',
|
|
128
|
+
'Thursday',
|
|
129
|
+
'Friday',
|
|
130
|
+
'Saturday',
|
|
131
|
+
'Sunday',
|
|
132
|
+
];
|
|
133
|
+
monthNames = [
|
|
134
|
+
'January',
|
|
135
|
+
'February',
|
|
136
|
+
'March',
|
|
137
|
+
'April',
|
|
138
|
+
'May',
|
|
139
|
+
'June',
|
|
140
|
+
'July',
|
|
141
|
+
'August',
|
|
142
|
+
'September',
|
|
143
|
+
'October',
|
|
144
|
+
'November',
|
|
145
|
+
'December',
|
|
146
|
+
];
|
|
147
|
+
quarters = [
|
|
148
|
+
'January, April, July, October',
|
|
149
|
+
'February, May, August, November',
|
|
150
|
+
'March, June, September, December',
|
|
151
|
+
];
|
|
152
|
+
showRiskWidgets = false;
|
|
153
|
+
showComplianceWidgets = false;
|
|
154
|
+
isManageRisk = false;
|
|
155
|
+
riskCategoryList = {
|
|
156
|
+
strategic: {
|
|
157
|
+
list: [],
|
|
158
|
+
selectedList: [],
|
|
159
|
+
},
|
|
160
|
+
operational: {
|
|
161
|
+
list: [],
|
|
162
|
+
selectedList: [],
|
|
163
|
+
},
|
|
164
|
+
compliance: {
|
|
165
|
+
list: [],
|
|
166
|
+
selectedList: [],
|
|
167
|
+
},
|
|
168
|
+
others: {
|
|
169
|
+
list: [],
|
|
170
|
+
selectedList: [],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
programListUrl = PROGRAM_LIST_API;
|
|
174
|
+
datePickerBaseConfig = {
|
|
175
|
+
openOnClick: false,
|
|
176
|
+
openOnFocus: false,
|
|
177
|
+
hideInputContainer: true,
|
|
178
|
+
hideOnOutsideClick: true,
|
|
179
|
+
};
|
|
180
|
+
fromDatePickerConfig = {
|
|
181
|
+
...this.datePickerBaseConfig,
|
|
182
|
+
min: this.getCurrentDate(),
|
|
183
|
+
};
|
|
184
|
+
toDatePickerConfig = {
|
|
185
|
+
...this.datePickerBaseConfig,
|
|
186
|
+
};
|
|
187
|
+
isSmiley;
|
|
188
|
+
smileyMessage = '';
|
|
189
|
+
groupList;
|
|
190
|
+
groupsEnabled = true;
|
|
191
|
+
totalgroups;
|
|
192
|
+
openedDatePicker = '';
|
|
193
|
+
selectedPrograms = {};
|
|
194
|
+
allProgamSelected = [];
|
|
195
|
+
pendingEditRcIds = [];
|
|
196
|
+
pendingEditRcEntries = [];
|
|
197
|
+
editFormHydrated = false;
|
|
198
|
+
/** Tracks in-flight EDIT hydration HTTP calls; loader stays on until zero. */
|
|
199
|
+
editHydrationCount = 0;
|
|
200
|
+
constructor(createDashboardService, paginationService, cdr, snackBar, popoverService, textCount) {
|
|
201
|
+
this.createDashboardService = createDashboardService;
|
|
202
|
+
this.paginationService = paginationService;
|
|
203
|
+
this.cdr = cdr;
|
|
204
|
+
this.snackBar = snackBar;
|
|
205
|
+
this.popoverService = popoverService;
|
|
206
|
+
this.textCount = textCount;
|
|
207
|
+
}
|
|
208
|
+
ngOnChanges(changes) {
|
|
209
|
+
if (this.createdBy) {
|
|
210
|
+
this.listDetails.nonRemovableUsersList.push(this.createdBy);
|
|
211
|
+
}
|
|
212
|
+
if (this.mode === 'EDIT' &&
|
|
213
|
+
changes['dashboardDetails']?.currentValue &&
|
|
214
|
+
this.rcListLoaded &&
|
|
215
|
+
this.userListLoaded &&
|
|
216
|
+
this.groupListLoaded) {
|
|
217
|
+
this.hydrateEditForm();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
onKeydownHandler(event) {
|
|
221
|
+
this.close.emit({ mode: 'discard' });
|
|
222
|
+
this.isSmiley = false;
|
|
223
|
+
}
|
|
224
|
+
ngOnInit() {
|
|
225
|
+
this.animateContainer();
|
|
226
|
+
this.getRCList();
|
|
227
|
+
this.checkWhetherAllListsLoaded();
|
|
228
|
+
this.getUsersList('');
|
|
229
|
+
this.getGroupList();
|
|
230
|
+
this.getUserInfo();
|
|
231
|
+
}
|
|
232
|
+
animateContainer() {
|
|
233
|
+
this.animation = true;
|
|
234
|
+
setTimeout(() => {
|
|
235
|
+
this.animation = false;
|
|
236
|
+
}, 300);
|
|
237
|
+
}
|
|
238
|
+
getUserInfo() {
|
|
239
|
+
this.createDashboardService.getUserInformation().subscribe((res) => {
|
|
240
|
+
this.setPermission(res?.roleActions);
|
|
241
|
+
const quickLink = res.quick_link;
|
|
242
|
+
if (quickLink.risk) {
|
|
243
|
+
this.showRiskCategory = true;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
this.showRiskCategory = false;
|
|
247
|
+
}
|
|
248
|
+
}, (error) => {
|
|
249
|
+
console.error(error);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Displays the listing pages the left side of policy form to set and edit the dropdown fields values
|
|
254
|
+
* @param type holds name of particular list is to be displayed
|
|
255
|
+
* @param event contains boolean value to display the list or not
|
|
256
|
+
*/
|
|
257
|
+
activateSelector(type, event) {
|
|
258
|
+
if (type == 'frequency' || this.activeSelector == 'frequency') {
|
|
259
|
+
this.showCriteria = false;
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
this.showCriteria = true;
|
|
262
|
+
}, 1);
|
|
263
|
+
}
|
|
264
|
+
if (type === 'responsibilityCategories' && event) {
|
|
265
|
+
this.syncProgramSelectionMapFromForm();
|
|
266
|
+
this.ensureProgramSelectionMapForList();
|
|
267
|
+
}
|
|
268
|
+
this.activeSelector = event ? type : '';
|
|
269
|
+
}
|
|
270
|
+
onProgramSelectionChange(items) {
|
|
271
|
+
this.selectedPrograms = items;
|
|
272
|
+
this.allProgamSelected = [].concat(...Object.values(items));
|
|
273
|
+
}
|
|
274
|
+
selectCategory() {
|
|
275
|
+
this.dashboardForm.selectedResponsibilityCategories =
|
|
276
|
+
normalizeProgramCategories(this.allProgamSelected);
|
|
277
|
+
this.applyResponsibilityCategoryWidgetFilters();
|
|
278
|
+
this.activateSelector('', false);
|
|
279
|
+
}
|
|
280
|
+
checkDefaultProgramOnRemove(event) {
|
|
281
|
+
this.allProgamSelected = this.allProgamSelected.filter((program) => program?.id !== event?.id);
|
|
282
|
+
this.removeProgram(event);
|
|
283
|
+
}
|
|
284
|
+
removeProgram(program) {
|
|
285
|
+
const keys = Object.keys(this.selectedPrograms);
|
|
286
|
+
keys.forEach((key) => {
|
|
287
|
+
const index = this.selectedPrograms[key].findIndex((item) => item?.id === program?.id);
|
|
288
|
+
if (index !== -1) {
|
|
289
|
+
this.selectedPrograms[key].splice(index, 1);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
syncProgramSelectionMapFromForm() {
|
|
294
|
+
if (hasProgramSelectionInMap(this.selectedPrograms)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const flat = this.allProgamSelected?.length > 0
|
|
298
|
+
? this.allProgamSelected
|
|
299
|
+
: this.dashboardForm.selectedResponsibilityCategories ?? [];
|
|
300
|
+
const fromForm = buildProgramSelectionMapFromCategories(flat, this.allComplianceCategories);
|
|
301
|
+
if (hasProgramSelectionInMap(fromForm)) {
|
|
302
|
+
this.applyProgramSelectionMap(fromForm);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
hydrateProgramsFromDashboardData(data) {
|
|
306
|
+
if (!data) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
const programsRaw = data?.programs ?? data?.programId ?? data?.programIds;
|
|
310
|
+
if (Array.isArray(programsRaw) &&
|
|
311
|
+
programsRaw.length &&
|
|
312
|
+
typeof programsRaw[0] === 'object') {
|
|
313
|
+
const chips = programsRaw.map((p) => ({
|
|
314
|
+
id: p?.id ?? p?.programId,
|
|
315
|
+
category_id: p?.id ?? p?.programId,
|
|
316
|
+
name: p?.name ?? p?.item_name,
|
|
317
|
+
item_name: p?.name ?? p?.item_name,
|
|
318
|
+
programId: p?.id ?? p?.programId,
|
|
319
|
+
}));
|
|
320
|
+
this.allProgamSelected = normalizeProgramCategories(chips);
|
|
321
|
+
this.dashboardForm.selectedResponsibilityCategories = [
|
|
322
|
+
...this.allProgamSelected,
|
|
323
|
+
];
|
|
324
|
+
const map = buildProgramSelectionMapFromCategories(chips, this.allComplianceCategories);
|
|
325
|
+
if (Object.keys(map).length) {
|
|
326
|
+
this.selectedPrograms = map;
|
|
327
|
+
}
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
const program = data?.program ?? {};
|
|
331
|
+
const selectedMap = getSelectedProgramsMap(data);
|
|
332
|
+
if (selectedMap && hasProgramSelectionInMap(selectedMap)) {
|
|
333
|
+
this.applyProgramSelectionMap(selectedMap);
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
const allPrograms = program?.all_programs;
|
|
337
|
+
if (Array.isArray(allPrograms) && allPrograms.length) {
|
|
338
|
+
if (typeof allPrograms[0] === 'object') {
|
|
339
|
+
const map = buildProgramSelectionMapFromCategories(allPrograms, this.allComplianceCategories);
|
|
340
|
+
if (hasProgramSelectionInMap(map)) {
|
|
341
|
+
this.applyProgramSelectionMap(map);
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
this.allProgamSelected = normalizeProgramCategories(allPrograms);
|
|
345
|
+
this.dashboardForm.selectedResponsibilityCategories = [
|
|
346
|
+
...this.allProgamSelected,
|
|
347
|
+
];
|
|
348
|
+
return this.allProgamSelected.length > 0;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const categoryIds = extractCategoryIdsFromDashboard(data);
|
|
352
|
+
if (categoryIds.length) {
|
|
353
|
+
const stubs = categoryIds.map((id) => ({
|
|
354
|
+
category_id: id,
|
|
355
|
+
id,
|
|
356
|
+
item_name: `Category ${id}`,
|
|
357
|
+
}));
|
|
358
|
+
this.allProgamSelected = normalizeProgramCategories(stubs);
|
|
359
|
+
this.dashboardForm.selectedResponsibilityCategories = [
|
|
360
|
+
...this.allProgamSelected,
|
|
361
|
+
];
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
applyFlatProgramCategories(categories) {
|
|
367
|
+
if (!categories?.length) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
this.allProgamSelected = normalizeProgramCategories(categories);
|
|
371
|
+
this.dashboardForm.selectedResponsibilityCategories = [
|
|
372
|
+
...this.allProgamSelected,
|
|
373
|
+
];
|
|
374
|
+
const map = buildProgramSelectionMapFromCategories(categories, this.allComplianceCategories);
|
|
375
|
+
if (hasProgramSelectionInMap(map)) {
|
|
376
|
+
this.selectedPrograms = map;
|
|
377
|
+
}
|
|
378
|
+
this.cdr.detectChanges();
|
|
379
|
+
}
|
|
380
|
+
applyResponsibilityCategoryWidgetFilters() {
|
|
381
|
+
if (this.dashboardForm.selectedResponsibilityCenters.length !== 0) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (this.dashboardForm.selectedResponsibilityCategories.length === 0) {
|
|
385
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
|
|
386
|
+
}
|
|
387
|
+
else if (this.dashboardForm.selectedRiskCategories.length === 0) {
|
|
388
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
openFromDatePicker(event) {
|
|
392
|
+
event?.stopPropagation();
|
|
393
|
+
this.toDatePicker?.api?.close();
|
|
394
|
+
this.openedDatePicker = 'FROM_DATE';
|
|
395
|
+
this.fromDatePicker?.api?.open();
|
|
396
|
+
this.datePickerOverlay = true;
|
|
397
|
+
}
|
|
398
|
+
openToDatePicker(event) {
|
|
399
|
+
event?.stopPropagation();
|
|
400
|
+
this.fromDatePicker?.api?.close();
|
|
401
|
+
this.openedDatePicker = 'TO_DATE';
|
|
402
|
+
this.toDatePicker?.api?.open();
|
|
403
|
+
this.datePickerOverlay = true;
|
|
404
|
+
}
|
|
405
|
+
closeFromDatePicker() {
|
|
406
|
+
this.fromDatePicker?.api?.close();
|
|
407
|
+
if (!this.dashboardForm.selectedFromDate) {
|
|
408
|
+
this.dashboardForm.selectedToDate = undefined;
|
|
409
|
+
this.hideToDate = true;
|
|
410
|
+
setTimeout(() => {
|
|
411
|
+
this.hideToDate = false;
|
|
412
|
+
}, 20);
|
|
413
|
+
this.fromDatePicker.api.close();
|
|
414
|
+
this.datePickerOverlay = false;
|
|
415
|
+
this.openedDatePicker = '';
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
let minToDate = this.setToDate(this.dashboardForm.selectedFromDate);
|
|
419
|
+
this.toDatePickerConfig = { ...this.datePickerBaseConfig, min: minToDate };
|
|
420
|
+
const fromDate = new Date(minToDate.split('-').reverse().join('-'));
|
|
421
|
+
const toDate = new Date(this.dashboardForm.selectedToDate);
|
|
422
|
+
const inValidDate = fromDate >= toDate ? true : false;
|
|
423
|
+
if (inValidDate) {
|
|
424
|
+
this.dashboardForm.selectedToDate = undefined;
|
|
425
|
+
this.hideToDate = true;
|
|
426
|
+
setTimeout(() => {
|
|
427
|
+
this.hideToDate = false;
|
|
428
|
+
}, 20);
|
|
429
|
+
}
|
|
430
|
+
this.datePickerOverlay = false;
|
|
431
|
+
this.openedDatePicker = '';
|
|
432
|
+
}
|
|
433
|
+
closeToDatePicker() {
|
|
434
|
+
this.toDatePicker?.api?.close();
|
|
435
|
+
this.datePickerOverlay = false;
|
|
436
|
+
this.openedDatePicker = '';
|
|
437
|
+
}
|
|
438
|
+
animateImage() {
|
|
439
|
+
const circleImage = document.getElementsByClassName('image');
|
|
440
|
+
}
|
|
441
|
+
saveFrequency(eventValues) {
|
|
442
|
+
this.dashboardForm.selectedFrequencyType = eventValues.frequencyType;
|
|
443
|
+
this.dashboardForm.selectedFrequencies = eventValues.frequencies;
|
|
444
|
+
this.dashboardForm.frequencyMessage = eventValues.frequencyString;
|
|
445
|
+
this.dashboardForm.frequencyDate = eventValues.selectedDate;
|
|
446
|
+
this.activateSelector('', false);
|
|
447
|
+
}
|
|
448
|
+
getCurrentDate() {
|
|
449
|
+
let today = new Date();
|
|
450
|
+
return dayjs(today).format('DD-MM-YYYY');
|
|
451
|
+
}
|
|
452
|
+
setToDate(data) {
|
|
453
|
+
let today = new Date(data);
|
|
454
|
+
return dayjs(today).format('DD-MM-YYYY');
|
|
455
|
+
}
|
|
456
|
+
getFromDate(data) {
|
|
457
|
+
let today = new Date(data);
|
|
458
|
+
return (today.getDate() + '-' + (today.getMonth() + 1) + '-' + today.getFullYear());
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* @param data - the date you want to format
|
|
462
|
+
* @returns Date string in YYYY-MM-DD format, e.g. 2026-05-19
|
|
463
|
+
*/
|
|
464
|
+
getDateFormate(data) {
|
|
465
|
+
return dayjs(data).format('YYYY-MM-DD');
|
|
466
|
+
}
|
|
467
|
+
configureDashboard() {
|
|
468
|
+
let fieldsStatus = this.validateDashboard();
|
|
469
|
+
if (!fieldsStatus) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
this.vLoader = true;
|
|
473
|
+
this.onSubmitDashboard();
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Get users list by making api call and pre selects all admins by adding to viewers
|
|
477
|
+
* @param url contains query params for organization users api
|
|
478
|
+
*/
|
|
479
|
+
getUsersList(url) {
|
|
480
|
+
this.createDashboardService.getAllUsers().subscribe((res) => {
|
|
481
|
+
this.usersList = res;
|
|
482
|
+
this.userListLoaded = true;
|
|
483
|
+
if (this.mode === 'EDIT') {
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
this.dashboardForm.selectedViewers = this.setList(this.usersList, [this.createdBy], 'member_id');
|
|
487
|
+
this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
|
|
488
|
+
this.vLoader = false;
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
getGroupList() {
|
|
493
|
+
this.createDashboardService.getAllGroups().subscribe((res) => {
|
|
494
|
+
this.totalgroups = res.total_items;
|
|
495
|
+
this.groupList = res.data;
|
|
496
|
+
this.groupListLoaded = true;
|
|
497
|
+
if (this.mode === 'EDIT') {
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
this.dashboardForm.selectedGroup = this.setList(this.groupList, [this.createdBy], 'group_id');
|
|
501
|
+
this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
|
|
502
|
+
this.vLoader = false;
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* It is to ensure whether all required lists on Policy from is loaded from the api call or not
|
|
508
|
+
*/
|
|
509
|
+
checkWhetherAllListsLoaded() {
|
|
510
|
+
// Category trees are no longer eagerly loaded here; these flags were never flipped and blocked EDIT indefinitely.
|
|
511
|
+
if (this.rcListLoaded && this.userListLoaded && this.groupListLoaded) {
|
|
512
|
+
if (this.mode === 'EDIT') {
|
|
513
|
+
this.hydrateEditForm();
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
this.vLoader = false;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
setTimeout(() => {
|
|
521
|
+
this.checkWhetherAllListsLoaded();
|
|
522
|
+
}, 300);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
setSelectedWidgets(data) {
|
|
526
|
+
if (this.mode === 'CREATE') {
|
|
527
|
+
const widgetsArray = [];
|
|
528
|
+
data.forEach((element) => {
|
|
529
|
+
let obj = {};
|
|
530
|
+
obj.module_name = element.module;
|
|
531
|
+
obj.widget_name = element.title;
|
|
532
|
+
obj.widget_code = element.id;
|
|
533
|
+
obj.sub_widgets = [];
|
|
534
|
+
obj.state = 'ACTIVE';
|
|
535
|
+
if (element.subWidgets.length > 0) {
|
|
536
|
+
element.subWidgets.forEach((subWidget) => {
|
|
537
|
+
let subWidgetObject = {};
|
|
538
|
+
subWidgetObject.widget_name = subWidget.title;
|
|
539
|
+
subWidgetObject.widget_code = subWidget.id;
|
|
540
|
+
subWidgetObject.state = subWidget.value ? 'ACTIVE' : 'INACTIVE';
|
|
541
|
+
obj.sub_widgets.push(Object.assign(subWidgetObject));
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
widgetsArray.push(obj);
|
|
545
|
+
});
|
|
546
|
+
this.dashboardForm.configureWidget = widgetsArray;
|
|
547
|
+
}
|
|
548
|
+
else if (this.mode === 'EDIT') {
|
|
549
|
+
const widgetsArray = [];
|
|
550
|
+
data.forEach((element) => {
|
|
551
|
+
if (!this.extractWidgetCodes(this.dashboardForm.configureWidget).includes(element.id)) {
|
|
552
|
+
let obj = {};
|
|
553
|
+
obj.module_name = element.module;
|
|
554
|
+
obj._id = '';
|
|
555
|
+
obj.widget_name = element.title;
|
|
556
|
+
obj.widget_code = element.id;
|
|
557
|
+
obj.sub_widgets = [];
|
|
558
|
+
obj.state = 'ACTIVE';
|
|
559
|
+
if (element.subWidgets.length > 0) {
|
|
560
|
+
element.subWidgets.forEach((subWidget) => {
|
|
561
|
+
let subWidgetObject = {};
|
|
562
|
+
subWidgetObject._id = '';
|
|
563
|
+
subWidgetObject.widget_name = subWidget.title;
|
|
564
|
+
subWidgetObject.widget_code = subWidget.id;
|
|
565
|
+
subWidgetObject.state = subWidget.value ? 'ACTIVE' : 'INACTIVE';
|
|
566
|
+
obj.sub_widgets.push(subWidgetObject);
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
this.dashboardForm.configureWidget.push(obj);
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
const index = this.selectedWidgets.findIndex((ele) => ele.widget_code == element.id);
|
|
573
|
+
if (index != -1) {
|
|
574
|
+
this.selectedWidgets[index].state = 'ACTIVE';
|
|
575
|
+
if (this.selectedWidgets[index].sub_widgets.length > 0) {
|
|
576
|
+
this.selectedWidgets[index].sub_widgets.forEach((subWidgetData) => {
|
|
577
|
+
const elementIndex = element.subWidgets.findIndex((ele) => ele.id == subWidgetData.widget_code);
|
|
578
|
+
if (elementIndex != -1) {
|
|
579
|
+
subWidgetData.state = element.subWidgets[elementIndex].value
|
|
580
|
+
? 'ACTIVE'
|
|
581
|
+
: 'INACTIVE';
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
this.dashboardForm.configureWidget.forEach((savedWidget) => {
|
|
589
|
+
const index = data.findIndex((dataElement) => dataElement.id == savedWidget.widget_code);
|
|
590
|
+
if (index == -1) {
|
|
591
|
+
savedWidget.state = 'INACTIVE';
|
|
592
|
+
if (savedWidget.sub_widgets.length > 0) {
|
|
593
|
+
savedWidget.sub_widgets.forEach((saveSubWidget) => {
|
|
594
|
+
saveSubWidget.state = 'INACTIVE';
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
this.selectedWidgets = data;
|
|
601
|
+
this.openConfigureWidgets = false;
|
|
602
|
+
this.submitDashboard();
|
|
603
|
+
}
|
|
604
|
+
extractWidgetCodes(widgets) {
|
|
605
|
+
const widgetCodes = [];
|
|
606
|
+
widgets?.forEach((widget) => {
|
|
607
|
+
if (widget?.widget_code) {
|
|
608
|
+
widgetCodes.push(widget?.widget_code);
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
return widgetCodes;
|
|
612
|
+
}
|
|
613
|
+
closeConfigureWidgets(event) {
|
|
614
|
+
this.openConfigureWidgets = event;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Filter list user's list based on pagination by making api call
|
|
618
|
+
* @param event specifies a boolean value to call api
|
|
619
|
+
*/
|
|
620
|
+
paginationFilter(event) {
|
|
621
|
+
if (event) {
|
|
622
|
+
this.getUsersList({
|
|
623
|
+
p: this.paginationService.currentPage === 1
|
|
624
|
+
? ''
|
|
625
|
+
: this.paginationService.currentPage,
|
|
626
|
+
type: 'all_except_executive',
|
|
627
|
+
q: !this.paginationService.searchValue
|
|
628
|
+
? ''
|
|
629
|
+
: this.paginationService.searchValue,
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
getRCList() {
|
|
634
|
+
this.createDashboardService.getResponsibilityCenterList().subscribe((res) => {
|
|
635
|
+
this.responsibilityCentersList = this.normalizeRcList(res);
|
|
636
|
+
this.rcListLoaded = true;
|
|
637
|
+
this.applyPendingResponsibilityCenters();
|
|
638
|
+
if (this.mode === 'EDIT') {
|
|
639
|
+
const ids = this.responsibilityCentersList.filter((rc) => this.dashboardDetails?.responsibilityCenters.includes(rc.rcid)).map((rc) => rc.item_id);
|
|
640
|
+
this.saveSelectedList('rc', ids);
|
|
641
|
+
}
|
|
642
|
+
}, (err) => {
|
|
643
|
+
console.error(err);
|
|
644
|
+
this.rcListLoaded = true;
|
|
645
|
+
this.applyPendingResponsibilityCenters();
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* #### Description
|
|
650
|
+
*
|
|
651
|
+
* Returns the unique array of object based on unique key
|
|
652
|
+
* @param array
|
|
653
|
+
* @param key
|
|
654
|
+
* @returns
|
|
655
|
+
*/
|
|
656
|
+
uniqueByProp(array, key) {
|
|
657
|
+
return Array.from(array
|
|
658
|
+
.reduce((acc, item) => (item && item[key] && acc.set(item[key], item), acc), new Map())
|
|
659
|
+
.values());
|
|
660
|
+
}
|
|
661
|
+
saveSelectedList(type, selectedItems) {
|
|
662
|
+
switch (type) {
|
|
663
|
+
case 'rc':
|
|
664
|
+
this.dashboardForm.selectedResponsibilityCenters = this.setList(this.responsibilityCentersList, selectedItems, 'item_id');
|
|
665
|
+
if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
|
|
666
|
+
if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
|
|
667
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
|
|
668
|
+
}
|
|
669
|
+
else if (this.dashboardForm.selectedRiskCategories.length == 0) {
|
|
670
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
break;
|
|
674
|
+
case 'whoCanView':
|
|
675
|
+
this.dashboardForm.selectedViewers = this.uniqueByProp(selectedItems?.users, 'member_id');
|
|
676
|
+
this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
|
|
677
|
+
this.dashboardForm.selectedGroup = this.uniqueByProp(selectedItems?.groups, 'group_id');
|
|
678
|
+
this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
|
|
679
|
+
break;
|
|
680
|
+
case 'responsibilityCategories':
|
|
681
|
+
this.dashboardForm.selectedResponsibilityCategories =
|
|
682
|
+
normalizeProgramCategories(Array.isArray(selectedItems)
|
|
683
|
+
? selectedItems
|
|
684
|
+
: flattenProgramSelectionMap(selectedItems ?? {}));
|
|
685
|
+
this.applyResponsibilityCategoryWidgetFilters();
|
|
686
|
+
break;
|
|
687
|
+
case 'riskCategory':
|
|
688
|
+
this.dashboardForm.selectedRiskCategories = selectedItems;
|
|
689
|
+
if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
|
|
690
|
+
if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
|
|
691
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
|
|
692
|
+
}
|
|
693
|
+
else if (this.dashboardForm.selectedRiskCategories.length == 0) {
|
|
694
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
break;
|
|
698
|
+
}
|
|
699
|
+
this.activateSelector('', false);
|
|
700
|
+
}
|
|
701
|
+
remove(type, event, removeIndex) {
|
|
702
|
+
switch (type) {
|
|
703
|
+
case 'rc':
|
|
704
|
+
const rcIndex = this.dashboardForm.selectedResponsibilityCenters.findIndex((rc) => rc.rc_id == event.rc_id ||
|
|
705
|
+
rc.item_id == event.item_id ||
|
|
706
|
+
rc.rcid == event.rcid);
|
|
707
|
+
if (rcIndex !== -1) {
|
|
708
|
+
const parentRc = this.dashboardForm.selectedResponsibilityCenters[rcIndex];
|
|
709
|
+
this.dashboardForm.selectedResponsibilityCenters.splice(rcIndex, 1);
|
|
710
|
+
if (parentRc?.item_child_ids?.length > 0) {
|
|
711
|
+
parentRc.item_child_ids.forEach((childElement) => {
|
|
712
|
+
const childRemoveIndex = this.dashboardForm.selectedResponsibilityCenters.findIndex((removeElement) => removeElement.rc_id == childElement ||
|
|
713
|
+
removeElement.item_id == childElement ||
|
|
714
|
+
removeElement.rcid == childElement);
|
|
715
|
+
if (childRemoveIndex !== -1) {
|
|
716
|
+
this.dashboardForm.selectedResponsibilityCenters.splice(childRemoveIndex, 1);
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
|
|
722
|
+
if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
|
|
723
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
|
|
724
|
+
}
|
|
725
|
+
else if (this.dashboardForm.selectedRiskCategories.length == 0) {
|
|
726
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
break;
|
|
730
|
+
case 'whoCanView':
|
|
731
|
+
const reviewerIndex = this.dashboardForm.selectedViewers.findIndex((viewer) => viewer.member_id == event.member_id);
|
|
732
|
+
this.dashboardForm.selectedViewers.splice(reviewerIndex, 1);
|
|
733
|
+
break;
|
|
734
|
+
case 'whoCanViewGroup':
|
|
735
|
+
const groups = this.dashboardForm.selectedGroup.findIndex((ele) => ele?.group_id == event?.group_id);
|
|
736
|
+
this.dashboardForm.selectedGroup.splice(groups, 1);
|
|
737
|
+
break;
|
|
738
|
+
case 'responsibilityCategories':
|
|
739
|
+
this.checkDefaultProgramOnRemove(event);
|
|
740
|
+
break;
|
|
741
|
+
case 'riskCategory':
|
|
742
|
+
const riskCategoryIndex = this.dashboardForm.selectedRiskCategories.findIndex((riskCategory) => riskCategory.category_id == event.category_id);
|
|
743
|
+
if (riskCategoryIndex !== -1) {
|
|
744
|
+
const parent = this.dashboardForm.selectedRiskCategories[riskCategoryIndex];
|
|
745
|
+
this.dashboardForm.selectedRiskCategories.splice(riskCategoryIndex, 1);
|
|
746
|
+
if (parent?.child_cat_ids?.length > 0) {
|
|
747
|
+
parent.child_cat_ids.forEach((childElement) => {
|
|
748
|
+
const removeIndex = this.dashboardForm.selectedRiskCategories.findIndex((removeElement) => removeElement.category_id == childElement);
|
|
749
|
+
this.dashboardForm.selectedRiskCategories.splice(removeIndex, 1);
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
this.dashboardForm.selectedRiskCategories.splice(riskCategoryIndex, 1);
|
|
754
|
+
if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
|
|
755
|
+
if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
|
|
756
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
|
|
757
|
+
}
|
|
758
|
+
else if (this.dashboardForm.selectedRiskCategories.length == 0) {
|
|
759
|
+
this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
setList(list, ids, key) {
|
|
766
|
+
return this.setListByIds(list, ids, [key]);
|
|
767
|
+
}
|
|
768
|
+
setListByIds(list, ids, keys) {
|
|
769
|
+
const data = [];
|
|
770
|
+
if (!Array.isArray(list) || !Array.isArray(ids)) {
|
|
771
|
+
return data;
|
|
772
|
+
}
|
|
773
|
+
ids.forEach((id) => {
|
|
774
|
+
const targetId = id;
|
|
775
|
+
for (const key of keys) {
|
|
776
|
+
const index = list.findIndex((listElement) => listElement?.[key] === targetId);
|
|
777
|
+
if (index !== -1) {
|
|
778
|
+
data.push(list[index]);
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
});
|
|
783
|
+
return data;
|
|
784
|
+
}
|
|
785
|
+
flattenRcTree(nodes) {
|
|
786
|
+
const flat = [];
|
|
787
|
+
const walk = (arr) => {
|
|
788
|
+
(arr ?? []).forEach((node) => {
|
|
789
|
+
if (!node || typeof node !== 'object') {
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
flat.push(node);
|
|
793
|
+
if (Array.isArray(node.children)) {
|
|
794
|
+
walk(node.children);
|
|
795
|
+
}
|
|
796
|
+
if (Array.isArray(node.items)) {
|
|
797
|
+
walk(node.items);
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
};
|
|
801
|
+
if (Array.isArray(nodes)) {
|
|
802
|
+
walk(nodes);
|
|
803
|
+
return flat.length ? flat : nodes;
|
|
804
|
+
}
|
|
805
|
+
if (Array.isArray(nodes?.data)) {
|
|
806
|
+
walk(nodes.data);
|
|
807
|
+
return flat;
|
|
808
|
+
}
|
|
809
|
+
return [];
|
|
810
|
+
}
|
|
811
|
+
getRcNodeId(rc) {
|
|
812
|
+
return rc?.item_id ?? rc?.rc_id ?? rc?.rcid ?? rc?.id;
|
|
813
|
+
}
|
|
814
|
+
collectNestedChildIds(node) {
|
|
815
|
+
const ids = [];
|
|
816
|
+
const seen = new Set();
|
|
817
|
+
const walk = (n) => {
|
|
818
|
+
[...(n?.children ?? []), ...(n?.items ?? [])].forEach((child) => {
|
|
819
|
+
if (!child || typeof child !== 'object') {
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
const id = this.getRcNodeId(child);
|
|
823
|
+
const key = String(id);
|
|
824
|
+
if (id != null && id !== '' && !seen.has(key)) {
|
|
825
|
+
seen.add(key);
|
|
826
|
+
ids.push(id);
|
|
827
|
+
}
|
|
828
|
+
walk(child);
|
|
829
|
+
});
|
|
830
|
+
};
|
|
831
|
+
walk(node);
|
|
832
|
+
return ids;
|
|
833
|
+
}
|
|
834
|
+
isNestedRc(parent, candidate) {
|
|
835
|
+
const parentId = parent?.item_id;
|
|
836
|
+
const candidateId = candidate?.item_id;
|
|
837
|
+
if (parentId == null || candidateId == null || parentId == candidateId) {
|
|
838
|
+
return false;
|
|
839
|
+
}
|
|
840
|
+
const ancestorIds = [
|
|
841
|
+
...(candidate?.parent_rc_ids ?? []),
|
|
842
|
+
candidate?.parentId,
|
|
843
|
+
...(Array.isArray(candidate?.parent) || candidate?.parent == null
|
|
844
|
+
? []
|
|
845
|
+
: [candidate.parent]),
|
|
846
|
+
];
|
|
847
|
+
if (ancestorIds.some((id) => id == parentId)) {
|
|
848
|
+
return true;
|
|
849
|
+
}
|
|
850
|
+
const parentPath = Array.isArray(parent?.rc_name) ? parent.rc_name : [];
|
|
851
|
+
const candidatePath = Array.isArray(candidate?.rc_name)
|
|
852
|
+
? candidate.rc_name
|
|
853
|
+
: [];
|
|
854
|
+
return (parentPath.length > 0 &&
|
|
855
|
+
candidatePath.length > parentPath.length &&
|
|
856
|
+
parentPath.every((name, i) => candidatePath[i] === name));
|
|
857
|
+
}
|
|
858
|
+
resolveAllDescendantIds(parent, list) {
|
|
859
|
+
const parentId = parent?.item_id;
|
|
860
|
+
const rawIds = new Set();
|
|
861
|
+
const add = (id) => {
|
|
862
|
+
if (id != null && id !== '' && id != parentId) {
|
|
863
|
+
rawIds.add(id);
|
|
864
|
+
}
|
|
865
|
+
};
|
|
866
|
+
(parent?.item_child_ids ?? []).forEach(add);
|
|
867
|
+
this.collectNestedChildIds(parent).forEach(add);
|
|
868
|
+
(list ?? []).forEach((rc) => {
|
|
869
|
+
if (this.isNestedRc(parent, rc)) {
|
|
870
|
+
add(rc.item_id);
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
const resolved = [];
|
|
874
|
+
const seen = new Set();
|
|
875
|
+
rawIds.forEach((id) => {
|
|
876
|
+
const match = (list ?? []).find((rc) => rc?.item_id == id ||
|
|
877
|
+
rc?.rc_id == id ||
|
|
878
|
+
rc?.rcid == id ||
|
|
879
|
+
rc?.id == id);
|
|
880
|
+
const resolvedId = match?.item_id ?? id;
|
|
881
|
+
const key = String(resolvedId);
|
|
882
|
+
if (!seen.has(key) && resolvedId != parentId) {
|
|
883
|
+
seen.add(key);
|
|
884
|
+
resolved.push(resolvedId);
|
|
885
|
+
}
|
|
886
|
+
});
|
|
887
|
+
return resolved;
|
|
888
|
+
}
|
|
889
|
+
normalizeRcList(list) {
|
|
890
|
+
const items = this.flattenRcTree(list);
|
|
891
|
+
const normalized = items.map((rc) => ({
|
|
892
|
+
...rc,
|
|
893
|
+
rcid: rc?.rcid ?? rc?.rc_id ?? rc?.item_id ?? rc?.id,
|
|
894
|
+
item_id: rc?.item_id ?? rc?.rc_id ?? rc?.rcid ?? rc?.id,
|
|
895
|
+
item_name: rc?.item_name ??
|
|
896
|
+
rc?.item_name_string ??
|
|
897
|
+
(Array.isArray(rc?.rc_name) ? rc.rc_name.join(' < ') : rc?.rc_name) ??
|
|
898
|
+
'',
|
|
899
|
+
}));
|
|
900
|
+
return normalized.map((rc) => ({
|
|
901
|
+
...rc,
|
|
902
|
+
item_child_ids: this.resolveAllDescendantIds(rc, normalized),
|
|
903
|
+
}));
|
|
904
|
+
}
|
|
905
|
+
resolveRcFromTree(tree, ids) {
|
|
906
|
+
if (!ids.length || !tree.length) {
|
|
907
|
+
return [];
|
|
908
|
+
}
|
|
909
|
+
const selected = [];
|
|
910
|
+
const seen = new Set();
|
|
911
|
+
ids.forEach((id) => {
|
|
912
|
+
const targetId = Number(id);
|
|
913
|
+
const match = tree.find((rc) => Number(rc?.item_id) === targetId ||
|
|
914
|
+
Number(rc?.rc_id) === targetId ||
|
|
915
|
+
Number(rc?.rcid) === targetId ||
|
|
916
|
+
Number(rc?.id) === targetId ||
|
|
917
|
+
rc?.item_child_ids?.some((childId) => Number(childId) === targetId) ||
|
|
918
|
+
rc?.item_parent_ids?.some((parentId) => Number(parentId) === targetId));
|
|
919
|
+
if (!match) {
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
const key = Number(match?.item_id ?? match?.rc_id ?? match?.rcid ?? id);
|
|
923
|
+
if (!seen.has(key)) {
|
|
924
|
+
seen.add(key);
|
|
925
|
+
selected.push(match);
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
return selected;
|
|
929
|
+
}
|
|
930
|
+
applyPreresolvedRcEntries() {
|
|
931
|
+
if (!this.pendingEditRcEntries?.length) {
|
|
932
|
+
return false;
|
|
933
|
+
}
|
|
934
|
+
const tree = this.responsibilityCentersList ?? [];
|
|
935
|
+
const selected = this.pendingEditRcEntries.map((entry) => {
|
|
936
|
+
const rcid = Number(entry?.rcid ?? entry?.rc_id ?? entry?.item_id);
|
|
937
|
+
const fromTree = tree.find((rc) => Number(rc?.item_id) === rcid) ??
|
|
938
|
+
tree.find((rc) => Number(rc?.rcid) === rcid) ??
|
|
939
|
+
tree.find((rc) => Number(rc?.rc_id) === rcid);
|
|
940
|
+
return fromTree ? { ...fromTree } : { ...entry };
|
|
941
|
+
});
|
|
942
|
+
this.dashboardForm.selectedResponsibilityCenters = selected;
|
|
943
|
+
this.pendingEditRcIds = selected.map((rc) => Number(rc?.rcid ?? rc?.rc_id ?? rc?.item_id));
|
|
944
|
+
return true;
|
|
945
|
+
}
|
|
946
|
+
applyPendingResponsibilityCenters() {
|
|
947
|
+
if (this.applyPreresolvedRcEntries()) {
|
|
948
|
+
this.cdr.detectChanges();
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
951
|
+
if (!this.rcListLoaded || !this.pendingEditRcIds.length) {
|
|
952
|
+
return;
|
|
953
|
+
}
|
|
954
|
+
let selected = this.setListByIds(this.responsibilityCentersList, this.pendingEditRcIds, ['item_id', 'rcid', 'rc_id', 'id']);
|
|
955
|
+
if (selected.length < this.pendingEditRcIds.length) {
|
|
956
|
+
selected = this.resolveRcFromTree(this.responsibilityCentersList, this.pendingEditRcIds);
|
|
957
|
+
}
|
|
958
|
+
this.dashboardForm.selectedResponsibilityCenters = selected;
|
|
959
|
+
this.cdr.detectChanges();
|
|
960
|
+
}
|
|
961
|
+
beginEditHydration() {
|
|
962
|
+
if (this.mode !== 'EDIT') {
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
this.editHydrationCount++;
|
|
966
|
+
this.vLoader = true;
|
|
967
|
+
}
|
|
968
|
+
finishEditHydration() {
|
|
969
|
+
if (this.mode !== 'EDIT') {
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
this.editHydrationCount = Math.max(0, this.editHydrationCount - 1);
|
|
973
|
+
if (this.editHydrationCount === 0) {
|
|
974
|
+
this.vLoader = false;
|
|
975
|
+
this.cdr.detectChanges();
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
tryCompleteEditHydration() {
|
|
979
|
+
if (this.mode === 'EDIT' && this.editHydrationCount === 0) {
|
|
980
|
+
this.vLoader = false;
|
|
981
|
+
this.cdr.detectChanges();
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
wrapEditRequest(request$, onNext) {
|
|
985
|
+
if (this.mode === 'EDIT') {
|
|
986
|
+
this.beginEditHydration();
|
|
987
|
+
}
|
|
988
|
+
request$
|
|
989
|
+
.pipe(finalize(() => this.finishEditHydration()))
|
|
990
|
+
.subscribe({
|
|
991
|
+
next: onNext,
|
|
992
|
+
error: (err) => console.error(err),
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
syncProgramsForEdit(data) {
|
|
996
|
+
if (!data) {
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
this.hydrateProgramsFromDashboardData(data);
|
|
1000
|
+
this.applyProgramsFromDashboardIds(extractProgramIdsFromDashboard(data), extractCategoryIdsFromDashboard(data), getSelectedProgramsMap(data), data?.program);
|
|
1001
|
+
const categoryIds = extractCategoryIdsFromDashboard(data);
|
|
1002
|
+
if (categoryIds.length) {
|
|
1003
|
+
const fromCompliance = this.setList(this.allComplianceCategories, categoryIds, 'category_id');
|
|
1004
|
+
if (fromCompliance.length && !this.allProgamSelected.length) {
|
|
1005
|
+
this.applyFlatProgramCategories(fromCompliance);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
if (!this.allProgamSelected.length &&
|
|
1009
|
+
this.dashboardForm.selectedResponsibilityCategories.length) {
|
|
1010
|
+
this.allProgamSelected = [
|
|
1011
|
+
...this.dashboardForm.selectedResponsibilityCategories,
|
|
1012
|
+
];
|
|
1013
|
+
}
|
|
1014
|
+
this.syncProgramSelectionMapFromForm();
|
|
1015
|
+
}
|
|
1016
|
+
applyProgramsFromDashboardIds(programIds, categoryIds, selectedProgramsMap, programPayload) {
|
|
1017
|
+
if (categoryIds.length) {
|
|
1018
|
+
this.loadProgramsForEdit(programIds, categoryIds, selectedProgramsMap, programPayload);
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
if (programIds.length) {
|
|
1022
|
+
this.resolveProgramIdsForEdit(programIds);
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
ensureProgramSelectionMapForList() {
|
|
1026
|
+
if (hasProgramSelectionInMap(this.selectedPrograms)) {
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
const categoryIds = normalizeIdArray(this.dashboardForm.selectedResponsibilityCategories?.map((c) => c?.category_id ?? c?.id) ?? []);
|
|
1030
|
+
const programIds = [
|
|
1031
|
+
...new Set((this.dashboardForm.selectedResponsibilityCategories ?? []).map((c) => Number(c?.programId ?? c?.program_id ?? c?.parentId))),
|
|
1032
|
+
].filter((id) => !Number.isNaN(id));
|
|
1033
|
+
if (programIds.length || categoryIds.length) {
|
|
1034
|
+
this.loadProgramsForEdit(programIds, categoryIds);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
applyProgramSelectionMap(map) {
|
|
1038
|
+
const normalized = normalizeProgramSelectionMap(map);
|
|
1039
|
+
if (!normalized) {
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
this.selectedPrograms = normalized;
|
|
1043
|
+
this.allProgamSelected = flattenProgramSelectionMap(this.selectedPrograms);
|
|
1044
|
+
this.dashboardForm.selectedResponsibilityCategories =
|
|
1045
|
+
normalizeProgramCategories(this.allProgamSelected);
|
|
1046
|
+
this.cdr.detectChanges();
|
|
1047
|
+
}
|
|
1048
|
+
categoryMatchesId(cat, categoryIdSet) {
|
|
1049
|
+
const id = Number(cat?.id);
|
|
1050
|
+
const categoryId = Number(cat?.category_id);
|
|
1051
|
+
return ((!Number.isNaN(id) && categoryIdSet.has(id)) ||
|
|
1052
|
+
(!Number.isNaN(categoryId) && categoryIdSet.has(categoryId)));
|
|
1053
|
+
}
|
|
1054
|
+
loadProgramsForEdit(programIds, categoryIds = [], selectedProgramsMap, programPayload) {
|
|
1055
|
+
if (selectedProgramsMap &&
|
|
1056
|
+
typeof selectedProgramsMap === 'object' &&
|
|
1057
|
+
!Array.isArray(selectedProgramsMap) &&
|
|
1058
|
+
hasProgramSelectionInMap(selectedProgramsMap)) {
|
|
1059
|
+
this.applyProgramSelectionMap(selectedProgramsMap);
|
|
1060
|
+
return;
|
|
1061
|
+
}
|
|
1062
|
+
if (programPayload &&
|
|
1063
|
+
this.hydrateProgramsFromDashboardData({ program: programPayload })) {
|
|
1064
|
+
return;
|
|
1065
|
+
}
|
|
1066
|
+
if (!programIds.length && !categoryIds.length) {
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1069
|
+
const completeProgramHydration = () => this.finishEditHydration();
|
|
1070
|
+
if (this.mode === 'EDIT') {
|
|
1071
|
+
this.beginEditHydration();
|
|
1072
|
+
}
|
|
1073
|
+
this.createDashboardService.getSailsProgramList().subscribe({
|
|
1074
|
+
next: (res) => {
|
|
1075
|
+
const programs = parseSailsProgramList(res);
|
|
1076
|
+
const relevantPrograms = programIds.length > 0
|
|
1077
|
+
? programs.filter((p) => programIds.includes(Number(p?.id)))
|
|
1078
|
+
: programs;
|
|
1079
|
+
if (!categoryIds.length) {
|
|
1080
|
+
if (programIds.length) {
|
|
1081
|
+
this.resolveProgramIdsForEdit(programIds, programs);
|
|
1082
|
+
}
|
|
1083
|
+
completeProgramHydration();
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
const categoryIdSet = new Set(categoryIds);
|
|
1087
|
+
const programsToFetch = relevantPrograms.length > 0 ? relevantPrograms : programs;
|
|
1088
|
+
if (!programsToFetch.length) {
|
|
1089
|
+
completeProgramHydration();
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
const categoryRequests = programsToFetch.map((program) => this.createDashboardService.getProgramCategories(program.id).pipe(map((catRes) => ({
|
|
1093
|
+
program,
|
|
1094
|
+
categories: catRes?.data?.categories ?? catRes?.categories ?? [],
|
|
1095
|
+
}))));
|
|
1096
|
+
forkJoin(categoryRequests)
|
|
1097
|
+
.pipe(finalize(() => completeProgramHydration()))
|
|
1098
|
+
.subscribe({
|
|
1099
|
+
next: (rawResults) => {
|
|
1100
|
+
const results = rawResults;
|
|
1101
|
+
const map = {};
|
|
1102
|
+
results.forEach(({ program, categories }) => {
|
|
1103
|
+
const selected = (categories ?? []).filter((cat) => this.categoryMatchesId(cat, categoryIdSet));
|
|
1104
|
+
if (selected.length) {
|
|
1105
|
+
map[String(program.id)] = selected;
|
|
1106
|
+
}
|
|
1107
|
+
});
|
|
1108
|
+
if (hasProgramSelectionInMap(map)) {
|
|
1109
|
+
this.applyProgramSelectionMap(map);
|
|
1110
|
+
}
|
|
1111
|
+
else if (this.allProgamSelected.length) {
|
|
1112
|
+
this.syncProgramSelectionMapFromForm();
|
|
1113
|
+
}
|
|
1114
|
+
},
|
|
1115
|
+
error: (err) => console.error(err),
|
|
1116
|
+
});
|
|
1117
|
+
},
|
|
1118
|
+
error: (err) => {
|
|
1119
|
+
console.error(err);
|
|
1120
|
+
completeProgramHydration();
|
|
1121
|
+
},
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1124
|
+
/** Custom dashboards often store program ids only — resolve names for form chips. */
|
|
1125
|
+
resolveProgramIdsForEdit(programIds, programsFromList) {
|
|
1126
|
+
if (!programIds.length) {
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
const apply = (programs) => {
|
|
1130
|
+
const matched = programs.filter((p) => programIds.includes(Number(p?.id)));
|
|
1131
|
+
if (!matched.length) {
|
|
1132
|
+
return;
|
|
1133
|
+
}
|
|
1134
|
+
const chips = matched.map((p) => ({
|
|
1135
|
+
id: p.id,
|
|
1136
|
+
category_id: p.id,
|
|
1137
|
+
name: p.name,
|
|
1138
|
+
item_name: p.name,
|
|
1139
|
+
programId: p.id,
|
|
1140
|
+
}));
|
|
1141
|
+
this.allProgamSelected = normalizeProgramCategories(chips);
|
|
1142
|
+
this.dashboardForm.selectedResponsibilityCategories = [
|
|
1143
|
+
...this.allProgamSelected,
|
|
1144
|
+
];
|
|
1145
|
+
const map = {};
|
|
1146
|
+
matched.forEach((p) => {
|
|
1147
|
+
map[String(p.id)] = [];
|
|
1148
|
+
});
|
|
1149
|
+
this.selectedPrograms = map;
|
|
1150
|
+
this.cdr.detectChanges();
|
|
1151
|
+
};
|
|
1152
|
+
if (programsFromList?.length) {
|
|
1153
|
+
apply(programsFromList);
|
|
1154
|
+
return;
|
|
1155
|
+
}
|
|
1156
|
+
if (this.mode === 'EDIT') {
|
|
1157
|
+
this.beginEditHydration();
|
|
1158
|
+
}
|
|
1159
|
+
this.createDashboardService
|
|
1160
|
+
.getSailsProgramList()
|
|
1161
|
+
.pipe(finalize(() => this.finishEditHydration()))
|
|
1162
|
+
.subscribe({
|
|
1163
|
+
next: (res) => {
|
|
1164
|
+
apply(parseSailsProgramList(res));
|
|
1165
|
+
},
|
|
1166
|
+
error: (err) => console.error(err),
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
buildEditDashboardData() {
|
|
1170
|
+
const row = this.dashboardDetails ?? {};
|
|
1171
|
+
const core = row?.dashboard_details ?? row?.dashboard ?? row;
|
|
1172
|
+
const programSource = core?.programs;
|
|
1173
|
+
const rcSource = core?.responsibilityCenters;
|
|
1174
|
+
return {
|
|
1175
|
+
...row,
|
|
1176
|
+
...core,
|
|
1177
|
+
cdid: core?.cdid ?? row?.cdid,
|
|
1178
|
+
dashboard_name: core?.name ?? row?.dashboard_name,
|
|
1179
|
+
name: core?.name ?? row?.dashboard_name,
|
|
1180
|
+
description: core?.description ?? row?.description,
|
|
1181
|
+
viewers: core?.viewers ?? row?.viewers,
|
|
1182
|
+
visible_to_users: core?.visible_to_users ?? row?.visible_to_users,
|
|
1183
|
+
visible_to_groups: core?.visible_to_groups ?? row?.visible_to_groups,
|
|
1184
|
+
programs: programSource,
|
|
1185
|
+
programId: extractProgramIdsFromDashboard({
|
|
1186
|
+
programs: programSource,
|
|
1187
|
+
program: core?.program ?? row?.program,
|
|
1188
|
+
}),
|
|
1189
|
+
responsibility_category: core?.responsibility_category ??
|
|
1190
|
+
row?.responsibility_category ??
|
|
1191
|
+
core?.responsibilityCategory ??
|
|
1192
|
+
[],
|
|
1193
|
+
rcId: core.rcId,
|
|
1194
|
+
selectedRcEntries: row?.selectedRcEntries ??
|
|
1195
|
+
core?.selectedRcEntries ??
|
|
1196
|
+
[],
|
|
1197
|
+
responsibilityCenters: rcSource,
|
|
1198
|
+
responsibility_center: rcSource,
|
|
1199
|
+
responsibilityCenterId: core.rcId,
|
|
1200
|
+
program: core?.program ?? row?.program,
|
|
1201
|
+
timeframe: core?.timeframe ??
|
|
1202
|
+
(row?.time_frame_from || row?.time_frame_to
|
|
1203
|
+
? { from: row?.time_frame_from, to: row?.time_frame_to }
|
|
1204
|
+
: undefined),
|
|
1205
|
+
time_frame_from: core?.timeframe?.from ??
|
|
1206
|
+
core?.timeframe?.start_date ??
|
|
1207
|
+
row?.time_frame_from,
|
|
1208
|
+
time_frame_to: core?.timeframe?.to ?? core?.timeframe?.end_date ?? row?.time_frame_to,
|
|
1209
|
+
created_by: core?.createdBy ?? core?.created_by ?? row?.created_by,
|
|
1210
|
+
createdBy: core?.createdBy ?? core?.created_by ?? row?.createdBy,
|
|
1211
|
+
};
|
|
1212
|
+
}
|
|
1213
|
+
submitted = false;
|
|
1214
|
+
/**
|
|
1215
|
+
* Returns id's from a particular list elements
|
|
1216
|
+
* @param list actual selected list
|
|
1217
|
+
* @param key contains key to extract id from the list
|
|
1218
|
+
*/
|
|
1219
|
+
returnIds(list, key) {
|
|
1220
|
+
return list?.map((ele) => {
|
|
1221
|
+
if (ele[key]) {
|
|
1222
|
+
return ele[key];
|
|
1223
|
+
}
|
|
1224
|
+
});
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Validates the data submitted on create dashboard form
|
|
1228
|
+
*/
|
|
1229
|
+
validateDashboard() {
|
|
1230
|
+
setTimeout(() => {
|
|
1231
|
+
this.submitted = true;
|
|
1232
|
+
}, 100);
|
|
1233
|
+
const event = this.dashboardForm.dashboardName;
|
|
1234
|
+
const re = / |<br>/g;
|
|
1235
|
+
this.dashboardForm.dashboardName = event.replace(re, '').trim();
|
|
1236
|
+
const description = this.dashboardForm.dashboardDescriptionText;
|
|
1237
|
+
this.dashboardForm.dashboardDescriptionText = description
|
|
1238
|
+
.replace(re, '')
|
|
1239
|
+
.trim();
|
|
1240
|
+
if (!this.dashboardForm.dashboardName ||
|
|
1241
|
+
this.dashboardForm.dashboardName.trim() == '' ||
|
|
1242
|
+
this.dashboardForm.dashboardName.length > 30 ||
|
|
1243
|
+
this.textCount.transform(this.dashboardForm?.dashboardDescriptionText) >
|
|
1244
|
+
250 ||
|
|
1245
|
+
(this.dashboardForm?.selectedFromDate &&
|
|
1246
|
+
!this.dashboardForm?.selectedToDate) ||
|
|
1247
|
+
(this.dashboardForm.selectedResponsibilityCenters.length == 0)) {
|
|
1248
|
+
return false;
|
|
1249
|
+
}
|
|
1250
|
+
return true;
|
|
1251
|
+
}
|
|
1252
|
+
/**
|
|
1253
|
+
* Makes an api call to create a dashboad
|
|
1254
|
+
* @param dashboard contains dashboardForm data
|
|
1255
|
+
*/
|
|
1256
|
+
submitDashboard() {
|
|
1257
|
+
this.submitted = false;
|
|
1258
|
+
const valid = this.validateDashboard();
|
|
1259
|
+
if (!valid) {
|
|
1260
|
+
return false;
|
|
1261
|
+
}
|
|
1262
|
+
this.vLoader = true;
|
|
1263
|
+
const dashboard = this.dashboardForm;
|
|
1264
|
+
const payload = {
|
|
1265
|
+
viewer: {
|
|
1266
|
+
userId: this.returnIds(dashboard.selectedViewers, 'uid'),
|
|
1267
|
+
userGroupId: this.returnIds(dashboard.selectedGroup, 'ugid'),
|
|
1268
|
+
},
|
|
1269
|
+
widget_details: dashboard.configureWidget,
|
|
1270
|
+
dashboard_id: this.dashboardId,
|
|
1271
|
+
};
|
|
1272
|
+
this.createDashboardService.saveWidgetDetails(payload).subscribe({
|
|
1273
|
+
next: (res) => {
|
|
1274
|
+
// saveWidgetDetails can return freshest bridge id; merge it for redirect.
|
|
1275
|
+
const widgetPayload = res?.data ?? res ?? {};
|
|
1276
|
+
this.createdDashboard = {
|
|
1277
|
+
...(this.createdDashboard ?? {}),
|
|
1278
|
+
...(widgetPayload?.dashboard ?? {}),
|
|
1279
|
+
cddid: this.createdDashboard?.cddid ??
|
|
1280
|
+
widgetPayload?.cddid ??
|
|
1281
|
+
widgetPayload?.cdid ??
|
|
1282
|
+
widgetPayload?.dashboard_bridge_id,
|
|
1283
|
+
cdid: this.createdDashboard?.cdid ??
|
|
1284
|
+
widgetPayload?.cdid ??
|
|
1285
|
+
widgetPayload?.cddid ??
|
|
1286
|
+
widgetPayload?.dashboard_bridge_id,
|
|
1287
|
+
dashboard_bridge_id: this.createdDashboard?.dashboard_bridge_id ??
|
|
1288
|
+
widgetPayload?.dashboard_bridge_id ??
|
|
1289
|
+
widgetPayload?.dashboardBridgeId,
|
|
1290
|
+
dashboardBridgeId: this.createdDashboard?.dashboardBridgeId ??
|
|
1291
|
+
widgetPayload?.dashboardBridgeId ??
|
|
1292
|
+
widgetPayload?.dashboard_bridge_id,
|
|
1293
|
+
};
|
|
1294
|
+
this.dashboardId = this.getCreatedDashboardCdid();
|
|
1295
|
+
this.vLoader = false;
|
|
1296
|
+
this.isSmiley = true;
|
|
1297
|
+
this.smileyMessage = this.mode === 'EDIT' ? 'The dashboard has been updated.' : 'The dashboard has been created.';
|
|
1298
|
+
setTimeout(() => {
|
|
1299
|
+
this.isSmiley = false;
|
|
1300
|
+
const cdid = this.getCreatedDashboardCdid();
|
|
1301
|
+
const closeMode = this.redirectAfterCreate
|
|
1302
|
+
? 'created'
|
|
1303
|
+
: this.mode === 'EDIT'
|
|
1304
|
+
? 'updated'
|
|
1305
|
+
: 'created';
|
|
1306
|
+
this.redirectAfterCreate = false;
|
|
1307
|
+
this.close.emit({
|
|
1308
|
+
mode: closeMode,
|
|
1309
|
+
id: cdid,
|
|
1310
|
+
cdid,
|
|
1311
|
+
dashboardBridgeId: this.createdDashboard?.dashboard_bridge_id ??
|
|
1312
|
+
this.createdDashboard?.dashboardBridgeId,
|
|
1313
|
+
dashboard: this.createdDashboard,
|
|
1314
|
+
});
|
|
1315
|
+
}, 3000);
|
|
1316
|
+
},
|
|
1317
|
+
error: (error) => {
|
|
1318
|
+
console.error('saveWidgetDetails error =>', error);
|
|
1319
|
+
this.snackBar.show(error.error.statusMessage, 'alert');
|
|
1320
|
+
this.vLoader = false;
|
|
1321
|
+
}
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
closeContainer(message) {
|
|
1325
|
+
this.close.emit(message);
|
|
1326
|
+
}
|
|
1327
|
+
onSubmitDashboard() {
|
|
1328
|
+
const dashboard = this.dashboardForm;
|
|
1329
|
+
const payload = {
|
|
1330
|
+
dashboard_name: dashboard.dashboardName,
|
|
1331
|
+
description: [
|
|
1332
|
+
{
|
|
1333
|
+
content: dashboard.dashboardDescriptionText,
|
|
1334
|
+
attachments: [],
|
|
1335
|
+
},
|
|
1336
|
+
],
|
|
1337
|
+
visible_to_users: this.returnIds(dashboard.selectedViewers, 'uid'),
|
|
1338
|
+
visible_to_groups: this.returnIds(dashboard.selectedGroup, 'ugid'),
|
|
1339
|
+
responsibility_center: this.returnIds(dashboard.selectedResponsibilityCenters, 'rcid'),
|
|
1340
|
+
responsibility_category: this.returnIds(dashboard.selectedResponsibilityCategories, 'category_id'),
|
|
1341
|
+
risk_category: this.returnIds(dashboard.selectedRiskCategories, 'category_id'),
|
|
1342
|
+
display_criteria: dashboard.displayCriteria === 'and'
|
|
1343
|
+
? 'BOTH_RC_AND_CATEGORY'
|
|
1344
|
+
: 'RC_OR_CATEGORY',
|
|
1345
|
+
widget_details: dashboard.configureWidget,
|
|
1346
|
+
program: {
|
|
1347
|
+
all_programs: this.allProgamSelected,
|
|
1348
|
+
selected_programs: this.selectedPrograms,
|
|
1349
|
+
},
|
|
1350
|
+
timeframe: {
|
|
1351
|
+
start_date: dashboard.selectedFromDate
|
|
1352
|
+
? this.getDateFormate(dashboard?.selectedFromDate)
|
|
1353
|
+
: '',
|
|
1354
|
+
end_date: dashboard.selectedToDate
|
|
1355
|
+
? this.getDateFormate(dashboard?.selectedToDate)
|
|
1356
|
+
: '',
|
|
1357
|
+
},
|
|
1358
|
+
};
|
|
1359
|
+
const createDashboardPayload = this.createDashboardService.buildPayload(payload);
|
|
1360
|
+
this.saveDashboard(createDashboardPayload);
|
|
1361
|
+
}
|
|
1362
|
+
saveDashboard(payload) {
|
|
1363
|
+
let apiCall = this.createDashboardService.createDashboard(payload);
|
|
1364
|
+
if (this.mode === 'EDIT') {
|
|
1365
|
+
apiCall = this.createDashboardService.updateDashboard(payload, this.dashboardDetails?.recordId);
|
|
1366
|
+
}
|
|
1367
|
+
apiCall.subscribe({
|
|
1368
|
+
next: (res) => {
|
|
1369
|
+
const wasCreate = this.mode === 'CREATE';
|
|
1370
|
+
this.createdDashboard = res?.data?.dashboard ?? null;
|
|
1371
|
+
this.dashboardDetails = this.createdDashboard;
|
|
1372
|
+
this.dashboardId = this.getCreatedDashboardCdid();
|
|
1373
|
+
this.dashboardDetails['recordId'] = this.createdDashboard?.id;
|
|
1374
|
+
this.vLoader = false;
|
|
1375
|
+
this.openConfigureWidgets = true;
|
|
1376
|
+
this.showComplianceWidgets = false;
|
|
1377
|
+
if (wasCreate) {
|
|
1378
|
+
this.redirectAfterCreate = true;
|
|
1379
|
+
}
|
|
1380
|
+
this.mode = 'EDIT';
|
|
1381
|
+
},
|
|
1382
|
+
error: (error) => {
|
|
1383
|
+
this.vLoader = false;
|
|
1384
|
+
if (error.status == 422) {
|
|
1385
|
+
this.snackBar.show(error.error.statusMessage, 'alert');
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
});
|
|
1389
|
+
}
|
|
1390
|
+
getCreatedDashboardCdid() {
|
|
1391
|
+
const dash = this.createdDashboard;
|
|
1392
|
+
const cdid = dash?.cddid ??
|
|
1393
|
+
dash?.cdid ??
|
|
1394
|
+
dash?.cdId ??
|
|
1395
|
+
dash?.dashboard_bridge_id ??
|
|
1396
|
+
dash?.dashboardBridgeId ??
|
|
1397
|
+
dash?.dashboard?.dashboard_bridge_id ??
|
|
1398
|
+
this.dashboardId;
|
|
1399
|
+
return cdid != null && cdid !== '' ? String(cdid) : '';
|
|
1400
|
+
}
|
|
1401
|
+
hydrateEditForm() {
|
|
1402
|
+
if (this.editFormHydrated) {
|
|
1403
|
+
return;
|
|
1404
|
+
}
|
|
1405
|
+
this.editFormHydrated = true;
|
|
1406
|
+
this.editDashboard();
|
|
1407
|
+
}
|
|
1408
|
+
applyWidgetsFromGetWidgetsResponse(widgets) {
|
|
1409
|
+
const savedWidgets = filterActiveWidgets(widgets?.widgetArr ?? []);
|
|
1410
|
+
const catalogWidgets = widgets?.allWidgetsArray?.length
|
|
1411
|
+
? widgets.allWidgetsArray
|
|
1412
|
+
: savedWidgets;
|
|
1413
|
+
this.dashboardForm.configureWidget = savedWidgets;
|
|
1414
|
+
this.selectedWidgets = [...savedWidgets];
|
|
1415
|
+
this.displayedWidgets = [...catalogWidgets];
|
|
1416
|
+
}
|
|
1417
|
+
/** EDIT mode only: GET getWidgets?dashboardId={cdid} */
|
|
1418
|
+
loadEditModeWidgets(cdid) {
|
|
1419
|
+
if (this.mode !== 'EDIT' || !cdid) {
|
|
1420
|
+
return;
|
|
1421
|
+
}
|
|
1422
|
+
this.wrapEditRequest(this.createDashboardService.fetchCustomDashboardWidgetDetails(cdid), (widgets) => {
|
|
1423
|
+
this.applyWidgetsFromGetWidgetsResponse(widgets);
|
|
1424
|
+
this.cdr.detectChanges();
|
|
1425
|
+
});
|
|
1426
|
+
}
|
|
1427
|
+
editDashboard() {
|
|
1428
|
+
this.vLoader = true;
|
|
1429
|
+
if (this.mode === 'EDIT') {
|
|
1430
|
+
this.editHydrationCount = 0;
|
|
1431
|
+
}
|
|
1432
|
+
const data = this.buildEditDashboardData();
|
|
1433
|
+
this.pendingEditRcEntries =
|
|
1434
|
+
data?.selectedRcEntries ??
|
|
1435
|
+
this.dashboardDetails?.selectedRcEntries ??
|
|
1436
|
+
[];
|
|
1437
|
+
const editCdid = getEditDashboardCdid(data, this.dashboardDetails, this.dashboardId);
|
|
1438
|
+
this.listDetails.nonRemovableUsersList = [
|
|
1439
|
+
data?.createdBy ?? data?.created_by,
|
|
1440
|
+
].filter((x) => x != null);
|
|
1441
|
+
this.populateDashboardForm(data);
|
|
1442
|
+
if (this.mode === 'EDIT' && editCdid) {
|
|
1443
|
+
this.loadEditModeWidgets(editCdid);
|
|
1444
|
+
}
|
|
1445
|
+
this.tryCompleteEditHydration();
|
|
1446
|
+
}
|
|
1447
|
+
populateDashboardForm(data) {
|
|
1448
|
+
try {
|
|
1449
|
+
const descriptionBlock = Array.isArray(data?.description)
|
|
1450
|
+
? data.description[0]
|
|
1451
|
+
: null;
|
|
1452
|
+
const descriptionText = descriptionBlock?.content ??
|
|
1453
|
+
(typeof data?.description === 'string' ? data.description : '') ??
|
|
1454
|
+
data?.dashboardDescriptionText ??
|
|
1455
|
+
'';
|
|
1456
|
+
const visibleUsers = data?.visible_to_users ?? data?.viewers?.userId ?? [];
|
|
1457
|
+
const visibleUserIds = data?.viewers?.userId ?? [];
|
|
1458
|
+
const visibleGroups = data?.viewers?.userGroupId ?? [];
|
|
1459
|
+
const visibleGroupIds = data?.viewers?.userGroupId ?? [];
|
|
1460
|
+
this.pendingEditRcEntries =
|
|
1461
|
+
data?.selectedRcEntries ??
|
|
1462
|
+
this.dashboardDetails?.selectedRcEntries ??
|
|
1463
|
+
[];
|
|
1464
|
+
this.pendingEditRcIds = extractRcIdsFromDashboard(data);
|
|
1465
|
+
this.applyPreresolvedRcEntries();
|
|
1466
|
+
const riskCategories = data?.risk_category ?? [];
|
|
1467
|
+
const riskCategoryIds = (riskCategories ?? []).map((risk) => typeof risk === 'object' ? risk?.category_id ?? risk?.id : risk);
|
|
1468
|
+
const startDate = data?.timeframe?.start_date ??
|
|
1469
|
+
data?.timeframe?.from ??
|
|
1470
|
+
data?.time_frame_from;
|
|
1471
|
+
const endDate = data?.timeframe?.end_date ??
|
|
1472
|
+
data?.timeframe?.to ??
|
|
1473
|
+
data?.time_frame_to;
|
|
1474
|
+
this.dashboardForm.dashboardName =
|
|
1475
|
+
data?.dashboard_name ?? data?.name ?? '';
|
|
1476
|
+
this.dashboardForm.dashboardDescriptionText = descriptionText;
|
|
1477
|
+
this.dashboardForm.selectedViewers = this.setListByIds(this.usersList, visibleUserIds, ['member_id', 'uid', 'id']);
|
|
1478
|
+
this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
|
|
1479
|
+
this.dashboardForm.selectedGroup = this.setListByIds(this.groupList, visibleGroupIds, ['group_id', 'ugid', 'id']);
|
|
1480
|
+
this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
|
|
1481
|
+
this.applyPendingResponsibilityCenters();
|
|
1482
|
+
this.syncProgramsForEdit(data);
|
|
1483
|
+
this.dashboardForm.selectedRiskCategories =
|
|
1484
|
+
this.setList(this.allRiskCategories, riskCategoryIds, 'category_id');
|
|
1485
|
+
this.dashboardForm.displayCriteria =
|
|
1486
|
+
data?.display_criteria === 'BOTH_RC_AND_CATEGORY' ? 'and' : 'or';
|
|
1487
|
+
this.dashboardForm.selectedFromDate = startDate
|
|
1488
|
+
? new Date(startDate)
|
|
1489
|
+
: undefined;
|
|
1490
|
+
this.dashboardForm.selectedToDate = endDate
|
|
1491
|
+
? new Date(endDate)
|
|
1492
|
+
: undefined;
|
|
1493
|
+
if (this.mode !== 'EDIT') {
|
|
1494
|
+
this.vLoader = false;
|
|
1495
|
+
const widgetDetailsRaw = data?.widget_details ?? data?.widgets ?? [];
|
|
1496
|
+
const widgetDetails = Array.isArray(widgetDetailsRaw)
|
|
1497
|
+
? widgetDetailsRaw
|
|
1498
|
+
: [];
|
|
1499
|
+
const allWidgetsRaw = data?.all_widgets ?? widgetDetails;
|
|
1500
|
+
const allWidgets = Array.isArray(allWidgetsRaw) ? allWidgetsRaw : [];
|
|
1501
|
+
this.dashboardForm.configureWidget = widgetDetails;
|
|
1502
|
+
this.selectedWidgets =
|
|
1503
|
+
widgetDetails.length > 0 ? [...new Set(widgetDetails)] : [];
|
|
1504
|
+
this.displayedWidgets =
|
|
1505
|
+
allWidgets.length > 0 ? [...new Set(allWidgets)] : [];
|
|
1506
|
+
}
|
|
1507
|
+
if (startDate) {
|
|
1508
|
+
const minToDate = this.setToDate(startDate);
|
|
1509
|
+
this.toDatePickerConfig = { ...this.datePickerBaseConfig, min: minToDate };
|
|
1510
|
+
}
|
|
1511
|
+
this.hideToDate = true;
|
|
1512
|
+
setTimeout(() => {
|
|
1513
|
+
this.hideToDate = false;
|
|
1514
|
+
}, 20);
|
|
1515
|
+
this.cdr.detectChanges();
|
|
1516
|
+
}
|
|
1517
|
+
catch (error) {
|
|
1518
|
+
console.error('populate dashboard error =>', error);
|
|
1519
|
+
this.vLoader = false;
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
ngAfterViewChecked() {
|
|
1523
|
+
//your code to update the model
|
|
1524
|
+
this.cdr.detectChanges();
|
|
1525
|
+
}
|
|
1526
|
+
setPermission(roleActions) {
|
|
1527
|
+
let ifExistRisk = roleActions?.find((el) => el.moduleName == 'risk');
|
|
1528
|
+
ifExistRisk?.subModule?.forEach((module) => {
|
|
1529
|
+
module?.permissions?.forEach((permission) => {
|
|
1530
|
+
switch (permission?.code) {
|
|
1531
|
+
case 'RRMR': {
|
|
1532
|
+
if (permission?.defaultPermission == 1 || permission?.enable == 1) {
|
|
1533
|
+
this.isManageRisk = true;
|
|
1534
|
+
}
|
|
1535
|
+
break;
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
});
|
|
1539
|
+
});
|
|
1540
|
+
}
|
|
1541
|
+
documentClick(event) {
|
|
1542
|
+
const fromOpen = !!this.fromDatePicker?.areCalendarsShown;
|
|
1543
|
+
const toOpen = !!this.toDatePicker?.areCalendarsShown;
|
|
1544
|
+
if (!this.datePickerOverlay && !fromOpen && !toOpen) {
|
|
1545
|
+
return;
|
|
1546
|
+
}
|
|
1547
|
+
const targetElement = event?.target;
|
|
1548
|
+
if (!targetElement?.closest) {
|
|
1549
|
+
return;
|
|
1550
|
+
}
|
|
1551
|
+
// Keep calendar open when interacting with the calendar UI itself
|
|
1552
|
+
// (including month/year navigation). The full-screen transparent
|
|
1553
|
+
// `.dp-popup` backdrop is intentionally treated as an outside click.
|
|
1554
|
+
const clickedInsideCalendar = !!targetElement.closest('dp-day-calendar, dp-month-calendar, dp-day-time-calendar, dp-time-select');
|
|
1555
|
+
const clickedOnDateInput = !!targetElement.closest('#from_date, #to_date');
|
|
1556
|
+
if (clickedInsideCalendar || clickedOnDateInput) {
|
|
1557
|
+
return;
|
|
1558
|
+
}
|
|
1559
|
+
if (fromOpen || this.openedDatePicker === 'FROM_DATE') {
|
|
1560
|
+
this.closeFromDatePicker();
|
|
1561
|
+
}
|
|
1562
|
+
if (toOpen || this.openedDatePicker === 'TO_DATE') {
|
|
1563
|
+
this.closeToDatePicker();
|
|
1564
|
+
}
|
|
1565
|
+
this.datePickerOverlay = false;
|
|
1566
|
+
this.openedDatePicker = '';
|
|
1567
|
+
}
|
|
1568
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateDashboardComponent, deps: [{ token: i1.CreateDashboardService }, { token: i2.PaginationService }, { token: i0.ChangeDetectorRef }, { token: i3.SnackBarService }, { token: i4.PopoverService }, { token: i5.TextCountPipe }], target: i0.ɵɵFactoryTarget.Component });
|
|
1569
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateDashboardComponent, selector: "app-create-dashboard", inputs: { feature: "feature", mode: "mode", dashboardId: "dashboardId", dashboardDetails: "dashboardDetails", createdBy: "createdBy", configureWidget: "configureWidget" }, outputs: { close: "close" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)", "document:click": "documentClick($event)" } }, providers: [TextCountPipe], viewQueries: [{ propertyName: "fromDatePicker", first: true, predicate: ["fromDatePicker"], descendants: true }, { propertyName: "toDatePicker", first: true, predicate: ["toDatePicker"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<app-snack-bar></app-snack-bar>\r\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\r\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\r\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\r\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\r\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\r\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\r\n [feature]=\"feature\"></app-user-list>\r\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\r\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\r\n [selectedResponsibilityCenters]=\"\r\n dashboardForm.selectedResponsibilityCenters\r\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\r\n (closeRcList)=\"activateSelector('', false)\">\r\n </app-responsibility-center>\r\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\r\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\r\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\r\n (saveSelectedCategory)=\"\r\n saveSelectedList('responsibilityCategories', $event)\r\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\r\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\r\n (close)=\"activateSelector('', false)\">\r\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\r\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\r\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\r\n <div class=\"left-side vx-fs-12 vx-d-flex\">\r\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\r\n <button\r\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\r\n {{ allProgamSelected.length }}\r\n </button>\r\n <span class=\"selected-text\">\r\n Program\r\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\r\n Selected</span>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-side vx-d-flex\">\r\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\r\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\r\n Next <i class=\"icons\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </app-list-container>\r\n\r\n </div>\r\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\r\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\r\n\r\n <div class=\"form-group\" [class.disabled]=\"disabled\">\r\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\r\n [class.hidden-scroll]=\"popoverService.stopScroll\">\r\n <!-- Dashboard Name -->\r\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\r\n <div class=\"image\">\r\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\r\n !dashboardForm.dashboardName || activeSelector === 'name'\r\n \" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\r\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\r\n Name\r\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\r\n <div class=\"vx-input-group\">\r\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\r\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\r\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\r\n\r\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\r\n dashboardForm.dashboardName.length }}</span>\r\n </div>\r\n\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n (dashboardForm?.dashboardName?.length > 30 ||\r\n !dashboardForm?.dashboardName)\r\n \">\r\n {{\r\n dashboardForm.dashboardName.length > 30\r\n ? \"You have exceeded the maximum character limit of 30 characters.\"\r\n : \"Please enter a name for this Dashboard.\"\r\n }}\r\n </p>\r\n\r\n <div class=\"vx-input-group vx-mt-2\">\r\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\r\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\r\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\r\n 250 -\r\n (dashboardForm?.dashboardDescriptionText | textCount)\r\n }}</span>\r\n </div>\r\n\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\r\n \">\r\n You have exceeded the maximum character limit of 250\r\n characters.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dashboard Display Criteria -->\r\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\r\n Dashboard Display Criteria\r\n </span>\r\n <app-information-block></app-information-block>\r\n\r\n <!-- Who -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'whoCanView' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\r\n dashboardForm?.selectedViewers?.length == 0 ||\r\n activeSelector === 'whoCanView'\r\n \" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg class=\"checkIcon\" *ngIf=\"\r\n dashboardForm?.selectedViewers?.length > 0 &&\r\n activeSelector !== 'whoCanView'\r\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\r\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\r\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\r\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('whoCanView', true)\">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Who can view this dashboard?\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\r\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n user.member_id\r\n )\r\n \" (click)=\"remove('whoCanView', user)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\r\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\r\n }}</span>\r\n <button *ngIf=\"\r\n dashboardForm?.selectedViewers?.length > 1 &&\r\n !groupsEnabled\r\n \"\r\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"userList.popover()\" placement=\"left\">\r\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\r\n </button>\r\n </div>\r\n <app-popover #userList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let user of dashboardForm?.selectedViewers\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n user.member_id\r\n ) && !groupsEnabled\r\n \" (click)=\"remove('whoCanView', user)\"></i>\r\n {{ user?.member_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </ng-container>\r\n\r\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\r\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\r\n <button\r\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\r\n {{ dashboardForm?.selectedViewers?.length }}\r\n </button>\r\n </div>\r\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\r\n dashboardForm?.selectedGroup?.length &&\r\n dashboardForm?.selectedViewers?.length\r\n \">&</span>\r\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\r\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\r\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\r\n <button\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\r\n {{ dashboardForm?.selectedGroup?.length }}\r\n </button>\r\n </div>\r\n\r\n <app-popover #userCount [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n data.member_id\r\n )\r\n \" (click)=\"remove('whoCanView', data)\"></i>\r\n {{ data.member_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n\r\n <app-popover #groupCount [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\"></i>\r\n {{ data.group_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('whoCanView', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Responsibility Center -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'rcList' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\r\n activeSelector === 'rcList'\r\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\r\n activeSelector !== 'rcList'\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\r\n CENTER(S)</label>\r\n <div *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0\r\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\r\n allProgamSelected?.length ==\r\n 0 &&\r\n dashboardForm?.selectedRiskCategories?.length == 0\r\n \">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Select the Responsibility Center(s) that you would like<br />displayed\r\n in the Dashboard, if any.\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 0\r\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\r\n 0,\r\n 1\r\n )\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\r\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\r\n <button *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 1\r\n \"\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\r\n +{{\r\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\r\n .length\r\n }}\r\n </button>\r\n\r\n <app-popover #rcList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let rc of dashboardForm?.selectedResponsibilityCenters\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\"></i>\r\n {{ rc?.item_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'rcList'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('rcList', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Program -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'responsibilityCategories' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n allProgamSelected?.length ==\r\n 0 || activeSelector === 'responsibilityCategories'\r\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n allProgamSelected?.length > 0 &&\r\n activeSelector !== 'responsibilityCategories'\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\r\n <div *ngIf=\"\r\n allProgamSelected?.length == 0\r\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\r\n allProgamSelected?.length ==\r\n 0 &&\r\n dashboardForm?.selectedRiskCategories?.length == 0\r\n \">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Select the Program(s) that you would like displayed in\r\n the<br />Dashboard, if any.\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"\r\n allProgamSelected?.length > 0\r\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let rCategory of allProgamSelected?.slice(\r\n 0,\r\n 1\r\n )\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\r\n (click)=\"remove('responsibilityCategories', rCategory)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\r\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\r\n }}</span>\r\n <button *ngIf=\"\r\n allProgamSelected\r\n ?.length > 1\r\n \"\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\r\n +{{\r\n allProgamSelected?.slice(\r\n 1\r\n ).length\r\n }}\r\n </button>\r\n\r\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let rCategory of allProgamSelected\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"\r\n remove(\r\n 'responsibilityCategories',\r\n rCategory\r\n )\r\n \"></i>\r\n {{ rCategory?.name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('responsibilityCategories', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Timeframe -->\r\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n !dashboardForm?.selectedFromDate ||\r\n !dashboardForm?.selectedToDate\r\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n dashboardForm?.selectedFromDate &&\r\n dashboardForm?.selectedToDate\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\r\n <label class=\"vx-control-panel-sub-label\">Select how long the selected information should be displayed.\r\n Once the selected timeframe expires, the dashboard will automatically be deactivated and no longer\r\n displayed to users. If no timeframe is selected, the information\r\n will be displayed permanently.</label>\r\n <div class=\"input-group vx-d-flex vx-justify-between\">\r\n <div class=\"date-select\">\r\n <i class=\"icons\"></i>\r\n <input type=\"text\" id=\"from_date\" [value]=\"\r\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\r\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker($event)\" readonly />\r\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\r\n placeholder=\"Select Date\" (onSelect)=\"\r\n closeFromDatePicker(); datePickerOverlay = false\r\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\r\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\r\n </div>\r\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\r\n <i class=\"icons\"></i>\r\n <input type=\"text\" id=\"to_date\" [value]=\"\r\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\r\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker($event)\" readonly />\r\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\r\n (onSelect)=\"\r\n closeToDatePicker(); datePickerOverlay = false\r\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\r\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\r\n </div>\r\n </div>\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n dashboardForm.selectedFromDate &&\r\n !dashboardForm.selectedToDate\r\n \">\r\n Select a time-frame.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Email Summary -->\r\n <!-- <div\r\n class=\"form-group-row\"\r\n [class.active]=\"activeSelector === 'frequency'\"\r\n [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'frequency' &&\r\n activeSelector !== 'name'\r\n \"\r\n >\r\n <div class=\"image\">\r\n <img\r\n *ngIf=\"!dashboardForm.frequencyMessage\"\r\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\r\n alt=\"\"\r\n width=\"36\"\r\n height=\"36\"\r\n />\r\n <svg\r\n *ngIf=\"dashboardForm.frequencyMessage\"\r\n class=\"checkIcon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 52 52\"\r\n >\r\n <circle\r\n class=\"checkIcon__circle\"\r\n cx=\"26\"\r\n cy=\"26\"\r\n r=\"25\"\r\n fill=\"none\"\r\n />\r\n <path\r\n class=\"checkIcon__check\"\r\n fill=\"none\"\r\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\r\n >Email Summaries</label\r\n >\r\n <label class=\"vx-control-panel-sub-label\"\r\n >If you would like to send a summary of this Dashboard, please\r\n select a frequency(By default VComply sends a weekly\r\n Summary).</label\r\n >\r\n <div\r\n *ngIf=\"!dashboardForm.frequencyMessage\"\r\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('frequency', true)\"\r\n >\r\n <div\r\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\r\n >\r\n Email Summaries\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"dashboardForm.frequencyMessage\"\r\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\r\n >\r\n <div\r\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\r\n [arTooltip]=\"dashboardForm.frequencyMessage\"\r\n placement=\"bottom-left\"\r\n type=\"black\"\r\n delay=\"0\"\r\n [tooltipMandatory]=\"false\"\r\n [innerHTML]=\"dashboardForm.frequencyMessage\"\r\n ></div>\r\n\r\n <button\r\n *ngIf=\"\r\n dashboardForm.frequencyMessage &&\r\n activeSelector !== 'frequency'\r\n \"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('frequency', true)\"\r\n >\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"button-block\">\r\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\r\n (click)=\"configureDashboard()\">\r\n Next: Configure Widgets\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\r\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\r\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\r\n <i class=\"icons\"></i>\r\n </button>\r\n <div class=\"global-confirmation-alert\" *ngIf=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \r\n \">\r\n <div class=\"global-confirmation-alert-top\">\r\n <span class=\"icon-block\">\r\n <i class=\"icons\"></i>\r\n </span>\r\n <p class=\"text\" *ngIf=\"showRiskCategory\">\r\n Select a Responsibility Center or Risk Category.\r\n </p>\r\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\r\n Select a Responsibility Center.\r\n </p>\r\n </div>\r\n <div class=\"global-confirmation-alert-bottom\">\r\n <p class=\"message\"></p>\r\n <div class=\"button-group\">\r\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\r\n OKAY\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\r\n\r\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\r\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\r\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\r\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{position:relative;z-index:1;padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select dp-date-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none;z-index:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:2}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MarxEditorComponent, selector: "vcomply-editor", inputs: ["editorConfig"], outputs: ["comment", "sendSavedFiles", "popup"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.ToolTipDirective, selector: "[arTooltip]", inputs: ["arTooltip", "placement", "type", "tooltipMandatory", "showTooltip", "animate"] }, { kind: "component", type: i10.ConfigureWidgetsComponent, selector: "app-configure-widgets", inputs: ["selectedWidgetsData", "displayedWidgets", "showRisk", "showCompliance", "mode"], outputs: ["widgetsDataModified", "closeConfigureWidgets"] }, { kind: "component", type: i11.PopoverComponent, selector: "app-popover", inputs: ["dontCloseonClick"], outputs: ["closedOnOverlay"] }, { kind: "directive", type: i12.PopoverDirective, selector: "[appPopover]", inputs: ["refrence", "placement"] }, { kind: "component", type: i13.LoaderInlineComponent, selector: "app-loader-inline" }, { kind: "component", type: i14.SnackBarComponent, selector: "app-snack-bar" }, { kind: "directive", type: i15.ScrollInViewDirective, selector: "[appScrollInView]", inputs: ["appScrollInView"] }, { kind: "component", type: i16.SmileyDialogComponent, selector: "app-smiley-dialog", inputs: ["message", "autoClose", "actionButtons"], outputs: ["action", "closeSmiley"] }, { kind: "component", type: i17.DatePickerComponent, selector: "dp-date-picker", inputs: ["config", "mode", "placeholder", "disabled", "displayDate", "theme", "minDate", "maxDate", "minTime", "maxTime"], outputs: ["open", "close", "onChange", "onGoToCurrent", "onLeftNav", "onRightNav", "onSelect"] }, { kind: "directive", type: i6.NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }, { kind: "component", type: i18.ProgramListComponent, selector: "app-program-list", inputs: ["items", "selectedItems", "url"], outputs: ["itemSelected", "itemDeselected", "itemsSelectedChange"] }, { kind: "component", type: i19.ListContainerComponent, selector: "app-list-container", inputs: ["heading"], outputs: ["close"] }, { kind: "component", type: i20.InformationBlockComponent, selector: "app-information-block" }, { kind: "component", type: i21.UserListComponent, selector: "app-user-list", inputs: ["selectionType", "listDetails", "totalPages", "limit", "totalList", "feature", "totalgroupscount"], outputs: ["closeUserList", "saveSelectedUsers"] }, { kind: "component", type: i22.ResponsibilityCenterComponent, selector: "app-responsibility-center", inputs: ["responsibilityCentersList", "selectedResponsibilityCenters", "rcIdKey", "radioSelection"], outputs: ["saveSelectedList", "closeRcList"] }, { kind: "pipe", type: i6.SlicePipe, name: "slice" }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i5.TextCountPipe, name: "textCount" }] });
|
|
1570
|
+
}
|
|
1571
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateDashboardComponent, decorators: [{
|
|
1572
|
+
type: Component,
|
|
1573
|
+
args: [{ selector: 'app-create-dashboard', providers: [TextCountPipe], template: "<app-snack-bar></app-snack-bar>\r\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\r\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\r\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\r\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\r\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\r\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\r\n [feature]=\"feature\"></app-user-list>\r\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\r\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\r\n [selectedResponsibilityCenters]=\"\r\n dashboardForm.selectedResponsibilityCenters\r\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\r\n (closeRcList)=\"activateSelector('', false)\">\r\n </app-responsibility-center>\r\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\r\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\r\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\r\n (saveSelectedCategory)=\"\r\n saveSelectedList('responsibilityCategories', $event)\r\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\r\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\r\n (close)=\"activateSelector('', false)\">\r\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\r\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\r\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\r\n <div class=\"left-side vx-fs-12 vx-d-flex\">\r\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\r\n <button\r\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\r\n {{ allProgamSelected.length }}\r\n </button>\r\n <span class=\"selected-text\">\r\n Program\r\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\r\n Selected</span>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-side vx-d-flex\">\r\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\r\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\r\n Next <i class=\"icons\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </app-list-container>\r\n\r\n </div>\r\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\r\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\r\n\r\n <div class=\"form-group\" [class.disabled]=\"disabled\">\r\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\r\n [class.hidden-scroll]=\"popoverService.stopScroll\">\r\n <!-- Dashboard Name -->\r\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\r\n <div class=\"image\">\r\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\r\n !dashboardForm.dashboardName || activeSelector === 'name'\r\n \" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\r\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\r\n Name\r\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\r\n <div class=\"vx-input-group\">\r\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\r\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\r\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\r\n\r\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\r\n dashboardForm.dashboardName.length }}</span>\r\n </div>\r\n\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n (dashboardForm?.dashboardName?.length > 30 ||\r\n !dashboardForm?.dashboardName)\r\n \">\r\n {{\r\n dashboardForm.dashboardName.length > 30\r\n ? \"You have exceeded the maximum character limit of 30 characters.\"\r\n : \"Please enter a name for this Dashboard.\"\r\n }}\r\n </p>\r\n\r\n <div class=\"vx-input-group vx-mt-2\">\r\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\r\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\r\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\r\n 250 -\r\n (dashboardForm?.dashboardDescriptionText | textCount)\r\n }}</span>\r\n </div>\r\n\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\r\n \">\r\n You have exceeded the maximum character limit of 250\r\n characters.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dashboard Display Criteria -->\r\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\r\n Dashboard Display Criteria\r\n </span>\r\n <app-information-block></app-information-block>\r\n\r\n <!-- Who -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'whoCanView' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\r\n dashboardForm?.selectedViewers?.length == 0 ||\r\n activeSelector === 'whoCanView'\r\n \" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg class=\"checkIcon\" *ngIf=\"\r\n dashboardForm?.selectedViewers?.length > 0 &&\r\n activeSelector !== 'whoCanView'\r\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\r\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\r\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\r\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('whoCanView', true)\">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Who can view this dashboard?\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\r\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n user.member_id\r\n )\r\n \" (click)=\"remove('whoCanView', user)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\r\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\r\n }}</span>\r\n <button *ngIf=\"\r\n dashboardForm?.selectedViewers?.length > 1 &&\r\n !groupsEnabled\r\n \"\r\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"userList.popover()\" placement=\"left\">\r\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\r\n </button>\r\n </div>\r\n <app-popover #userList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let user of dashboardForm?.selectedViewers\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n user.member_id\r\n ) && !groupsEnabled\r\n \" (click)=\"remove('whoCanView', user)\"></i>\r\n {{ user?.member_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </ng-container>\r\n\r\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\r\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\r\n <button\r\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\r\n {{ dashboardForm?.selectedViewers?.length }}\r\n </button>\r\n </div>\r\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\r\n dashboardForm?.selectedGroup?.length &&\r\n dashboardForm?.selectedViewers?.length\r\n \">&</span>\r\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\r\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\r\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\r\n <button\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\r\n {{ dashboardForm?.selectedGroup?.length }}\r\n </button>\r\n </div>\r\n\r\n <app-popover #userCount [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" *ngIf=\"\r\n !listDetails.nonRemovableUsersList.includes(\r\n data.member_id\r\n )\r\n \" (click)=\"remove('whoCanView', data)\"></i>\r\n {{ data.member_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n\r\n <app-popover #groupCount [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\"></i>\r\n {{ data.group_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('whoCanView', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Responsibility Center -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'rcList' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\r\n activeSelector === 'rcList'\r\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\r\n activeSelector !== 'rcList'\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\r\n CENTER(S)</label>\r\n <div *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0\r\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\r\n allProgamSelected?.length ==\r\n 0 &&\r\n dashboardForm?.selectedRiskCategories?.length == 0\r\n \">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Select the Responsibility Center(s) that you would like<br />displayed\r\n in the Dashboard, if any.\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 0\r\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\r\n 0,\r\n 1\r\n )\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\r\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\r\n <button *ngIf=\"\r\n dashboardForm?.selectedResponsibilityCenters?.length > 1\r\n \"\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\r\n +{{\r\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\r\n .length\r\n }}\r\n </button>\r\n\r\n <app-popover #rcList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let rc of dashboardForm?.selectedResponsibilityCenters\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\"></i>\r\n {{ rc?.item_name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'rcList'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('rcList', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Program -->\r\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'responsibilityCategories' &&\r\n activeSelector !== 'name'\r\n \">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n allProgamSelected?.length ==\r\n 0 || activeSelector === 'responsibilityCategories'\r\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n allProgamSelected?.length > 0 &&\r\n activeSelector !== 'responsibilityCategories'\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\r\n <div *ngIf=\"\r\n allProgamSelected?.length == 0\r\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\r\n allProgamSelected?.length ==\r\n 0 &&\r\n dashboardForm?.selectedRiskCategories?.length == 0\r\n \">\r\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\r\n Select the Program(s) that you would like displayed in\r\n the<br />Dashboard, if any.\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"\r\n allProgamSelected?.length > 0\r\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\r\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\r\n let rCategory of allProgamSelected?.slice(\r\n 0,\r\n 1\r\n )\r\n \">\r\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\r\n (click)=\"remove('responsibilityCategories', rCategory)\"></i>\r\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\r\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\r\n }}</span>\r\n <button *ngIf=\"\r\n allProgamSelected\r\n ?.length > 1\r\n \"\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\r\n +{{\r\n allProgamSelected?.slice(\r\n 1\r\n ).length\r\n }}\r\n </button>\r\n\r\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\r\n <div class=\"action-list\">\r\n <ul class=\"action-item\">\r\n <li *ngFor=\"\r\n let rCategory of allProgamSelected\r\n | slice : 1;\r\n let j = index\r\n \">\r\n <div class=\"avatar-card\">\r\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\r\n type=\"black\" [tooltipMandatory]=\"false\">\r\n <i class=\"icons cross-icon\" (click)=\"\r\n remove(\r\n 'responsibilityCategories',\r\n rCategory\r\n )\r\n \"></i>\r\n {{ rCategory?.name }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </div>\r\n\r\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('responsibilityCategories', true)\">\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Timeframe -->\r\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\r\n <div class=\"image\">\r\n <img *ngIf=\"\r\n !dashboardForm?.selectedFromDate ||\r\n !dashboardForm?.selectedToDate\r\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\r\n <svg *ngIf=\"\r\n dashboardForm?.selectedFromDate &&\r\n dashboardForm?.selectedToDate\r\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\r\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\r\n <label class=\"vx-control-panel-sub-label\">Select how long the selected information should be displayed.\r\n Once the selected timeframe expires, the dashboard will automatically be deactivated and no longer\r\n displayed to users. If no timeframe is selected, the information\r\n will be displayed permanently.</label>\r\n <div class=\"input-group vx-d-flex vx-justify-between\">\r\n <div class=\"date-select\">\r\n <i class=\"icons\"></i>\r\n <input type=\"text\" id=\"from_date\" [value]=\"\r\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\r\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker($event)\" readonly />\r\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\r\n placeholder=\"Select Date\" (onSelect)=\"\r\n closeFromDatePicker(); datePickerOverlay = false\r\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\r\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\r\n </div>\r\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\r\n <i class=\"icons\"></i>\r\n <input type=\"text\" id=\"to_date\" [value]=\"\r\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\r\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker($event)\" readonly />\r\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\r\n (onSelect)=\"\r\n closeToDatePicker(); datePickerOverlay = false\r\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\r\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\r\n </div>\r\n </div>\r\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\r\n submitted &&\r\n dashboardForm.selectedFromDate &&\r\n !dashboardForm.selectedToDate\r\n \">\r\n Select a time-frame.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Email Summary -->\r\n <!-- <div\r\n class=\"form-group-row\"\r\n [class.active]=\"activeSelector === 'frequency'\"\r\n [class.disabled]=\"\r\n activeSelector &&\r\n activeSelector !== 'frequency' &&\r\n activeSelector !== 'name'\r\n \"\r\n >\r\n <div class=\"image\">\r\n <img\r\n *ngIf=\"!dashboardForm.frequencyMessage\"\r\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\r\n alt=\"\"\r\n width=\"36\"\r\n height=\"36\"\r\n />\r\n <svg\r\n *ngIf=\"dashboardForm.frequencyMessage\"\r\n class=\"checkIcon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 52 52\"\r\n >\r\n <circle\r\n class=\"checkIcon__circle\"\r\n cx=\"26\"\r\n cy=\"26\"\r\n r=\"25\"\r\n fill=\"none\"\r\n />\r\n <path\r\n class=\"checkIcon__check\"\r\n fill=\"none\"\r\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"form\">\r\n <div class=\"vx-form-group vx-d-block\">\r\n <label\r\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\r\n >Email Summaries</label\r\n >\r\n <label class=\"vx-control-panel-sub-label\"\r\n >If you would like to send a summary of this Dashboard, please\r\n select a frequency(By default VComply sends a weekly\r\n Summary).</label\r\n >\r\n <div\r\n *ngIf=\"!dashboardForm.frequencyMessage\"\r\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('frequency', true)\"\r\n >\r\n <div\r\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\r\n >\r\n Email Summaries\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"dashboardForm.frequencyMessage\"\r\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\r\n >\r\n <div\r\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\r\n [arTooltip]=\"dashboardForm.frequencyMessage\"\r\n placement=\"bottom-left\"\r\n type=\"black\"\r\n delay=\"0\"\r\n [tooltipMandatory]=\"false\"\r\n [innerHTML]=\"dashboardForm.frequencyMessage\"\r\n ></div>\r\n\r\n <button\r\n *ngIf=\"\r\n dashboardForm.frequencyMessage &&\r\n activeSelector !== 'frequency'\r\n \"\r\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n (click)=\"activateSelector('frequency', true)\"\r\n >\r\n <i class=\"icons vx-mr-1\"></i> EDIT\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"button-block\">\r\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\r\n (click)=\"configureDashboard()\">\r\n Next: Configure Widgets\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\r\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\r\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\r\n <i class=\"icons\"></i>\r\n </button>\r\n <div class=\"global-confirmation-alert\" *ngIf=\"\r\n submitted &&\r\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \r\n \">\r\n <div class=\"global-confirmation-alert-top\">\r\n <span class=\"icon-block\">\r\n <i class=\"icons\"></i>\r\n </span>\r\n <p class=\"text\" *ngIf=\"showRiskCategory\">\r\n Select a Responsibility Center or Risk Category.\r\n </p>\r\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\r\n Select a Responsibility Center.\r\n </p>\r\n </div>\r\n <div class=\"global-confirmation-alert-bottom\">\r\n <p class=\"message\"></p>\r\n <div class=\"button-group\">\r\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\r\n OKAY\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\r\n\r\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\r\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\r\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\r\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{position:relative;z-index:1;padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select dp-date-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none;z-index:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:2}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"] }]
|
|
1574
|
+
}], ctorParameters: function () { return [{ type: i1.CreateDashboardService }, { type: i2.PaginationService }, { type: i0.ChangeDetectorRef }, { type: i3.SnackBarService }, { type: i4.PopoverService }, { type: i5.TextCountPipe }]; }, propDecorators: { feature: [{
|
|
1575
|
+
type: Input
|
|
1576
|
+
}], mode: [{
|
|
1577
|
+
type: Input
|
|
1578
|
+
}], dashboardId: [{
|
|
1579
|
+
type: Input
|
|
1580
|
+
}], dashboardDetails: [{
|
|
1581
|
+
type: Input
|
|
1582
|
+
}], close: [{
|
|
1583
|
+
type: Output
|
|
1584
|
+
}], createdBy: [{
|
|
1585
|
+
type: Input
|
|
1586
|
+
}], fromDatePicker: [{
|
|
1587
|
+
type: ViewChild,
|
|
1588
|
+
args: ['fromDatePicker']
|
|
1589
|
+
}], toDatePicker: [{
|
|
1590
|
+
type: ViewChild,
|
|
1591
|
+
args: ['toDatePicker']
|
|
1592
|
+
}], configureWidget: [{
|
|
1593
|
+
type: Input
|
|
1594
|
+
}], onKeydownHandler: [{
|
|
1595
|
+
type: HostListener,
|
|
1596
|
+
args: ['document:keydown.escape', ['$event']]
|
|
1597
|
+
}], documentClick: [{
|
|
1598
|
+
type: HostListener,
|
|
1599
|
+
args: ['document:click', ['$event']]
|
|
1600
|
+
}] } });
|
|
1601
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxRQUFRLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsK0JBQStCLEVBQy9CLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1QixxQkFBcUIsR0FDdEIsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRDLE1B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ckIsQ0FBQyxhQUFhLENBQUM7b1FBR2pCLE9BQU87c0JBQWYsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0ksS0FBSztzQkFBZCxNQUFNO2dCQUNFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ3VCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNBLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFFaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFxTCtDLGdCQUFnQjtzQkFBcEUsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvcERuRCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFZGl0b3JDb25maWcgfSBmcm9tICdAdmNvbXBseS9lZGl0b3InO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyQ29tcG9uZW50LCBJRGF0ZVBpY2tlckNvbmZpZyB9IGZyb20gJ25nMi1kYXRlLXBpY2tlcic7XHJcbmltcG9ydCB7IENyZWF0ZURhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NyZWF0ZS1kYXNoYm9hcmQuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9wYWdpbmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyTGlzdENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3VzZXItbGlzdC91c2VyLWxpc3QuY29uZmlnJztcclxuaW1wb3J0IHsgQ3JlYXRlRGFzaGJvYXJkRm9ybSB9IGZyb20gJy4vY3JlYXRlLWRhc2hib2FyZC1jb25maWcnO1xyXG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi91aS1raXQvc25hY2stYmFyL3NuYWNrLWJhci5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdWkta2l0L3BvcG92ZXIvcG9wb3Zlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGV4dENvdW50UGlwZSB9IGZyb20gJy4vcGlwZXMvdGV4dC1jb3VudC5waXBlJztcclxuaW1wb3J0IHsgQVNTRVRTIH0gZnJvbSAnLi9jb25zdGFudHMvYXNzZXRzLmNvbnN0YW50JztcclxuaW1wb3J0IHsgUFJPR1JBTV9MSVNUX0FQSSB9IGZyb20gJy4vcHJvZ3JhbS1saXN0L2NvbnN0YW50JztcclxuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuL3Byb2dyYW0tbGlzdC9pbnRlcmZhY2VzL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzLFxyXG4gIGV4dHJhY3RDYXRlZ29yeUlkc0Zyb21EYXNoYm9hcmQsXHJcbiAgZXh0cmFjdFByb2dyYW1JZHNGcm9tRGFzaGJvYXJkLFxyXG4gIGV4dHJhY3RSY0lkc0Zyb21EYXNoYm9hcmQsXHJcbiAgZmlsdGVyQWN0aXZlV2lkZ2V0cyxcclxuICBmbGF0dGVuUHJvZ3JhbVNlbGVjdGlvbk1hcCxcclxuICBnZXRFZGl0RGFzaGJvYXJkQ2RpZCxcclxuICBnZXRTZWxlY3RlZFByb2dyYW1zTWFwLFxyXG4gIGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcCxcclxuICBub3JtYWxpemVJZEFycmF5LFxyXG4gIG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzLFxyXG4gIG5vcm1hbGl6ZVByb2dyYW1TZWxlY3Rpb25NYXAsXHJcbiAgcGFyc2VTYWlsc1Byb2dyYW1MaXN0LFxyXG59IGZyb20gJy4vdXRpbHMvZGFzaGJvYXJkLWVkaXQudXRpbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY3JlYXRlLWRhc2hib2FyZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1kYXNoYm9hcmQuY29tcG9uZW50Lmxlc3MnXSxcclxuICBwcm92aWRlcnM6IFtUZXh0Q291bnRQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZURhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmZWF0dXJlOiBhbnk7XHJcbiAgYWN0aXZlU2VsZWN0b3IgPSAnJztcclxuICBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1vZGUgPSAnQ1JFQVRFJztcclxuICBASW5wdXQoKSBkYXNoYm9hcmRJZCA9ICcnO1xyXG4gIEBJbnB1dCgpIGRhc2hib2FyZERldGFpbHM6IGFueSA9IG51bGw7IC8vIGZvciBlZGl0IGRhc2hib2FyZFxyXG4gIC8qKiBBUEkgZGFzaGJvYXJkIG9iamVjdCBmcm9tIGNyZWF0ZURhc2hib2FyZCByZXNwb25zZSAodXNlZCB3aGVuIG5hdmlnYXRpbmcgYWZ0ZXIgY3JlYXRlKS4gKi9cclxuICBwcml2YXRlIGNyZWF0ZWREYXNoYm9hcmQ6IGFueSA9IG51bGw7XHJcbiAgLyoqIFRydWUgYWZ0ZXIgQ1JFQVRFIEFQSSBzdWNjZWVkczsgd2lkZ2V0IHNhdmUgc2hvdWxkIGVtaXQgYGNyZWF0ZWRgIGZvciBhcHAgcmVkaXJlY3QuICovXHJcbiAgcHJpdmF0ZSByZWRpcmVjdEFmdGVyQ3JlYXRlID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBJbnB1dCgpIGNyZWF0ZWRCeSA9IDA7XHJcbiAgQFZpZXdDaGlsZCgnZnJvbURhdGVQaWNrZXInKSBmcm9tRGF0ZVBpY2tlciE6IERhdGVQaWNrZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgndG9EYXRlUGlja2VyJykgdG9EYXRlUGlja2VyITogRGF0ZVBpY2tlckNvbXBvbmVudDtcclxuICBhbmltYXRpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyZVdpZGdldCA9IGZhbHNlO1xyXG4gIEFTU0VUUzogYW55ID0gQVNTRVRTO1xyXG5cclxuICB0b3RhbFBhZ2VzID0gMTtcclxuICB0b3RhbExpc3QgPSAxO1xyXG4gIHVzZXJzTGlzdDogYW55W10gPSBbXTtcclxuICB2TG9hZGVyID0gdHJ1ZTtcclxuICB1c2VyTGlzdExvYWRlZCA9IGZhbHNlO1xyXG4gIGdyb3VwTGlzdExvYWRlZCA9IGZhbHNlO1xyXG4gIHJjTGlzdExvYWRlZCA9IGZhbHNlO1xyXG4gIGhpZGVUb0RhdGUgPSBmYWxzZTtcclxuICBsaXN0RGV0YWlsczogVXNlckxpc3RDb25maWd1cmF0aW9uID0ge1xyXG4gICAgc2VsZWN0ZWRVc2Vyc0xpc3Q6IFtdLFxyXG4gICAgc2VsZWN0ZWRHcm91cExpc3Q6IFtdLFxyXG4gICAgbm9uUmVtb3ZhYmxlVXNlcnNMaXN0OiBbXSxcclxuICAgIGRpc3BsYXlFbGVtZW50S2V5OiAnbWVtYmVyX25hbWUnLFxyXG4gICAgZGlzcGxheUdyb3VwS2V5OiAnZ3JvdXBfbmFtZScsXHJcbiAgICBncm91cElka2V5OiAnZ3JvdXBfaWQnLFxyXG4gICAgZWxlbWVudElkS2V5OiAnbWVtYmVyX2lkJyxcclxuICAgIHRvb2x0aXBLZXk6ICdtZW1iZXJfZW1haWwnLFxyXG4gIH07XHJcbiAgZGFzaGJvYXJkRGVzY3JpcHRpb246IEVkaXRvckNvbmZpZyA9IHtcclxuICAgIHBsYWNlaG9sZGVyOiAnRGVzY3JpcHRpb24gKE1heCBsaW1pdDogMjUwIGNoYXJhY3RlcnMpJyxcclxuICAgIG1vZGU6ICdwcmltZScsXHJcbiAgICBpZDogJ2Rlc2NyaXB0aW9uJyxcclxuICB9O1xyXG4gIHJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllc1RyZWU6IGFueSA9IHtcclxuICAgIHJlZ3VsYXRpb25zOiB7XHJcbiAgICAgIGxpc3Q6IFtdLFxyXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxyXG4gICAgfSxcclxuICAgIHN0YW5kYXJkczoge1xyXG4gICAgICBsaXN0OiBbXSxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcclxuICAgIH0sXHJcbiAgICBpbnRlcm5hbENvbnRyb2xzOiB7XHJcbiAgICAgIGxpc3Q6IFtdLFxyXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxyXG4gICAgfSxcclxuICAgIG90aGVyczoge1xyXG4gICAgICBsaXN0OiBbXSxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBhbGxDb21wbGlhbmNlQ2F0ZWdvcmllczogYW55W10gPSBbXTtcclxuICBhbGxSaXNrQ2F0ZWdvcmllczogYW55W10gPSBbXTtcclxuICBzaG93Umlza0NhdGVnb3J5ID0gZmFsc2U7XHJcbiAgc2hvd0NyaXRlcmlhID0gdHJ1ZTtcclxuXHJcbiAgZGFzaGJvYXJkRm9ybTogQ3JlYXRlRGFzaGJvYXJkRm9ybSA9IHtcclxuICAgIGRhc2hib2FyZE5hbWU6ICcnLFxyXG4gICAgZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0OiAnJyxcclxuICAgIHNlbGVjdGVkVmlld2VyczogW10sXHJcbiAgICBzZWxlY3RlZEdyb3VwOiBbXSxcclxuICAgIHNlbGVjdGVkRnJvbURhdGU6IHVuZGVmaW5lZCxcclxuICAgIHNlbGVjdGVkVG9EYXRlOiB1bmRlZmluZWQsXHJcbiAgICBzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVyczogW10sXHJcbiAgICBzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllczogW10sXHJcbiAgICBzZWxlY3RlZFJpc2tDYXRlZ29yaWVzOiBbXSxcclxuICAgIGRpc3BsYXlDcml0ZXJpYTogJ29yJyxcclxuICAgIGNvbmZpZ3VyZVdpZGdldDogW10sXHJcbiAgICBmcmVxdWVuY3lEZXRhaWxzOiAnJyxcclxuICAgIHNlbGVjdGVkRnJlcXVlbmN5VHlwZTogJycsXHJcbiAgICBzZWxlY3RlZEZyZXF1ZW5jaWVzOiBbMF0sXHJcbiAgICBmcmVxdWVuY3lNZXNzYWdlOiAnJyxcclxuICAgIGZyZXF1ZW5jeURhdGU6IDEsXHJcbiAgfTtcclxuXHJcbiAgb3BlbkNvbmZpZ3VyZVdpZGdldHMgPSBmYWxzZTtcclxuICBzZWxlY3RlZFdpZGdldHM6IGFueSA9IFtdO1xyXG4gIGRpc3BsYXllZFdpZGdldHM6IGFueSA9IFtdO1xyXG5cclxuICByZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XHJcbiAgZGF5TmFtZXMgPSBbXHJcbiAgICAnTW9uZGF5JyxcclxuICAgICdUdWVzZGF5JyxcclxuICAgICdXZWRuZXNkYXknLFxyXG4gICAgJ1RodXJzZGF5JyxcclxuICAgICdGcmlkYXknLFxyXG4gICAgJ1NhdHVyZGF5JyxcclxuICAgICdTdW5kYXknLFxyXG4gIF07XHJcbiAgbW9udGhOYW1lcyA9IFtcclxuICAgICdKYW51YXJ5JyxcclxuICAgICdGZWJydWFyeScsXHJcbiAgICAnTWFyY2gnLFxyXG4gICAgJ0FwcmlsJyxcclxuICAgICdNYXknLFxyXG4gICAgJ0p1bmUnLFxyXG4gICAgJ0p1bHknLFxyXG4gICAgJ0F1Z3VzdCcsXHJcbiAgICAnU2VwdGVtYmVyJyxcclxuICAgICdPY3RvYmVyJyxcclxuICAgICdOb3ZlbWJlcicsXHJcbiAgICAnRGVjZW1iZXInLFxyXG4gIF07XHJcbiAgcXVhcnRlcnMgPSBbXHJcbiAgICAnSmFudWFyeSwgQXByaWwsIEp1bHksIE9jdG9iZXInLFxyXG4gICAgJ0ZlYnJ1YXJ5LCBNYXksIEF1Z3VzdCwgTm92ZW1iZXInLFxyXG4gICAgJ01hcmNoLCBKdW5lLCBTZXB0ZW1iZXIsIERlY2VtYmVyJyxcclxuICBdO1xyXG5cclxuICBzaG93Umlza1dpZGdldHMgPSBmYWxzZTtcclxuICBzaG93Q29tcGxpYW5jZVdpZGdldHMgPSBmYWxzZTtcclxuICBpc01hbmFnZVJpc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcmlza0NhdGVnb3J5TGlzdCA9IHtcclxuICAgIHN0cmF0ZWdpYzoge1xyXG4gICAgICBsaXN0OiBbXSxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcclxuICAgIH0sXHJcbiAgICBvcGVyYXRpb25hbDoge1xyXG4gICAgICBsaXN0OiBbXSxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcclxuICAgIH0sXHJcbiAgICBjb21wbGlhbmNlOiB7XHJcbiAgICAgIGxpc3Q6IFtdLFxyXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxyXG4gICAgfSxcclxuICAgIG90aGVyczoge1xyXG4gICAgICBsaXN0OiBbXSxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBwcm9ncmFtTGlzdFVybDogYW55ID0gUFJPR1JBTV9MSVNUX0FQSTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlja2VyQmFzZUNvbmZpZzogSURhdGVQaWNrZXJDb25maWcgPSB7XHJcbiAgICBvcGVuT25DbGljazogZmFsc2UsXHJcbiAgICBvcGVuT25Gb2N1czogZmFsc2UsXHJcbiAgICBoaWRlSW5wdXRDb250YWluZXI6IHRydWUsXHJcbiAgICBoaWRlT25PdXRzaWRlQ2xpY2s6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgZnJvbURhdGVQaWNrZXJDb25maWc6IElEYXRlUGlja2VyQ29uZmlnID0ge1xyXG4gICAgLi4udGhpcy5kYXRlUGlja2VyQmFzZUNvbmZpZyxcclxuICAgIG1pbjogdGhpcy5nZXRDdXJyZW50RGF0ZSgpLFxyXG4gIH07XHJcblxyXG4gIHRvRGF0ZVBpY2tlckNvbmZpZzogSURhdGVQaWNrZXJDb25maWcgPSB7XHJcbiAgICAuLi50aGlzLmRhdGVQaWNrZXJCYXNlQ29uZmlnLFxyXG4gIH07XHJcblxyXG4gIGlzU21pbGV5ITogYm9vbGVhbjtcclxuICBzbWlsZXlNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBncm91cExpc3Q6IGFueTtcclxuICBncm91cHNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICB0b3RhbGdyb3VwczogYW55O1xyXG4gIG9wZW5lZERhdGVQaWNrZXI6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkUHJvZ3JhbXM6IGFueSA9IHt9O1xyXG4gIGFsbFByb2dhbVNlbGVjdGVkOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgcGVuZGluZ0VkaXRSY0lkczogbnVtYmVyW10gPSBbXTtcclxuICBwcml2YXRlIHBlbmRpbmdFZGl0UmNFbnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgZWRpdEZvcm1IeWRyYXRlZCA9IGZhbHNlO1xyXG4gIC8qKiBUcmFja3MgaW4tZmxpZ2h0IEVESVQgaHlkcmF0aW9uIEhUVFAgY2FsbHM7IGxvYWRlciBzdGF5cyBvbiB1bnRpbCB6ZXJvLiAqL1xyXG4gIHByaXZhdGUgZWRpdEh5ZHJhdGlvbkNvdW50ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNyZWF0ZURhc2hib2FyZFNlcnZpY2U6IENyZWF0ZURhc2hib2FyZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgc25hY2tCYXI6IFNuYWNrQmFyU2VydmljZSxcclxuICAgIHB1YmxpYyBwb3BvdmVyU2VydmljZTogUG9wb3ZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRleHRDb3VudDogVGV4dENvdW50UGlwZVxyXG4gICkge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5KSB7XHJcbiAgICAgIHRoaXMubGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0LnB1c2godGhpcy5jcmVhdGVkQnkpO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm1vZGUgPT09ICdFRElUJyAmJlxyXG4gICAgICBjaGFuZ2VzWydkYXNoYm9hcmREZXRhaWxzJ10/LmN1cnJlbnRWYWx1ZSAmJlxyXG4gICAgICB0aGlzLnJjTGlzdExvYWRlZCAmJlxyXG4gICAgICB0aGlzLnVzZXJMaXN0TG9hZGVkICYmXHJcbiAgICAgIHRoaXMuZ3JvdXBMaXN0TG9hZGVkXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5oeWRyYXRlRWRpdEZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihcclxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50XHJcbiAgKSB7XHJcbiAgICB0aGlzLmNsb3NlLmVtaXQoeyBtb2RlOiAnZGlzY2FyZCcgfSk7XHJcbiAgICB0aGlzLmlzU21pbGV5ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW5pbWF0ZUNvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5nZXRSQ0xpc3QoKTtcclxuICAgIHRoaXMuY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKTtcclxuICAgIHRoaXMuZ2V0VXNlcnNMaXN0KCcnKTtcclxuICAgIHRoaXMuZ2V0R3JvdXBMaXN0KCk7XHJcbiAgICB0aGlzLmdldFVzZXJJbmZvKCk7XHJcbiAgfVxyXG4gIFxyXG4gIGFuaW1hdGVDb250YWluZXIoKSB7XHJcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5hbmltYXRpb24gPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VySW5mbygpe1xyXG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbigpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRQZXJtaXNzaW9uKHJlcz8ucm9sZUFjdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHF1aWNrTGluayA9IHJlcy5xdWlja19saW5rO1xyXG4gICAgICAgIGlmIChxdWlja0xpbmsucmlzaykge1xyXG4gICAgICAgICAgdGhpcy5zaG93Umlza0NhdGVnb3J5ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zaG93Umlza0NhdGVnb3J5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3BsYXlzIHRoZSBsaXN0aW5nIHBhZ2VzIHRoZSBsZWZ0IHNpZGUgb2YgcG9saWN5IGZvcm0gdG8gc2V0IGFuZCBlZGl0IHRoZSBkcm9wZG93biBmaWVsZHMgdmFsdWVzXHJcbiAgICogQHBhcmFtIHR5cGUgaG9sZHMgbmFtZSBvZiBwYXJ0aWN1bGFyIGxpc3QgaXMgdG8gYmUgZGlzcGxheWVkXHJcbiAgICogQHBhcmFtIGV2ZW50IGNvbnRhaW5zIGJvb2xlYW4gdmFsdWUgdG8gZGlzcGxheSB0aGUgbGlzdCBvciBub3RcclxuICAgKi9cclxuICBhY3RpdmF0ZVNlbGVjdG9yKHR5cGU6IGFueSwgZXZlbnQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0eXBlID09ICdmcmVxdWVuY3knIHx8IHRoaXMuYWN0aXZlU2VsZWN0b3IgPT0gJ2ZyZXF1ZW5jeScpIHtcclxuICAgICAgdGhpcy5zaG93Q3JpdGVyaWEgPSBmYWxzZTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93Q3JpdGVyaWEgPSB0cnVlO1xyXG4gICAgICB9LCAxKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJyAmJiBldmVudCkge1xyXG4gICAgICB0aGlzLnN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTtcclxuICAgICAgdGhpcy5lbnN1cmVQcm9ncmFtU2VsZWN0aW9uTWFwRm9yTGlzdCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVTZWxlY3RvciA9IGV2ZW50ID8gdHlwZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgb25Qcm9ncmFtU2VsZWN0aW9uQ2hhbmdlKGl0ZW1zOiBMaXN0SXRlbVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBpdGVtcztcclxuICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSAoW10gYXMgYW55KS5jb25jYXQoLi4uT2JqZWN0LnZhbHVlcyhpdGVtcykpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPVxyXG4gICAgICBub3JtYWxpemVQcm9ncmFtQ2F0ZWdvcmllcyh0aGlzLmFsbFByb2dhbVNlbGVjdGVkKTtcclxuICAgIHRoaXMuYXBwbHlSZXNwb25zaWJpbGl0eUNhdGVnb3J5V2lkZ2V0RmlsdGVycygpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBjaGVja0RlZmF1bHRQcm9ncmFtT25SZW1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQuZmlsdGVyKFxyXG4gICAgICAocHJvZ3JhbTogYW55KSA9PiBwcm9ncmFtPy5pZCAhPT0gZXZlbnQ/LmlkXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZW1vdmVQcm9ncmFtKGV2ZW50KTtcclxuXHJcbiAgfVxyXG5cclxuICByZW1vdmVQcm9ncmFtKHByb2dyYW06IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyk7XHJcbiAgICBrZXlzLmZvckVhY2goKGtleTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFByb2dyYW1zW2tleV0uZmluZEluZGV4KFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09PSBwcm9ncmFtPy5pZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb2dyYW1zW2tleV0uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKHRoaXMuc2VsZWN0ZWRQcm9ncmFtcykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmxhdCA9XHJcbiAgICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDBcclxuICAgICAgICA/IHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWRcclxuICAgICAgICA6IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA/PyBbXTtcclxuICAgIGNvbnN0IGZyb21Gb3JtID0gYnVpbGRQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUNhdGVnb3JpZXMoXHJcbiAgICAgIGZsYXQsXHJcbiAgICAgIHRoaXMuYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcclxuICAgICk7XHJcbiAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKGZyb21Gb3JtKSkge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChmcm9tRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGh5ZHJhdGVQcm9ncmFtc0Zyb21EYXNoYm9hcmREYXRhKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHByb2dyYW1zUmF3ID0gZGF0YT8ucHJvZ3JhbXMgPz8gZGF0YT8ucHJvZ3JhbUlkID8/IGRhdGE/LnByb2dyYW1JZHM7XHJcbiAgICBpZiAoXHJcbiAgICAgIEFycmF5LmlzQXJyYXkocHJvZ3JhbXNSYXcpICYmXHJcbiAgICAgIHByb2dyYW1zUmF3Lmxlbmd0aCAmJlxyXG4gICAgICB0eXBlb2YgcHJvZ3JhbXNSYXdbMF0gPT09ICdvYmplY3QnXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgY2hpcHMgPSBwcm9ncmFtc1Jhdy5tYXAoKHA6IGFueSkgPT4gKHtcclxuICAgICAgICBpZDogcD8uaWQgPz8gcD8ucHJvZ3JhbUlkLFxyXG4gICAgICAgIGNhdGVnb3J5X2lkOiBwPy5pZCA/PyBwPy5wcm9ncmFtSWQsXHJcbiAgICAgICAgbmFtZTogcD8ubmFtZSA/PyBwPy5pdGVtX25hbWUsXHJcbiAgICAgICAgaXRlbV9uYW1lOiBwPy5uYW1lID8/IHA/Lml0ZW1fbmFtZSxcclxuICAgICAgICBwcm9ncmFtSWQ6IHA/LmlkID8/IHA/LnByb2dyYW1JZCxcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoY2hpcHMpO1xyXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcclxuICAgICAgXTtcclxuICAgICAgY29uc3QgbWFwID0gYnVpbGRQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUNhdGVnb3JpZXMoXHJcbiAgICAgICAgY2hpcHMsXHJcbiAgICAgICAgdGhpcy5hbGxDb21wbGlhbmNlQ2F0ZWdvcmllc1xyXG4gICAgICApO1xyXG4gICAgICBpZiAoT2JqZWN0LmtleXMobWFwKS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBtYXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJvZ3JhbSA9IGRhdGE/LnByb2dyYW0gPz8ge307XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IGdldFNlbGVjdGVkUHJvZ3JhbXNNYXAoZGF0YSk7XHJcbiAgICBpZiAoc2VsZWN0ZWRNYXAgJiYgaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKHNlbGVjdGVkTWFwKSkge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChzZWxlY3RlZE1hcCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFsbFByb2dyYW1zID0gcHJvZ3JhbT8uYWxsX3Byb2dyYW1zO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsUHJvZ3JhbXMpICYmIGFsbFByb2dyYW1zLmxlbmd0aCkge1xyXG4gICAgICBpZiAodHlwZW9mIGFsbFByb2dyYW1zWzBdID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzKFxyXG4gICAgICAgICAgYWxsUHJvZ3JhbXMsXHJcbiAgICAgICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKG1hcCkpIHtcclxuICAgICAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcCk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGFsbFByb2dyYW1zKTtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQubGVuZ3RoID4gMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhdGVnb3J5SWRzID0gZXh0cmFjdENhdGVnb3J5SWRzRnJvbURhc2hib2FyZChkYXRhKTtcclxuICAgIGlmIChjYXRlZ29yeUlkcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3Qgc3R1YnMgPSBjYXRlZ29yeUlkcy5tYXAoKGlkKSA9PiAoe1xyXG4gICAgICAgIGNhdGVnb3J5X2lkOiBpZCxcclxuICAgICAgICBpZCxcclxuICAgICAgICBpdGVtX25hbWU6IGBDYXRlZ29yeSAke2lkfWAsXHJcbiAgICAgIH0pKTtcclxuICAgICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKHN0dWJzKTtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xyXG4gICAgICAgIC4uLnRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQsXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUZsYXRQcm9ncmFtQ2F0ZWdvcmllcyhjYXRlZ29yaWVzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCFjYXRlZ29yaWVzPy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGNhdGVnb3JpZXMpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xyXG4gICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxyXG4gICAgXTtcclxuICAgIGNvbnN0IG1hcCA9IGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzKFxyXG4gICAgICBjYXRlZ29yaWVzLFxyXG4gICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXHJcbiAgICApO1xyXG4gICAgaWYgKGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChtYXApKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyA9IG1hcDtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlSZXNwb25zaWJpbGl0eUNhdGVnb3J5V2lkZ2V0RmlsdGVycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxyXG4gICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcclxuICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdSSVNLJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbkZyb21EYXRlUGlja2VyKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMudG9EYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XHJcbiAgICB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPSAnRlJPTV9EQVRFJztcclxuICAgIHRoaXMuZnJvbURhdGVQaWNrZXI/LmFwaT8ub3BlbigpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyT3ZlcmxheSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvcGVuVG9EYXRlUGlja2VyKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZnJvbURhdGVQaWNrZXI/LmFwaT8uY2xvc2UoKTtcclxuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICdUT19EQVRFJztcclxuICAgIHRoaXMudG9EYXRlUGlja2VyPy5hcGk/Lm9wZW4oKTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VGcm9tRGF0ZVBpY2tlcigpIHtcclxuICAgIHRoaXMuZnJvbURhdGVQaWNrZXI/LmFwaT8uY2xvc2UoKTtcclxuICAgIGlmICghdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJvbURhdGUpIHtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmhpZGVUb0RhdGUgPSB0cnVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmhpZGVUb0RhdGUgPSBmYWxzZTtcclxuICAgICAgfSwgMjApO1xyXG4gICAgICB0aGlzLmZyb21EYXRlUGlja2VyLmFwaS5jbG9zZSgpO1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgbWluVG9EYXRlID0gdGhpcy5zZXRUb0RhdGUodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJvbURhdGUpO1xyXG4gICAgdGhpcy50b0RhdGVQaWNrZXJDb25maWcgPSB7IC4uLnRoaXMuZGF0ZVBpY2tlckJhc2VDb25maWcsIG1pbjogbWluVG9EYXRlIH07XHJcblxyXG4gICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShtaW5Ub0RhdGUuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignLScpKTtcclxuICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZSk7XHJcbiAgICBjb25zdCBpblZhbGlkRGF0ZSA9IGZyb21EYXRlID49IHRvRGF0ZSA/IHRydWUgOiBmYWxzZTtcclxuICAgIGlmIChpblZhbGlkRGF0ZSkge1xyXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRUb0RhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuaGlkZVRvRGF0ZSA9IHRydWU7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaGlkZVRvRGF0ZSA9IGZhbHNlO1xyXG4gICAgICB9LCAyMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRlUGlja2VyT3ZlcmxheSA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcGVuZWREYXRlUGlja2VyID0gJyc7XHJcbiAgfVxyXG5cclxuICBjbG9zZVRvRGF0ZVBpY2tlcigpIHtcclxuICAgIHRoaXMudG9EYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XHJcbiAgICB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPSAnJztcclxuICB9XHJcblxyXG4gIGFuaW1hdGVJbWFnZSgpIHtcclxuICAgIGNvbnN0IGNpcmNsZUltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW1hZ2UnKTtcclxuICB9XHJcblxyXG4gIHNhdmVGcmVxdWVuY3koZXZlbnRWYWx1ZXM6IGFueSkge1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJlcXVlbmN5VHlwZSA9IGV2ZW50VmFsdWVzLmZyZXF1ZW5jeVR5cGU7XHJcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcmVxdWVuY2llcyA9IGV2ZW50VmFsdWVzLmZyZXF1ZW5jaWVzO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2UgPSBldmVudFZhbHVlcy5mcmVxdWVuY3lTdHJpbmc7XHJcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uZnJlcXVlbmN5RGF0ZSA9IGV2ZW50VmFsdWVzLnNlbGVjdGVkRGF0ZTtcclxuICAgIHRoaXMuYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudERhdGUoKSB7XHJcbiAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgcmV0dXJuIGRheWpzKHRvZGF5KS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcclxuICB9XHJcblxyXG4gIHNldFRvRGF0ZShkYXRhOiBzdHJpbmcpIHtcclxuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKGRhdGEpO1xyXG4gICAgcmV0dXJuIGRheWpzKHRvZGF5KS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcclxuICB9XHJcblxyXG4gIGdldEZyb21EYXRlKGRhdGE6IHN0cmluZykge1xyXG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoZGF0YSk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0b2RheS5nZXREYXRlKCkgKyAnLScgKyAodG9kYXkuZ2V0TW9udGgoKSArIDEpICsgJy0nICsgdG9kYXkuZ2V0RnVsbFllYXIoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBkYXRhIC0gdGhlIGRhdGUgeW91IHdhbnQgdG8gZm9ybWF0XHJcbiAgICogQHJldHVybnMgRGF0ZSBzdHJpbmcgaW4gWVlZWS1NTS1ERCBmb3JtYXQsIGUuZy4gMjAyNi0wNS0xOVxyXG4gICAqL1xyXG4gIGdldERhdGVGb3JtYXRlKGRhdGE6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGRheWpzKGRhdGEpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gIH1cclxuXHJcblxyXG4gIGNvbmZpZ3VyZURhc2hib2FyZCgpIHtcclxuICAgIGxldCBmaWVsZHNTdGF0dXMgPSB0aGlzLnZhbGlkYXRlRGFzaGJvYXJkKCk7XHJcbiAgICBpZiAoIWZpZWxkc1N0YXR1cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5vblN1Ym1pdERhc2hib2FyZCgpO1xyXG4gIFxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdXNlcnMgbGlzdCBieSBtYWtpbmcgYXBpIGNhbGwgYW5kIHByZSBzZWxlY3RzIGFsbCBhZG1pbnMgYnkgYWRkaW5nIHRvIHZpZXdlcnNcclxuICAgKiBAcGFyYW0gdXJsIGNvbnRhaW5zIHF1ZXJ5IHBhcmFtcyBmb3Igb3JnYW5pemF0aW9uIHVzZXJzIGFwaVxyXG4gICAqL1xyXG4gIGdldFVzZXJzTGlzdCh1cmw6IGFueSkge1xyXG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldEFsbFVzZXJzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJzTGlzdCA9IHJlcztcclxuICAgICAgdGhpcy51c2VyTGlzdExvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcpIHtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy5zZXRMaXN0KFxyXG4gICAgICAgICAgdGhpcy51c2Vyc0xpc3QsXHJcbiAgICAgICAgICBbdGhpcy5jcmVhdGVkQnldLFxyXG4gICAgICAgICAgJ21lbWJlcl9pZCdcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubGlzdERldGFpbHMuc2VsZWN0ZWRVc2Vyc0xpc3QgPSB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzO1xyXG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwTGlzdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRBbGxHcm91cHMoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMudG90YWxncm91cHMgPSByZXMudG90YWxfaXRlbXM7XHJcbiAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgIHRoaXMuZ3JvdXBMaXN0TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAgPSB0aGlzLnNldExpc3QoXHJcbiAgICAgICAgICB0aGlzLmdyb3VwTGlzdCxcclxuICAgICAgICAgIFt0aGlzLmNyZWF0ZWRCeV0sXHJcbiAgICAgICAgICAnZ3JvdXBfaWQnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmxpc3REZXRhaWxzLnNlbGVjdGVkR3JvdXBMaXN0ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXA7XHJcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEl0IGlzIHRvIGVuc3VyZSB3aGV0aGVyIGFsbCByZXF1aXJlZCBsaXN0cyBvbiBQb2xpY3kgZnJvbSBpcyBsb2FkZWQgZnJvbSB0aGUgYXBpIGNhbGwgb3Igbm90XHJcbiAgICovXHJcbiAgY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKSB7XHJcbiAgICAvLyBDYXRlZ29yeSB0cmVlcyBhcmUgbm8gbG9uZ2VyIGVhZ2VybHkgbG9hZGVkIGhlcmU7IHRoZXNlIGZsYWdzIHdlcmUgbmV2ZXIgZmxpcHBlZCBhbmQgYmxvY2tlZCBFRElUIGluZGVmaW5pdGVseS5cclxuICAgIGlmICh0aGlzLnJjTGlzdExvYWRlZCAmJiB0aGlzLnVzZXJMaXN0TG9hZGVkICYmIHRoaXMuZ3JvdXBMaXN0TG9hZGVkKSB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xyXG4gICAgICAgIHRoaXMuaHlkcmF0ZUVkaXRGb3JtKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKTtcclxuICAgICAgfSwgMzAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFNlbGVjdGVkV2lkZ2V0cyhkYXRhOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdDUkVBVEUnKSB7XHJcbiAgICAgIGNvbnN0IHdpZGdldHNBcnJheTogYW55ID0gW107XHJcbiAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgb2JqLm1vZHVsZV9uYW1lID0gZWxlbWVudC5tb2R1bGU7XHJcbiAgICAgICAgb2JqLndpZGdldF9uYW1lID0gZWxlbWVudC50aXRsZTtcclxuICAgICAgICBvYmoud2lkZ2V0X2NvZGUgPSBlbGVtZW50LmlkO1xyXG4gICAgICAgIG9iai5zdWJfd2lkZ2V0cyA9IFtdO1xyXG4gICAgICAgIG9iai5zdGF0ZSA9ICdBQ1RJVkUnO1xyXG4gICAgICAgIGlmIChlbGVtZW50LnN1YldpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZWxlbWVudC5zdWJXaWRnZXRzLmZvckVhY2goKHN1YldpZGdldDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdWJXaWRnZXRPYmplY3Q6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X25hbWUgPSBzdWJXaWRnZXQudGl0bGU7XHJcbiAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC53aWRnZXRfY29kZSA9IHN1YldpZGdldC5pZDtcclxuICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LnN0YXRlID0gc3ViV2lkZ2V0LnZhbHVlID8gJ0FDVElWRScgOiAnSU5BQ1RJVkUnO1xyXG4gICAgICAgICAgICBvYmouc3ViX3dpZGdldHMucHVzaChPYmplY3QuYXNzaWduKHN1YldpZGdldE9iamVjdCkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdpZGdldHNBcnJheS5wdXNoKG9iaik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldCA9IHdpZGdldHNBcnJheTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnRURJVCcpIHtcclxuICAgICAgY29uc3Qgd2lkZ2V0c0FycmF5OiBhbnkgPSBbXTtcclxuXHJcbiAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgIXRoaXMuZXh0cmFjdFdpZGdldENvZGVzKHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQpLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICBlbGVtZW50LmlkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgIG9iai5tb2R1bGVfbmFtZSA9IGVsZW1lbnQubW9kdWxlO1xyXG4gICAgICAgICAgb2JqLl9pZCA9ICcnO1xyXG4gICAgICAgICAgb2JqLndpZGdldF9uYW1lID0gZWxlbWVudC50aXRsZTtcclxuICAgICAgICAgIG9iai53aWRnZXRfY29kZSA9IGVsZW1lbnQuaWQ7XHJcbiAgICAgICAgICBvYmouc3ViX3dpZGdldHMgPSBbXTtcclxuICAgICAgICAgIG9iai5zdGF0ZSA9ICdBQ1RJVkUnO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuc3ViV2lkZ2V0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuc3ViV2lkZ2V0cy5mb3JFYWNoKChzdWJXaWRnZXQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJXaWRnZXRPYmplY3Q6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC5faWQgPSAnJztcclxuICAgICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X25hbWUgPSBzdWJXaWRnZXQudGl0bGU7XHJcbiAgICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LndpZGdldF9jb2RlID0gc3ViV2lkZ2V0LmlkO1xyXG4gICAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC5zdGF0ZSA9IHN1YldpZGdldC52YWx1ZSA/ICdBQ1RJVkUnIDogJ0lOQUNUSVZFJztcclxuICAgICAgICAgICAgICBvYmouc3ViX3dpZGdldHMucHVzaChzdWJXaWRnZXRPYmplY3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQucHVzaChvYmopO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKGVsZTogYW55KSA9PiBlbGUud2lkZ2V0X2NvZGUgPT0gZWxlbWVudC5pZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0c1tpbmRleF0uc3RhdGUgPSAnQUNUSVZFJztcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRXaWRnZXRzW2luZGV4XS5zdWJfd2lkZ2V0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHNbaW5kZXhdLnN1Yl93aWRnZXRzLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAoc3ViV2lkZ2V0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IGVsZW1lbnQuc3ViV2lkZ2V0cy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICAgKGVsZTogYW55KSA9PiBlbGUuaWQgPT0gc3ViV2lkZ2V0RGF0YS53aWRnZXRfY29kZVxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViV2lkZ2V0RGF0YS5zdGF0ZSA9IGVsZW1lbnQuc3ViV2lkZ2V0c1tlbGVtZW50SW5kZXhdLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICA/ICdBQ1RJVkUnXHJcbiAgICAgICAgICAgICAgICAgICAgICA6ICdJTkFDVElWRSc7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldC5mb3JFYWNoKChzYXZlZFdpZGdldDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLmZpbmRJbmRleChcclxuICAgICAgICAgIChkYXRhRWxlbWVudDogYW55KSA9PiBkYXRhRWxlbWVudC5pZCA9PSBzYXZlZFdpZGdldC53aWRnZXRfY29kZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgICBzYXZlZFdpZGdldC5zdGF0ZSA9ICdJTkFDVElWRSc7XHJcbiAgICAgICAgICBpZiAoc2F2ZWRXaWRnZXQuc3ViX3dpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzYXZlZFdpZGdldC5zdWJfd2lkZ2V0cy5mb3JFYWNoKChzYXZlU3ViV2lkZ2V0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBzYXZlU3ViV2lkZ2V0LnN0YXRlID0gJ0lOQUNUSVZFJztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gZGF0YTtcclxuICAgIHRoaXMub3BlbkNvbmZpZ3VyZVdpZGdldHMgPSBmYWxzZTtcclxuICAgIHRoaXMuc3VibWl0RGFzaGJvYXJkKCk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0V2lkZ2V0Q29kZXMod2lkZ2V0czogYW55W10pIHtcclxuICAgIGNvbnN0IHdpZGdldENvZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHdpZGdldHM/LmZvckVhY2goKHdpZGdldDogYW55KSA9PiB7XHJcbiAgICAgIGlmICh3aWRnZXQ/LndpZGdldF9jb2RlKSB7XHJcbiAgICAgICAgd2lkZ2V0Q29kZXMucHVzaCh3aWRnZXQ/LndpZGdldF9jb2RlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHdpZGdldENvZGVzO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VDb25maWd1cmVXaWRnZXRzKGV2ZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm9wZW5Db25maWd1cmVXaWRnZXRzID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgbGlzdCB1c2VyJ3MgbGlzdCBiYXNlZCBvbiBwYWdpbmF0aW9uIGJ5IG1ha2luZyBhcGkgY2FsbFxyXG4gICAqIEBwYXJhbSBldmVudCBzcGVjaWZpZXMgYSBib29sZWFuIHZhbHVlIHRvIGNhbGwgYXBpXHJcbiAgICovXHJcbiAgcGFnaW5hdGlvbkZpbHRlcihldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgdGhpcy5nZXRVc2Vyc0xpc3Qoe1xyXG4gICAgICAgIHA6XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmN1cnJlbnRQYWdlID09PSAxXHJcbiAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmN1cnJlbnRQYWdlLFxyXG4gICAgICAgIHR5cGU6ICdhbGxfZXhjZXB0X2V4ZWN1dGl2ZScsXHJcbiAgICAgICAgcTogIXRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2VhcmNoVmFsdWVcclxuICAgICAgICAgID8gJydcclxuICAgICAgICAgIDogdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zZWFyY2hWYWx1ZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSQ0xpc3QoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuZ2V0UmVzcG9uc2liaWxpdHlDZW50ZXJMaXN0KCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QgPSB0aGlzLm5vcm1hbGl6ZVJjTGlzdChyZXMpO1xyXG4gICAgICAgIHRoaXMucmNMaXN0TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1Jlc3BvbnNpYmlsaXR5Q2VudGVycygpO1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xyXG4gICAgICAgICAgY29uc3QgaWRzID0gdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0LmZpbHRlcigocmM6IGFueSkgPT4gdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5yZXNwb25zaWJpbGl0eUNlbnRlcnMuaW5jbHVkZXMocmMucmNpZCkpLm1hcCgocmM6IGFueSkgPT4gcmMuaXRlbV9pZCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVTZWxlY3RlZExpc3QoJ3JjJywgaWRzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB0aGlzLnJjTGlzdExvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hcHBseVBlbmRpbmdSZXNwb25zaWJpbGl0eUNlbnRlcnMoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogIyMjIyBEZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGFycmF5IG9mIG9iamVjdCBiYXNlZCBvbiB1bmlxdWUga2V5XHJcbiAgICogQHBhcmFtIGFycmF5XHJcbiAgICogQHBhcmFtIGtleVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgdW5pcXVlQnlQcm9wKGFycmF5OiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcclxuICAgICAgYXJyYXlcclxuICAgICAgICAucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYzogYW55LCBpdGVtOiBhbnkpID0+IChcclxuICAgICAgICAgICAgaXRlbSAmJiBpdGVtW2tleV0gJiYgYWNjLnNldChpdGVtW2tleV0sIGl0ZW0pLCBhY2NcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBuZXcgTWFwKClcclxuICAgICAgICApXHJcbiAgICAgICAgLnZhbHVlcygpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlbGVjdGVkTGlzdCh0eXBlOiBzdHJpbmcsIHNlbGVjdGVkSXRlbXM6IGFueSkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3JjJzpcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMgPSB0aGlzLnNldExpc3QoXHJcbiAgICAgICAgICB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QsXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zLFxyXG4gICAgICAgICAgJ2l0ZW1faWQnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ1JJU0snXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd3aG9DYW5WaWV3JzpcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy51bmlxdWVCeVByb3AoXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zPy51c2VycyxcclxuICAgICAgICAgICdtZW1iZXJfaWQnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmxpc3REZXRhaWxzLnNlbGVjdGVkVXNlcnNMaXN0ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2VycztcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cCA9IHRoaXMudW5pcXVlQnlQcm9wKFxyXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz8uZ3JvdXBzLFxyXG4gICAgICAgICAgJ2dyb3VwX2lkJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZEdyb3VwTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnOlxyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9XHJcbiAgICAgICAgICBub3JtYWxpemVQcm9ncmFtQ2F0ZWdvcmllcyhcclxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzZWxlY3RlZEl0ZW1zKVxyXG4gICAgICAgICAgICAgID8gc2VsZWN0ZWRJdGVtc1xyXG4gICAgICAgICAgICAgIDogZmxhdHRlblByb2dyYW1TZWxlY3Rpb25NYXAoc2VsZWN0ZWRJdGVtcyA/PyB7fSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5hcHBseVJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnlXaWRnZXRGaWx0ZXJzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Jpc2tDYXRlZ29yeSc6XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMgPSBzZWxlY3RlZEl0ZW1zO1xyXG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnQ09NUExJQU5DRSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZSh0eXBlOiBhbnksIGV2ZW50OiBhbnksIHJlbW92ZUluZGV4PzogYW55KSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAncmMnOlxyXG4gICAgICAgIGNvbnN0IHJjSW5kZXggPVxyXG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKHJjOiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgcmMucmNfaWQgPT0gZXZlbnQucmNfaWQgfHxcclxuICAgICAgICAgICAgICByYy5pdGVtX2lkID09IGV2ZW50Lml0ZW1faWQgfHxcclxuICAgICAgICAgICAgICByYy5yY2lkID09IGV2ZW50LnJjaWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgaWYgKHJjSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnRSYzogYW55ID1cclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzW3JjSW5kZXhdO1xyXG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLnNwbGljZShyY0luZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBpZiAocGFyZW50UmM/Lml0ZW1fY2hpbGRfaWRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmVudFJjLml0ZW1fY2hpbGRfaWRzLmZvckVhY2goKGNoaWxkRWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRSZW1vdmVJbmRleCA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlRWxlbWVudDogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQucmNfaWQgPT0gY2hpbGRFbGVtZW50IHx8XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudC5pdGVtX2lkID09IGNoaWxkRWxlbWVudCB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQucmNpZCA9PSBjaGlsZEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgaWYgKGNoaWxkUmVtb3ZlSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMuc3BsaWNlKFxyXG4gICAgICAgICAgICAgICAgICBjaGlsZFJlbW92ZUluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnQ09NUExJQU5DRSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICd3aG9DYW5WaWV3JzpcclxuICAgICAgICBjb25zdCByZXZpZXdlckluZGV4ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2Vycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAodmlld2VyOiBhbnkpID0+IHZpZXdlci5tZW1iZXJfaWQgPT0gZXZlbnQubWVtYmVyX2lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzLnNwbGljZShyZXZpZXdlckluZGV4LCAxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnd2hvQ2FuVmlld0dyb3VwJzpcclxuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZT8uZ3JvdXBfaWQgPT0gZXZlbnQ/Lmdyb3VwX2lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cC5zcGxpY2UoZ3JvdXBzLCAxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJzpcclxuICAgICAgICB0aGlzLmNoZWNrRGVmYXVsdFByb2dyYW1PblJlbW92ZShldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdyaXNrQ2F0ZWdvcnknOlxyXG4gICAgICAgIGNvbnN0IHJpc2tDYXRlZ29yeUluZGV4ID1cclxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKHJpc2tDYXRlZ29yeTogYW55KSA9PiByaXNrQ2F0ZWdvcnkuY2F0ZWdvcnlfaWQgPT0gZXZlbnQuY2F0ZWdvcnlfaWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgaWYgKHJpc2tDYXRlZ29yeUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyZW50OiBhbnkgPVxyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllc1tyaXNrQ2F0ZWdvcnlJbmRleF07XHJcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5zcGxpY2UoXHJcbiAgICAgICAgICAgIHJpc2tDYXRlZ29yeUluZGV4LFxyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHBhcmVudD8uY2hpbGRfY2F0X2lkcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRfY2F0X2lkcy5mb3JFYWNoKChjaGlsZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID1cclxuICAgICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgKHJlbW92ZUVsZW1lbnQ6IGFueSkgPT5cclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50LmNhdGVnb3J5X2lkID09IGNoaWxkRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMuc3BsaWNlKHJpc2tDYXRlZ29yeUluZGV4LCAxKTtcclxuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ1JJU0snXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TGlzdChsaXN0OiBhbnlbXSwgaWRzOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnNldExpc3RCeUlkcyhsaXN0LCBpZHMsIFtrZXldKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TGlzdEJ5SWRzKGxpc3Q6IGFueVtdLCBpZHM6IGFueVtdLCBrZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgY29uc3QgZGF0YTogYW55W10gPSBbXTtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSB8fCAhQXJyYXkuaXNBcnJheShpZHMpKSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlkcy5mb3JFYWNoKChpZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldElkID1pZDtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAobGlzdEVsZW1lbnQ6IGFueSkgPT5cclxuICAgICAgICAgICAgbGlzdEVsZW1lbnQ/LltrZXldID09PSB0YXJnZXRJZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHJcbiAgICAgICAgICBkYXRhLnB1c2gobGlzdFtpbmRleF0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmbGF0dGVuUmNUcmVlKG5vZGVzOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmbGF0OiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgd2FsayA9IChhcnI6IGFueVtdKSA9PiB7XHJcbiAgICAgIChhcnIgPz8gW10pLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZsYXQucHVzaChub2RlKTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSkge1xyXG4gICAgICAgICAgd2Fsayhub2RlLmNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5pdGVtcykpIHtcclxuICAgICAgICAgIHdhbGsobm9kZS5pdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZXMpKSB7XHJcbiAgICAgIHdhbGsobm9kZXMpO1xyXG4gICAgICByZXR1cm4gZmxhdC5sZW5ndGggPyBmbGF0IDogbm9kZXM7XHJcbiAgICB9XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2Rlcz8uZGF0YSkpIHtcclxuICAgICAgd2Fsayhub2Rlcy5kYXRhKTtcclxuICAgICAgcmV0dXJuIGZsYXQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJjTm9kZUlkKHJjOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIHJjPy5pdGVtX2lkID8/IHJjPy5yY19pZCA/PyByYz8ucmNpZCA/PyByYz8uaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbGxlY3ROZXN0ZWRDaGlsZElkcyhub2RlOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBjb25zdCBpZHM6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBjb25zdCB3YWxrID0gKG46IGFueSkgPT4ge1xyXG4gICAgICBbLi4uKG4/LmNoaWxkcmVuID8/IFtdKSwgLi4uKG4/Lml0ZW1zID8/IFtdKV0uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghY2hpbGQgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0UmNOb2RlSWQoY2hpbGQpO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhpZCk7XHJcbiAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQgIT09ICcnICYmICFzZWVuLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgICAgaWRzLnB1c2goaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3YWxrKGNoaWxkKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgd2Fsayhub2RlKTtcclxuICAgIHJldHVybiBpZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTmVzdGVkUmMocGFyZW50OiBhbnksIGNhbmRpZGF0ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudD8uaXRlbV9pZDtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZUlkID0gY2FuZGlkYXRlPy5pdGVtX2lkO1xyXG4gICAgaWYgKHBhcmVudElkID09IG51bGwgfHwgY2FuZGlkYXRlSWQgPT0gbnVsbCB8fCBwYXJlbnRJZCA9PSBjYW5kaWRhdGVJZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBbXHJcbiAgICAgIC4uLihjYW5kaWRhdGU/LnBhcmVudF9yY19pZHMgPz8gW10pLFxyXG4gICAgICBjYW5kaWRhdGU/LnBhcmVudElkLFxyXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShjYW5kaWRhdGU/LnBhcmVudCkgfHwgY2FuZGlkYXRlPy5wYXJlbnQgPT0gbnVsbFxyXG4gICAgICAgID8gW11cclxuICAgICAgICA6IFtjYW5kaWRhdGUucGFyZW50XSksXHJcbiAgICBdO1xyXG4gICAgaWYgKGFuY2VzdG9ySWRzLnNvbWUoKGlkKSA9PiBpZCA9PSBwYXJlbnRJZCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IEFycmF5LmlzQXJyYXkocGFyZW50Py5yY19uYW1lKSA/IHBhcmVudC5yY19uYW1lIDogW107XHJcbiAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gQXJyYXkuaXNBcnJheShjYW5kaWRhdGU/LnJjX25hbWUpXHJcbiAgICAgID8gY2FuZGlkYXRlLnJjX25hbWVcclxuICAgICAgOiBbXTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHBhcmVudFBhdGgubGVuZ3RoID4gMCAmJlxyXG4gICAgICBjYW5kaWRhdGVQYXRoLmxlbmd0aCA+IHBhcmVudFBhdGgubGVuZ3RoICYmXHJcbiAgICAgIHBhcmVudFBhdGguZXZlcnkoKG5hbWU6IGFueSwgaTogbnVtYmVyKSA9PiBjYW5kaWRhdGVQYXRoW2ldID09PSBuYW1lKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZUFsbERlc2NlbmRhbnRJZHMocGFyZW50OiBhbnksIGxpc3Q6IGFueVtdKTogYW55W10ge1xyXG4gICAgY29uc3QgcGFyZW50SWQgPSBwYXJlbnQ/Lml0ZW1faWQ7XHJcbiAgICBjb25zdCByYXdJZHMgPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIGNvbnN0IGFkZCA9IChpZDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkICE9PSAnJyAmJiBpZCAhPSBwYXJlbnRJZCkge1xyXG4gICAgICAgIHJhd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIChwYXJlbnQ/Lml0ZW1fY2hpbGRfaWRzID8/IFtdKS5mb3JFYWNoKGFkZCk7XHJcbiAgICB0aGlzLmNvbGxlY3ROZXN0ZWRDaGlsZElkcyhwYXJlbnQpLmZvckVhY2goYWRkKTtcclxuICAgIChsaXN0ID8/IFtdKS5mb3JFYWNoKChyYzogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkUmMocGFyZW50LCByYykpIHtcclxuICAgICAgICBhZGQocmMuaXRlbV9pZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgcmF3SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGNoID0gKGxpc3QgPz8gW10pLmZpbmQoXHJcbiAgICAgICAgKHJjOiBhbnkpID0+XHJcbiAgICAgICAgICByYz8uaXRlbV9pZCA9PSBpZCB8fFxyXG4gICAgICAgICAgcmM/LnJjX2lkID09IGlkIHx8XHJcbiAgICAgICAgICByYz8ucmNpZCA9PSBpZCB8fFxyXG4gICAgICAgICAgcmM/LmlkID09IGlkXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSBtYXRjaD8uaXRlbV9pZCA/PyBpZDtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHJlc29sdmVkSWQpO1xyXG4gICAgICBpZiAoIXNlZW4uaGFzKGtleSkgJiYgcmVzb2x2ZWRJZCAhPSBwYXJlbnRJZCkge1xyXG4gICAgICAgIHNlZW4uYWRkKGtleSk7XHJcbiAgICAgICAgcmVzb2x2ZWQucHVzaChyZXNvbHZlZElkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vcm1hbGl6ZVJjTGlzdChsaXN0OiBhbnkpOiBhbnlbXSB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZmxhdHRlblJjVHJlZShsaXN0KTtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBpdGVtcy5tYXAoKHJjOiBhbnkpID0+ICh7XHJcbiAgICAgIC4uLnJjLFxyXG4gICAgICByY2lkOiByYz8ucmNpZCA/PyByYz8ucmNfaWQgPz8gcmM/Lml0ZW1faWQgPz8gcmM/LmlkLFxyXG4gICAgICBpdGVtX2lkOiByYz8uaXRlbV9pZCA/PyByYz8ucmNfaWQgPz8gcmM/LnJjaWQgPz8gcmM/LmlkLFxyXG4gICAgICBpdGVtX25hbWU6XHJcbiAgICAgICAgcmM/Lml0ZW1fbmFtZSA/P1xyXG4gICAgICAgIHJjPy5pdGVtX25hbWVfc3RyaW5nID8/XHJcbiAgICAgICAgKEFycmF5LmlzQXJyYXkocmM/LnJjX25hbWUpID8gcmMucmNfbmFtZS5qb2luKCcgPCAnKSA6IHJjPy5yY19uYW1lKSA/P1xyXG4gICAgICAgICcnLFxyXG4gICAgfSkpO1xyXG5cclxuICAgIHJldHVybiBub3JtYWxpemVkLm1hcCgocmM6IGFueSkgPT4gKHtcclxuICAgICAgLi4ucmMsXHJcbiAgICAgIGl0ZW1fY2hpbGRfaWRzOiB0aGlzLnJlc29sdmVBbGxEZXNjZW5kYW50SWRzKHJjLCBub3JtYWxpemVkKSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZVJjRnJvbVRyZWUodHJlZTogYW55W10sIGlkczogbnVtYmVyW10pOiBhbnlbXSB7XHJcbiAgICBpZiAoIWlkcy5sZW5ndGggfHwgIXRyZWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG5cclxuICAgIGlkcy5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXRJZCA9IE51bWJlcihpZCk7XHJcbiAgICAgIGNvbnN0IG1hdGNoID0gdHJlZS5maW5kKFxyXG4gICAgICAgIChyYykgPT5cclxuICAgICAgICAgIE51bWJlcihyYz8uaXRlbV9pZCkgPT09IHRhcmdldElkIHx8XHJcbiAgICAgICAgICBOdW1iZXIocmM/LnJjX2lkKSA9PT0gdGFyZ2V0SWQgfHxcclxuICAgICAgICAgIE51bWJlcihyYz8ucmNpZCkgPT09IHRhcmdldElkIHx8XHJcbiAgICAgICAgICBOdW1iZXIocmM/LmlkKSA9PT0gdGFyZ2V0SWQgfHxcclxuICAgICAgICAgIHJjPy5pdGVtX2NoaWxkX2lkcz8uc29tZSgoY2hpbGRJZDogYW55KSA9PiBOdW1iZXIoY2hpbGRJZCkgPT09IHRhcmdldElkKSB8fFxyXG4gICAgICAgICAgcmM/Lml0ZW1fcGFyZW50X2lkcz8uc29tZSgocGFyZW50SWQ6IGFueSkgPT4gTnVtYmVyKHBhcmVudElkKSA9PT0gdGFyZ2V0SWQpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qga2V5ID0gTnVtYmVyKG1hdGNoPy5pdGVtX2lkID8/IG1hdGNoPy5yY19pZCA/PyBtYXRjaD8ucmNpZCA/PyBpZCk7XHJcbiAgICAgIGlmICghc2Vlbi5oYXMoa2V5KSkge1xyXG4gICAgICAgIHNlZW4uYWRkKGtleSk7XHJcbiAgICAgICAgc2VsZWN0ZWQucHVzaChtYXRjaCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseVByZXJlc29sdmVkUmNFbnRyaWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnBlbmRpbmdFZGl0UmNFbnRyaWVzPy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHJlZSA9IHRoaXMucmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdCA/PyBbXTtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5wZW5kaW5nRWRpdFJjRW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJjaWQgPSBOdW1iZXIoZW50cnk/LnJjaWQgPz8gZW50cnk/LnJjX2lkID8/IGVudHJ5Py5pdGVtX2lkKTtcclxuICAgICAgY29uc3QgZnJvbVRyZWUgPVxyXG4gICAgICAgIHRyZWUuZmluZCgocmMpID0+IE51bWJlcihyYz8uaXRlbV9pZCkgPT09IHJjaWQpID8/XHJcbiAgICAgICAgdHJlZS5maW5kKChyYykgPT4gTnVtYmVyKHJjPy5yY2lkKSA9PT0gcmNpZCkgPz9cclxuICAgICAgICB0cmVlLmZpbmQoKHJjKSA9PiBOdW1iZXIocmM/LnJjX2lkKSA9PT0gcmNpZCk7XHJcbiAgICAgIHJldHVybiBmcm9tVHJlZSA/IHsgLi4uZnJvbVRyZWUgfSA6IHsgLi4uZW50cnkgfTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzID0gc2VsZWN0ZWQ7XHJcbiAgICB0aGlzLnBlbmRpbmdFZGl0UmNJZHMgPSBzZWxlY3RlZC5tYXAoKHJjKSA9PlxyXG4gICAgICBOdW1iZXIocmM/LnJjaWQgPz8gcmM/LnJjX2lkID8/IHJjPy5pdGVtX2lkKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseVBlbmRpbmdSZXNwb25zaWJpbGl0eUNlbnRlcnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcHBseVByZXJlc29sdmVkUmNFbnRyaWVzKCkpIHtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucmNMaXN0TG9hZGVkIHx8ICF0aGlzLnBlbmRpbmdFZGl0UmNJZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxyXG4gICAgICB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QsXHJcbiAgICAgIHRoaXMucGVuZGluZ0VkaXRSY0lkcyxcclxuICAgICAgWydpdGVtX2lkJywgJ3JjaWQnLCAncmNfaWQnLCAnaWQnXVxyXG4gICAgKTtcclxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPCB0aGlzLnBlbmRpbmdFZGl0UmNJZHMubGVuZ3RoKSB7XHJcbiAgICAgIHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUmNGcm9tVHJlZShcclxuICAgICAgICB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QsXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRWRpdFJjSWRzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMgPSBzZWxlY3RlZDtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5FZGl0SHlkcmF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ0VESVQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50Kys7XHJcbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5pc2hFZGl0SHlkcmF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ0VESVQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgLSAxKTtcclxuICAgIGlmICh0aGlzLmVkaXRIeWRyYXRpb25Db3VudCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlDb21wbGV0ZUVkaXRIeWRyYXRpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcgJiYgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgPT09IDApIHtcclxuICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JhcEVkaXRSZXF1ZXN0PFQ+KFxyXG4gICAgcmVxdWVzdCQ6IE9ic2VydmFibGU8VD4sXHJcbiAgICBvbk5leHQ6ICh2YWx1ZTogVCkgPT4gdm9pZFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XHJcbiAgICAgIHRoaXMuYmVnaW5FZGl0SHlkcmF0aW9uKCk7XHJcbiAgICB9XHJcbiAgICByZXF1ZXN0JFxyXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmZpbmlzaEVkaXRIeWRyYXRpb24oKSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IG9uTmV4dCxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpLFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3luY1Byb2dyYW1zRm9yRWRpdChkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghZGF0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmh5ZHJhdGVQcm9ncmFtc0Zyb21EYXNoYm9hcmREYXRhKGRhdGEpO1xyXG4gICAgdGhpcy5hcHBseVByb2dyYW1zRnJvbURhc2hib2FyZElkcyhcclxuICAgICAgZXh0cmFjdFByb2dyYW1JZHNGcm9tRGFzaGJvYXJkKGRhdGEpLFxyXG4gICAgICBleHRyYWN0Q2F0ZWdvcnlJZHNGcm9tRGFzaGJvYXJkKGRhdGEpLFxyXG4gICAgICBnZXRTZWxlY3RlZFByb2dyYW1zTWFwKGRhdGEpLFxyXG4gICAgICBkYXRhPy5wcm9ncmFtXHJcbiAgICApO1xyXG4gICAgY29uc3QgY2F0ZWdvcnlJZHMgPSBleHRyYWN0Q2F0ZWdvcnlJZHNGcm9tRGFzaGJvYXJkKGRhdGEpO1xyXG4gICAgaWYgKGNhdGVnb3J5SWRzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmcm9tQ29tcGxpYW5jZSA9IHRoaXMuc2V0TGlzdChcclxuICAgICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzLFxyXG4gICAgICAgIGNhdGVnb3J5SWRzLFxyXG4gICAgICAgICdjYXRlZ29yeV9pZCdcclxuICAgICAgKTtcclxuICAgICAgaWYgKGZyb21Db21wbGlhbmNlLmxlbmd0aCAmJiAhdGhpcy5hbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmFwcGx5RmxhdFByb2dyYW1DYXRlZ29yaWVzKGZyb21Db21wbGlhbmNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5hbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGggJiZcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSBbXHJcbiAgICAgICAgLi4udGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLFxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zeW5jUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21Gb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5UHJvZ3JhbXNGcm9tRGFzaGJvYXJkSWRzKFxyXG4gICAgcHJvZ3JhbUlkczogbnVtYmVyW10sXHJcbiAgICBjYXRlZ29yeUlkczogbnVtYmVyW10sXHJcbiAgICBzZWxlY3RlZFByb2dyYW1zTWFwPzogUmVjb3JkPHN0cmluZywgYW55W10+LFxyXG4gICAgcHJvZ3JhbVBheWxvYWQ/OiB7IGFsbF9wcm9ncmFtcz86IGFueVtdOyBzZWxlY3RlZF9wcm9ncmFtcz86IGFueSB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubG9hZFByb2dyYW1zRm9yRWRpdChcclxuICAgICAgICBwcm9ncmFtSWRzLFxyXG4gICAgICAgIGNhdGVnb3J5SWRzLFxyXG4gICAgICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXAsXHJcbiAgICAgICAgcHJvZ3JhbVBheWxvYWRcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2dyYW1JZHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucmVzb2x2ZVByb2dyYW1JZHNGb3JFZGl0KHByb2dyYW1JZHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVQcm9ncmFtU2VsZWN0aW9uTWFwRm9yTGlzdCgpOiB2b2lkIHtcclxuICAgIGlmIChoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAodGhpcy5zZWxlY3RlZFByb2dyYW1zKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjYXRlZ29yeUlkcyA9IG5vcm1hbGl6ZUlkQXJyYXkoXHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcz8ubWFwKFxyXG4gICAgICAgIChjOiBhbnkpID0+IGM/LmNhdGVnb3J5X2lkID8/IGM/LmlkXHJcbiAgICAgICkgPz8gW11cclxuICAgICk7XHJcbiAgICBjb25zdCBwcm9ncmFtSWRzID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPz8gW10pLm1hcChcclxuICAgICAgICAgIChjOiBhbnkpID0+IE51bWJlcihjPy5wcm9ncmFtSWQgPz8gYz8ucHJvZ3JhbV9pZCA/PyBjPy5wYXJlbnRJZClcclxuICAgICAgICApXHJcbiAgICAgICksXHJcbiAgICBdLmZpbHRlcigoaWQpID0+ICFOdW1iZXIuaXNOYU4oaWQpKTtcclxuICAgIGlmIChwcm9ncmFtSWRzLmxlbmd0aCB8fCBjYXRlZ29yeUlkcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5sb2FkUHJvZ3JhbXNGb3JFZGl0KHByb2dyYW1JZHMsIGNhdGVnb3J5SWRzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcDogUmVjb3JkPHN0cmluZywgYW55W10+KTogdm9pZCB7XHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJvZ3JhbVNlbGVjdGlvbk1hcChtYXApO1xyXG4gICAgaWYgKCFub3JtYWxpemVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyA9IG5vcm1hbGl6ZWQ7XHJcbiAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gZmxhdHRlblByb2dyYW1TZWxlY3Rpb25NYXAodGhpcy5zZWxlY3RlZFByb2dyYW1zKTtcclxuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9XHJcbiAgICAgIG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXRlZ29yeU1hdGNoZXNJZChjYXQ6IGFueSwgY2F0ZWdvcnlJZFNldDogU2V0PG51bWJlcj4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkID0gTnVtYmVyKGNhdD8uaWQpO1xyXG4gICAgY29uc3QgY2F0ZWdvcnlJZCA9IE51bWJlcihjYXQ/LmNhdGVnb3J5X2lkKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICghTnVtYmVyLmlzTmFOKGlkKSAmJiBjYXRlZ29yeUlkU2V0LmhhcyhpZCkpIHx8XHJcbiAgICAgICghTnVtYmVyLmlzTmFOKGNhdGVnb3J5SWQpICYmIGNhdGVnb3J5SWRTZXQuaGFzKGNhdGVnb3J5SWQpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFByb2dyYW1zRm9yRWRpdChcclxuICAgIHByb2dyYW1JZHM6IG51bWJlcltdLFxyXG4gICAgY2F0ZWdvcnlJZHM6IG51bWJlcltdID0gW10sXHJcbiAgICBzZWxlY3RlZFByb2dyYW1zTWFwPzogUmVjb3JkPHN0cmluZywgYW55W10+LFxyXG4gICAgcHJvZ3JhbVBheWxvYWQ/OiB7IGFsbF9wcm9ncmFtcz86IGFueVtdOyBzZWxlY3RlZF9wcm9ncmFtcz86IGFueSB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXAgJiZcclxuICAgICAgdHlwZW9mIHNlbGVjdGVkUHJvZ3JhbXNNYXAgPT09ICdvYmplY3QnICYmXHJcbiAgICAgICFBcnJheS5pc0FycmF5KHNlbGVjdGVkUHJvZ3JhbXNNYXApICYmXHJcbiAgICAgIGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChzZWxlY3RlZFByb2dyYW1zTWFwKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKHNlbGVjdGVkUHJvZ3JhbXNNYXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBwcm9ncmFtUGF5bG9hZCAmJlxyXG4gICAgICB0aGlzLmh5ZHJhdGVQcm9ncmFtc0Zyb21EYXNoYm9hcmREYXRhKHsgcHJvZ3JhbTogcHJvZ3JhbVBheWxvYWQgfSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFwcm9ncmFtSWRzLmxlbmd0aCAmJiAhY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wbGV0ZVByb2dyYW1IeWRyYXRpb24gPSAoKSA9PiB0aGlzLmZpbmlzaEVkaXRIeWRyYXRpb24oKTtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xyXG4gICAgICB0aGlzLmJlZ2luRWRpdEh5ZHJhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRTYWlsc1Byb2dyYW1MaXN0KCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbXMgPSBwYXJzZVNhaWxzUHJvZ3JhbUxpc3QocmVzKTtcclxuICAgICAgICBjb25zdCByZWxldmFudFByb2dyYW1zID1cclxuICAgICAgICAgIHByb2dyYW1JZHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHByb2dyYW1zLmZpbHRlcigocDogYW55KSA9PiBwcm9ncmFtSWRzLmluY2x1ZGVzKE51bWJlcihwPy5pZCkpKVxyXG4gICAgICAgICAgICA6IHByb2dyYW1zO1xyXG5cclxuICAgICAgICBpZiAoIWNhdGVnb3J5SWRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHByb2dyYW1JZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVByb2dyYW1JZHNGb3JFZGl0KHByb2dyYW1JZHMsIHByb2dyYW1zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnlJZFNldCA9IG5ldyBTZXQoY2F0ZWdvcnlJZHMpO1xyXG4gICAgICAgIGNvbnN0IHByb2dyYW1zVG9GZXRjaCA9XHJcbiAgICAgICAgICByZWxldmFudFByb2dyYW1zLmxlbmd0aCA+IDAgPyByZWxldmFudFByb2dyYW1zIDogcHJvZ3JhbXM7XHJcblxyXG4gICAgICAgIGlmICghcHJvZ3JhbXNUb0ZldGNoLmxlbmd0aCkge1xyXG4gICAgICAgICAgY29tcGxldGVQcm9ncmFtSHlkcmF0aW9uKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlcXVlc3RzID0gcHJvZ3JhbXNUb0ZldGNoLm1hcCgocHJvZ3JhbTogYW55KSA9PlxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldFByb2dyYW1DYXRlZ29yaWVzKHByb2dyYW0uaWQpLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoY2F0UmVzOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgICAgcHJvZ3JhbSxcclxuICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBjYXRSZXM/LmRhdGE/LmNhdGVnb3JpZXMgPz8gY2F0UmVzPy5jYXRlZ29yaWVzID8/IFtdLFxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIGZvcmtKb2luKGNhdGVnb3J5UmVxdWVzdHMpXHJcbiAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiBjb21wbGV0ZVByb2dyYW1IeWRyYXRpb24oKSkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJhd1Jlc3VsdHM6IHVua25vd24pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gcmF3UmVzdWx0cyBhcyBBcnJheTx7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmFtOiBhbnk7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBhbnlbXTtcclxuICAgICAgICAgICAgICB9PjtcclxuICAgICAgICAgICAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xyXG4gICAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeyBwcm9ncmFtLCBjYXRlZ29yaWVzIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gKGNhdGVnb3JpZXMgPz8gW10pLmZpbHRlcigoY2F0OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlNYXRjaGVzSWQoY2F0LCBjYXRlZ29yeUlkU2V0KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgbWFwW1N0cmluZyhwcm9ncmFtLmlkKV0gPSBzZWxlY3RlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKG1hcCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21Gb3JtKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbigpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ3VzdG9tIGRhc2hib2FyZHMgb2Z0ZW4gc3RvcmUgcHJvZ3JhbSBpZHMgb25seSDigJQgcmVzb2x2ZSBuYW1lcyBmb3IgZm9ybSBjaGlwcy4gKi9cclxuICBwcml2YXRlIHJlc29sdmVQcm9ncmFtSWRzRm9yRWRpdChcclxuICAgIHByb2dyYW1JZHM6IG51bWJlcltdLFxyXG4gICAgcHJvZ3JhbXNGcm9tTGlzdD86IGFueVtdXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXByb2dyYW1JZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFwcGx5ID0gKHByb2dyYW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICBjb25zdCBtYXRjaGVkID0gcHJvZ3JhbXMuZmlsdGVyKChwOiBhbnkpID0+XHJcbiAgICAgICAgcHJvZ3JhbUlkcy5pbmNsdWRlcyhOdW1iZXIocD8uaWQpKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoIW1hdGNoZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNoaXBzID0gbWF0Y2hlZC5tYXAoKHA6IGFueSkgPT4gKHtcclxuICAgICAgICBpZDogcC5pZCxcclxuICAgICAgICBjYXRlZ29yeV9pZDogcC5pZCxcclxuICAgICAgICBuYW1lOiBwLm5hbWUsXHJcbiAgICAgICAgaXRlbV9uYW1lOiBwLm5hbWUsXHJcbiAgICAgICAgcHJvZ3JhbUlkOiBwLmlkLFxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSBub3JtYWxpemVQcm9ncmFtQ2F0ZWdvcmllcyhjaGlwcyk7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9IFtcclxuICAgICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxyXG4gICAgICBdO1xyXG4gICAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xyXG4gICAgICBtYXRjaGVkLmZvckVhY2goKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIG1hcFtTdHJpbmcocC5pZCldID0gW107XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBtYXA7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHByb2dyYW1zRnJvbUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICBhcHBseShwcm9ncmFtc0Zyb21MaXN0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xyXG4gICAgICB0aGlzLmJlZ2luRWRpdEh5ZHJhdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlXHJcbiAgICAgIC5nZXRTYWlsc1Byb2dyYW1MaXN0KClcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5maW5pc2hFZGl0SHlkcmF0aW9uKCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGFwcGx5KHBhcnNlU2FpbHNQcm9ncmFtTGlzdChyZXMpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVyciksXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEVkaXREYXNoYm9hcmREYXRhKCk6IGFueSB7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhc2hib2FyZERldGFpbHMgPz8ge307XHJcbiAgICBjb25zdCBjb3JlID0gcm93Py5kYXNoYm9hcmRfZGV0YWlscyA/PyByb3c/LmRhc2hib2FyZCA/PyByb3c7XHJcbiAgICBjb25zdCBwcm9ncmFtU291cmNlID1cclxuICAgICAgY29yZT8ucHJvZ3JhbXMgXHJcbiAgICBjb25zdCByY1NvdXJjZSA9XHJcbiAgICAgIGNvcmU/LnJlc3BvbnNpYmlsaXR5Q2VudGVyc1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnJvdyxcclxuICAgICAgLi4uY29yZSxcclxuICAgICAgY2RpZDogY29yZT8uY2RpZCA/PyByb3c/LmNkaWQsXHJcbiAgICAgIGRhc2hib2FyZF9uYW1lOiBjb3JlPy5uYW1lID8/IHJvdz8uZGFzaGJvYXJkX25hbWUsXHJcbiAgICAgIG5hbWU6IGNvcmU/Lm5hbWUgPz8gcm93Py5kYXNoYm9hcmRfbmFtZSxcclxuICAgICAgZGVzY3JpcHRpb246IGNvcmU/LmRlc2NyaXB0aW9uID8/IHJvdz8uZGVzY3JpcHRpb24sXHJcbiAgICAgIHZpZXdlcnM6IGNvcmU/LnZpZXdlcnMgPz8gcm93Py52aWV3ZXJzLFxyXG4gICAgICB2aXNpYmxlX3RvX3VzZXJzOiBjb3JlPy52aXNpYmxlX3RvX3VzZXJzID8/IHJvdz8udmlzaWJsZV90b191c2VycyxcclxuICAgICAgdmlzaWJsZV90b19ncm91cHM6IGNvcmU/LnZpc2libGVfdG9fZ3JvdXBzID8/IHJvdz8udmlzaWJsZV90b19ncm91cHMsXHJcbiAgICAgIHByb2dyYW1zOiBwcm9ncmFtU291cmNlLFxyXG4gICAgICBwcm9ncmFtSWQ6IGV4dHJhY3RQcm9ncmFtSWRzRnJvbURhc2hib2FyZCh7XHJcbiAgICAgICAgcHJvZ3JhbXM6IHByb2dyYW1Tb3VyY2UsXHJcbiAgICAgICAgcHJvZ3JhbTogY29yZT8ucHJvZ3JhbSA/PyByb3c/LnByb2dyYW0sXHJcbiAgICAgIH0pLFxyXG4gICAgICByZXNwb25zaWJpbGl0eV9jYXRlZ29yeTpcclxuICAgICAgICBjb3JlPy5yZXNwb25zaWJpbGl0eV9jYXRlZ29yeSA/P1xyXG4gICAgICAgIHJvdz8ucmVzcG9uc2liaWxpdHlfY2F0ZWdvcnkgPz9cclxuICAgICAgICBjb3JlPy5yZXNwb25zaWJpbGl0eUNhdGVnb3J5ID8/XHJcbiAgICAgICAgW10sXHJcbiAgICAgIHJjSWQ6IGNvcmUucmNJZCxcclxuICAgICAgc2VsZWN0ZWRSY0VudHJpZXM6XHJcbiAgICAgICAgcm93Py5zZWxlY3RlZFJjRW50cmllcyA/P1xyXG4gICAgICAgIGNvcmU/LnNlbGVjdGVkUmNFbnRyaWVzID8/XHJcbiAgICAgICAgW10sXHJcbiAgICAgIHJlc3BvbnNpYmlsaXR5Q2VudGVyczogcmNTb3VyY2UsXHJcbiAgICAgIHJlc3BvbnNpYmlsaXR5X2NlbnRlcjogcmNTb3VyY2UsXHJcbiAgICAgIHJlc3BvbnNpYmlsaXR5Q2VudGVySWQ6IGNvcmUucmNJZCxcclxuICAgICAgcHJvZ3JhbTogY29yZT8ucHJvZ3JhbSA/PyByb3c/LnByb2dyYW0sXHJcbiAgICAgIHRpbWVmcmFtZTpcclxuICAgICAgICBjb3JlPy50aW1lZnJhbWUgPz9cclxuICAgICAgICAocm93Py50aW1lX2ZyYW1lX2Zyb20gfHwgcm93Py50aW1lX2ZyYW1lX3RvXHJcbiAgICAgICAgICA/IHsgZnJvbTogcm93Py50aW1lX2ZyYW1lX2Zyb20sIHRvOiByb3c/LnRpbWVfZnJhbWVfdG8gfVxyXG4gICAgICAgICAgOiB1bmRlZmluZWQpLFxyXG4gICAgICB0aW1lX2ZyYW1lX2Zyb206XHJcbiAgICAgICAgY29yZT8udGltZWZyYW1lPy5mcm9tID8/XHJcbiAgICAgICAgY29yZT8udGltZWZyYW1lPy5zdGFydF9kYXRlID8/XHJcbiAgICAgICAgcm93Py50aW1lX2ZyYW1lX2Zyb20sXHJcbiAgICAgIHRpbWVfZnJhbWVfdG86XHJcbiAgICAgICAgY29yZT8udGltZWZyYW1lPy50byA/PyBjb3JlPy50aW1lZnJhbWU/LmVuZF9kYXRlID8/IHJvdz8udGltZV9mcmFtZV90byxcclxuICAgICAgY3JlYXRlZF9ieTogY29yZT8uY3JlYXRlZEJ5ID8/IGNvcmU/LmNyZWF0ZWRfYnkgPz8gcm93Py5jcmVhdGVkX2J5LFxyXG4gICAgICBjcmVhdGVkQnk6IGNvcmU/LmNyZWF0ZWRCeSA/PyBjb3JlPy5jcmVhdGVkX2J5ID8/IHJvdz8uY3JlYXRlZEJ5LFxyXG4gICAgfTtcclxuICB9XHJcbiAgc3VibWl0dGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgaWQncyBmcm9tIGEgcGFydGljdWxhciBsaXN0IGVsZW1lbnRzXHJcbiAgICogQHBhcmFtIGxpc3QgYWN0dWFsIHNlbGVjdGVkIGxpc3RcclxuICAgKiBAcGFyYW0ga2V5IGNvbnRhaW5zIGtleSB0byBleHRyYWN0IGlkIGZyb20gdGhlIGxpc3RcclxuICAgKi9cclxuICByZXR1cm5JZHMobGlzdDogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbGlzdD8ubWFwKChlbGUpID0+IHtcclxuICAgICAgaWYgKGVsZVtrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZVtrZXldO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyB0aGUgZGF0YSBzdWJtaXR0ZWQgb24gY3JlYXRlIGRhc2hib2FyZCBmb3JtXHJcbiAgICovXHJcbiAgdmFsaWRhdGVEYXNoYm9hcmQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgfSwgMTAwKTtcclxuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWU7XHJcbiAgICBjb25zdCByZSA9IC8mbmJzcDt8PGJyPi9nO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUgPSBldmVudC5yZXBsYWNlKHJlLCAnJykudHJpbSgpO1xyXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0O1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uXHJcbiAgICAgIC5yZXBsYWNlKHJlLCAnJylcclxuICAgICAgLnRyaW0oKTtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lIHx8XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLnRyaW0oKSA9PSAnJyB8fFxyXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZS5sZW5ndGggPiAzMCB8fFxyXG4gICAgICB0aGlzLnRleHRDb3VudC50cmFuc2Zvcm0odGhpcy5kYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQpID5cclxuICAgICAgICAyNTAgfHxcclxuICAgICAgKHRoaXMuZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSAmJlxyXG4gICAgICAgICF0aGlzLmRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVG9EYXRlKSB8fFxyXG4gICAgICAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCA9PSAwKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gYXBpIGNhbGwgdG8gY3JlYXRlIGEgZGFzaGJvYWRcclxuICAgKiBAcGFyYW0gZGFzaGJvYXJkIGNvbnRhaW5zIGRhc2hib2FyZEZvcm0gZGF0YVxyXG4gICAqL1xyXG4gIHN1Ym1pdERhc2hib2FyZCgpIHtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICBjb25zdCB2YWxpZCA9IHRoaXMudmFsaWRhdGVEYXNoYm9hcmQoKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy52TG9hZGVyID0gdHJ1ZTtcclxuICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZGFzaGJvYXJkRm9ybTtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgdmlld2VyOiB7XHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnJldHVybklkcyhkYXNoYm9hcmQuc2VsZWN0ZWRWaWV3ZXJzLCAndWlkJyksXHJcbiAgICAgICAgdXNlckdyb3VwSWQ6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZEdyb3VwLCAndWdpZCcpLFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgd2lkZ2V0X2RldGFpbHM6IGRhc2hib2FyZC5jb25maWd1cmVXaWRnZXQsXHJcbiAgICAgIGRhc2hib2FyZF9pZDogdGhpcy5kYXNoYm9hcmRJZCxcclxuICAgIH07XHJcbiAgXHJcbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2Uuc2F2ZVdpZGdldERldGFpbHMocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gc2F2ZVdpZGdldERldGFpbHMgY2FuIHJldHVybiBmcmVzaGVzdCBicmlkZ2UgaWQ7IG1lcmdlIGl0IGZvciByZWRpcmVjdC5cclxuICAgICAgICBjb25zdCB3aWRnZXRQYXlsb2FkID0gcmVzPy5kYXRhID8/IHJlcyA/PyB7fTtcclxuICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQgPSB7XHJcbiAgICAgICAgICAuLi4odGhpcy5jcmVhdGVkRGFzaGJvYXJkID8/IHt9KSxcclxuICAgICAgICAgIC4uLih3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmQgPz8ge30pLFxyXG4gICAgICAgICAgY2RkaWQ6XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uY2RkaWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RkaWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RpZCA/P1xyXG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmRfYnJpZGdlX2lkLFxyXG4gICAgICAgICAgY2RpZDpcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkPy5jZGlkID8/XHJcbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmNkaWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RkaWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCxcclxuICAgICAgICAgIGRhc2hib2FyZF9icmlkZ2VfaWQ6XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCA/P1xyXG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmRfYnJpZGdlX2lkID8/XHJcbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZEJyaWRnZUlkLFxyXG4gICAgICAgICAgZGFzaGJvYXJkQnJpZGdlSWQ6XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uZGFzaGJvYXJkQnJpZGdlSWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkQnJpZGdlSWQgPz9cclxuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkSWQgPSB0aGlzLmdldENyZWF0ZWREYXNoYm9hcmRDZGlkKCk7XHJcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1NtaWxleSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zbWlsZXlNZXNzYWdlID0gdGhpcy5tb2RlID09PSAnRURJVCcgPyAnVGhlIGRhc2hib2FyZCBoYXMgYmVlbiB1cGRhdGVkLicgOiAnVGhlIGRhc2hib2FyZCBoYXMgYmVlbiBjcmVhdGVkLic7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzU21pbGV5ID0gZmFsc2U7XHJcbiAgICAgICAgICBjb25zdCBjZGlkID0gdGhpcy5nZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpO1xyXG4gICAgICAgICAgY29uc3QgY2xvc2VNb2RlID0gdGhpcy5yZWRpcmVjdEFmdGVyQ3JlYXRlXHJcbiAgICAgICAgICAgID8gJ2NyZWF0ZWQnXHJcbiAgICAgICAgICAgIDogdGhpcy5tb2RlID09PSAnRURJVCdcclxuICAgICAgICAgICAgICA/ICd1cGRhdGVkJ1xyXG4gICAgICAgICAgICAgIDogJ2NyZWF0ZWQnO1xyXG4gICAgICAgICAgdGhpcy5yZWRpcmVjdEFmdGVyQ3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoe1xyXG4gICAgICAgICAgICBtb2RlOiBjbG9zZU1vZGUsXHJcbiAgICAgICAgICAgIGlkOiBjZGlkLFxyXG4gICAgICAgICAgICBjZGlkLFxyXG4gICAgICAgICAgICBkYXNoYm9hcmRCcmlkZ2VJZDpcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZEJyaWRnZUlkLFxyXG4gICAgICAgICAgICBkYXNoYm9hcmQ6IHRoaXMuY3JlYXRlZERhc2hib2FyZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDMwMDApO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlV2lkZ2V0RGV0YWlscyBlcnJvciA9PicsIGVycm9yKTtcclxuICAgICAgICB0aGlzLnNuYWNrQmFyLnNob3coZXJyb3IuZXJyb3Iuc3RhdHVzTWVzc2FnZSwgJ2FsZXJ0Jyk7XHJcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG5cclxuICB9XHJcblxyXG4gIGNsb3NlQ29udGFpbmVyKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5jbG9zZS5lbWl0KG1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXREYXNoYm9hcmQoKSB7XHJcbiAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmRhc2hib2FyZEZvcm07XHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIGRhc2hib2FyZF9uYW1lOiBkYXNoYm9hcmQuZGFzaGJvYXJkTmFtZSxcclxuICAgICAgZGVzY3JpcHRpb246IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250ZW50OiBkYXNoYm9hcmQuZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0LFxyXG4gICAgICAgICAgYXR0YWNobWVudHM6IFtdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHZpc2libGVfdG9fdXNlcnM6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZFZpZXdlcnMsICd1aWQnKSxcclxuICAgICAgdmlzaWJsZV90b19ncm91cHM6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZEdyb3VwLCAndWdpZCcpLFxyXG4gICAgICByZXNwb25zaWJpbGl0eV9jZW50ZXI6IHRoaXMucmV0dXJuSWRzKFxyXG4gICAgICAgIGRhc2hib2FyZC5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycyxcclxuICAgICAgICAncmNpZCdcclxuICAgICAgKSxcclxuICAgICAgcmVzcG9uc2liaWxpdHlfY2F0ZWdvcnk6IHRoaXMucmV0dXJuSWRzKFxyXG4gICAgICAgIGRhc2hib2FyZC5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyxcclxuICAgICAgICAnY2F0ZWdvcnlfaWQnXHJcbiAgICAgICksXHJcbiAgICAgIHJpc2tfY2F0ZWdvcnk6IHRoaXMucmV0dXJuSWRzKFxyXG4gICAgICAgIGRhc2hib2FyZC5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLFxyXG4gICAgICAgICdjYXRlZ29yeV9pZCdcclxuICAgICAgKSxcclxuICAgICAgZGlzcGxheV9jcml0ZXJpYTpcclxuICAgICAgICBkYXNoYm9hcmQuZGlzcGxheUNyaXRlcmlhID09PSAnYW5kJ1xyXG4gICAgICAgICAgPyAnQk9USF9SQ19BTkRfQ0FURUdPUlknXHJcbiAgICAgICAgICA6ICdSQ19PUl9DQVRFR09SWScsXHJcblxyXG4gICAgICB3aWRnZXRfZGV0YWlsczogZGFzaGJvYXJkLmNvbmZpZ3VyZVdpZGdldCxcclxuICAgICAgcHJvZ3JhbToge1xyXG4gICAgICAgIGFsbF9wcm9ncmFtczogdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcclxuICAgICAgICBzZWxlY3RlZF9wcm9ncmFtczogdGhpcy5zZWxlY3RlZFByb2dyYW1zLFxyXG4gICAgICB9LFxyXG4gICAgICB0aW1lZnJhbWU6IHtcclxuICAgICAgICBzdGFydF9kYXRlOiBkYXNoYm9hcmQuc2VsZWN0ZWRGcm9tRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmdldERhdGVGb3JtYXRlKGRhc2hib2FyZD8uc2VsZWN0ZWRGcm9tRGF0ZSlcclxuICAgICAgICAgIDogJycsXHJcbiAgICAgICAgZW5kX2RhdGU6IGRhc2hib2FyZC5zZWxlY3RlZFRvRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmdldERhdGVGb3JtYXRlKGRhc2hib2FyZD8uc2VsZWN0ZWRUb0RhdGUpXHJcbiAgICAgICAgICA6ICcnLFxyXG4gICAgICB9LFxyXG5cclxuICAgIH07XHJcbiAgICBjb25zdCBjcmVhdGVEYXNoYm9hcmRQYXlsb2FkID0gdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmJ1aWxkUGF5bG9hZChwYXlsb2FkKTtcclxuICAgIHRoaXMuc2F2ZURhc2hib2FyZChjcmVhdGVEYXNoYm9hcmRQYXlsb2FkKTtcclxuXHJcbiAgfVxyXG5cclxuICBzYXZlRGFzaGJvYXJkKHBheWxvYWQ6IGFueSkge1xyXG4gICAgbGV0IGFwaUNhbGwgPSB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuY3JlYXRlRGFzaGJvYXJkKHBheWxvYWQpO1xyXG4gICAgaWYodGhpcy5tb2RlID09PSAnRURJVCcpIHtcclxuICAgICAgYXBpQ2FsbCA9IHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS51cGRhdGVEYXNoYm9hcmQocGF5bG9hZCwgdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5yZWNvcmRJZCk7XHJcbiAgICB9XHJcbiAgICBhcGlDYWxsLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHdhc0NyZWF0ZSA9IHRoaXMubW9kZSA9PT0gJ0NSRUFURSc7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkID0gcmVzPy5kYXRhPy5kYXNoYm9hcmQgPz8gbnVsbDtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZERldGFpbHMgPSB0aGlzLmNyZWF0ZWREYXNoYm9hcmRcclxuICAgICAgICB0aGlzLmRhc2hib2FyZElkID0gdGhpcy5nZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRGV0YWlsc1sncmVjb3JkSWQnXSA9IHRoaXMuY3JlYXRlZERhc2hib2FyZD8uaWRcclxuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9wZW5Db25maWd1cmVXaWRnZXRzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dDb21wbGlhbmNlV2lkZ2V0cyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh3YXNDcmVhdGUpIHtcclxuICAgICAgICAgIHRoaXMucmVkaXJlY3RBZnRlckNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubW9kZSA9ICdFRElUJ1xyXG5cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYoZXJyb3Iuc3RhdHVzID09IDQyMikge1xyXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5zaG93KFxyXG4gICAgICAgICAgICBlcnJvci5lcnJvci5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAnYWxlcnQnXHJcbiAgICAgICAgICApOyAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGFzaCA9IHRoaXMuY3JlYXRlZERhc2hib2FyZDtcclxuICAgIGNvbnN0IGNkaWQgPVxyXG4gICAgICBkYXNoPy5jZGRpZCA/P1xyXG4gICAgICBkYXNoPy5jZGlkID8/XHJcbiAgICAgIGRhc2g/LmNkSWQgPz9cclxuICAgICAgZGFzaD8uZGFzaGJvYXJkX2JyaWRnZV9pZCA/P1xyXG4gICAgICBkYXNoPy5kYXNoYm9hcmRCcmlkZ2VJZCA/P1xyXG4gICAgICBkYXNoPy5kYXNoYm9hcmQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cclxuICAgICAgdGhpcy5kYXNoYm9hcmRJZDtcclxuICAgIHJldHVybiBjZGlkICE9IG51bGwgJiYgY2RpZCAhPT0gJycgPyBTdHJpbmcoY2RpZCkgOiAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaHlkcmF0ZUVkaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdEZvcm1IeWRyYXRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVkaXRGb3JtSHlkcmF0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5lZGl0RGFzaGJvYXJkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5V2lkZ2V0c0Zyb21HZXRXaWRnZXRzUmVzcG9uc2Uod2lkZ2V0czoge1xyXG4gICAgd2lkZ2V0QXJyOiBhbnlbXTtcclxuICAgIGFsbFdpZGdldHNBcnJheTogYW55W107XHJcbiAgfSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2F2ZWRXaWRnZXRzID0gZmlsdGVyQWN0aXZlV2lkZ2V0cyh3aWRnZXRzPy53aWRnZXRBcnIgPz8gW10pO1xyXG4gICAgY29uc3QgY2F0YWxvZ1dpZGdldHMgPSB3aWRnZXRzPy5hbGxXaWRnZXRzQXJyYXk/Lmxlbmd0aFxyXG4gICAgICA/IHdpZGdldHMuYWxsV2lkZ2V0c0FycmF5XHJcbiAgICAgIDogc2F2ZWRXaWRnZXRzO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldCA9IHNhdmVkV2lkZ2V0cztcclxuICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gWy4uLnNhdmVkV2lkZ2V0c107XHJcbiAgICB0aGlzLmRpc3BsYXllZFdpZGdldHMgPSBbLi4uY2F0YWxvZ1dpZGdldHNdO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVESVQgbW9kZSBvbmx5OiBHRVQgZ2V0V2lkZ2V0cz9kYXNoYm9hcmRJZD17Y2RpZH0gKi9cclxuICBwcml2YXRlIGxvYWRFZGl0TW9kZVdpZGdldHMoY2RpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnRURJVCcgfHwgIWNkaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy53cmFwRWRpdFJlcXVlc3QoXHJcbiAgICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5mZXRjaEN1c3RvbURhc2hib2FyZFdpZGdldERldGFpbHMoY2RpZCksXHJcbiAgICAgICh3aWRnZXRzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBseVdpZGdldHNGcm9tR2V0V2lkZ2V0c1Jlc3BvbnNlKHdpZGdldHMpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGVkaXREYXNoYm9hcmQoKSB7XHJcbiAgICB0aGlzLnZMb2FkZXIgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XHJcbiAgICAgIHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50ID0gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1aWxkRWRpdERhc2hib2FyZERhdGEoKTtcclxuICAgIHRoaXMucGVuZGluZ0VkaXRSY0VudHJpZXMgPVxyXG4gICAgICBkYXRhPy5zZWxlY3RlZFJjRW50cmllcyA/P1xyXG4gICAgICB0aGlzLmRhc2hib2FyZERldGFpbHM/LnNlbGVjdGVkUmNFbnRyaWVzID8/XHJcbiAgICAgIFtdO1xyXG4gICAgY29uc3QgZWRpdENkaWQgPSBnZXRFZGl0RGFzaGJvYXJkQ2RpZChcclxuICAgICAgZGF0YSxcclxuICAgICAgdGhpcy5kYXNoYm9hcmREZXRhaWxzLFxyXG4gICAgICB0aGlzLmRhc2hib2FyZElkXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0ID0gW1xyXG4gICAgICBkYXRhPy5jcmVhdGVkQnkgPz8gZGF0YT8uY3JlYXRlZF9ieSxcclxuICAgIF0uZmlsdGVyKCh4KSA9PiB4ICE9IG51bGwpO1xyXG4gICAgdGhpcy5wb3B1bGF0ZURhc2hib2FyZEZvcm0oZGF0YSk7XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnICYmIGVkaXRDZGlkKSB7XHJcbiAgICAgIHRoaXMubG9hZEVkaXRNb2RlV2lkZ2V0cyhlZGl0Q2RpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cnlDb21wbGV0ZUVkaXRIeWRyYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlRGFzaGJvYXJkRm9ybShkYXRhOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uQmxvY2sgPSBBcnJheS5pc0FycmF5KGRhdGE/LmRlc2NyaXB0aW9uKVxyXG4gICAgICAgID8gZGF0YS5kZXNjcmlwdGlvblswXVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgICAgY29uc3QgZGVzY3JpcHRpb25UZXh0ID1cclxuICAgICAgICBkZXNjcmlwdGlvbkJsb2NrPy5jb250ZW50ID8/XHJcbiAgICAgICAgKHR5cGVvZiBkYXRhPy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgPyBkYXRhLmRlc2NyaXB0aW9uIDogJycpID8/XHJcbiAgICAgICAgZGF0YT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0ID8/XHJcbiAgICAgICAgJyc7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlVXNlcnMgPSBkYXRhPy52aXNpYmxlX3RvX3VzZXJzID8/IGRhdGE/LnZpZXdlcnM/LnVzZXJJZCA/PyBbXTtcclxuICAgICAgY29uc3QgdmlzaWJsZVVzZXJJZHMgPSBkYXRhPy52aWV3ZXJzPy51c2VySWQgPz8gW107XHJcbiAgICAgIGNvbnN0IHZpc2libGVHcm91cHMgPSBkYXRhPy52aWV3ZXJzPy51c2VyR3JvdXBJZCA/PyBbXTtcclxuICAgICAgY29uc3QgdmlzaWJsZUdyb3VwSWRzID0gZGF0YT8udmlld2Vycz8udXNlckdyb3VwSWQgPz8gW107XHJcbiAgICAgIHRoaXMucGVuZGluZ0VkaXRSY0VudHJpZXMgPVxyXG4gICAgICAgIGRhdGE/LnNlbGVjdGVkUmNFbnRyaWVzID8/XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmREZXRhaWxzPy5zZWxlY3RlZFJjRW50cmllcyA/P1xyXG4gICAgICAgIFtdO1xyXG4gICAgICB0aGlzLnBlbmRpbmdFZGl0UmNJZHMgPSBleHRyYWN0UmNJZHNGcm9tRGFzaGJvYXJkKGRhdGEpO1xyXG4gICAgICB0aGlzLmFwcGx5UHJlcmVzb2x2ZWRSY0VudHJpZXMoKTtcclxuICAgICAgY29uc3Qgcmlza0NhdGVnb3JpZXMgPSBkYXRhPy5yaXNrX2NhdGVnb3J5ID8/IFtdO1xyXG4gICAgICBjb25zdCByaXNrQ2F0ZWdvcnlJZHMgPSAocmlza0NhdGVnb3JpZXMgPz8gW10pLm1hcCgocmlzazogYW55KSA9PlxyXG4gICAgICAgIHR5cGVvZiByaXNrID09PSAnb2JqZWN0JyA/IHJpc2s/LmNhdGVnb3J5X2lkID8/IHJpc2s/LmlkIDogcmlza1xyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGFydERhdGUgPVxyXG4gICAgICAgIGRhdGE/LnRpbWVmcmFtZT8uc3RhcnRfZGF0ZSA/P1xyXG4gICAgICAgIGRhdGE/LnRpbWVmcmFtZT8uZnJvbSA/P1xyXG4gICAgICAgIGRhdGE/LnRpbWVfZnJhbWVfZnJvbTtcclxuICAgICAgY29uc3QgZW5kRGF0ZSA9XHJcbiAgICAgICAgZGF0YT8udGltZWZyYW1lPy5lbmRfZGF0ZSA/P1xyXG4gICAgICAgIGRhdGE/LnRpbWVmcmFtZT8udG8gPz9cclxuICAgICAgICBkYXRhPy50aW1lX2ZyYW1lX3RvO1xyXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZSA9XHJcbiAgICAgICAgZGF0YT8uZGFzaGJvYXJkX25hbWUgPz8gZGF0YT8ubmFtZSA/PyAnJztcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uVGV4dDtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2VycyA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxyXG4gICAgICAgIHRoaXMudXNlcnNMaXN0LFxyXG4gICAgICAgIHZpc2libGVVc2VySWRzLFxyXG4gICAgICAgIFsnbWVtYmVyX2lkJywgJ3VpZCcsICdpZCddXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubGlzdERldGFpbHMuc2VsZWN0ZWRVc2Vyc0xpc3QgPSB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzO1xyXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cCA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxyXG4gICAgICAgIHRoaXMuZ3JvdXBMaXN0LFxyXG4gICAgICAgIHZpc2libGVHcm91cElkcyxcclxuICAgICAgICBbJ2dyb3VwX2lkJywgJ3VnaWQnLCAnaWQnXVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmxpc3REZXRhaWxzLnNlbGVjdGVkR3JvdXBMaXN0ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXA7XHJcbiAgICAgIHRoaXMuYXBwbHlQZW5kaW5nUmVzcG9uc2liaWxpdHlDZW50ZXJzKCk7XHJcbiAgICAgIHRoaXMuc3luY1Byb2dyYW1zRm9yRWRpdChkYXRhKTtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMgPVxyXG4gICAgICAgIHRoaXMuc2V0TGlzdChcclxuICAgICAgICB0aGlzLmFsbFJpc2tDYXRlZ29yaWVzLFxyXG4gICAgICAgIHJpc2tDYXRlZ29yeUlkcyxcclxuICAgICAgICAnY2F0ZWdvcnlfaWQnXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kaXNwbGF5Q3JpdGVyaWEgPVxyXG4gICAgICAgIGRhdGE/LmRpc3BsYXlfY3JpdGVyaWEgPT09ICdCT1RIX1JDX0FORF9DQVRFR09SWScgPyAnYW5kJyA6ICdvcic7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyb21EYXRlID0gc3RhcnREYXRlXHJcbiAgICAgICAgPyBuZXcgRGF0ZShzdGFydERhdGUpXHJcbiAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZSA9IGVuZERhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKGVuZERhdGUpXHJcbiAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdFRElUJykge1xyXG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHdpZGdldERldGFpbHNSYXcgPVxyXG4gICAgICAgICAgZGF0YT8ud2lkZ2V0X2RldGFpbHMgPz8gZGF0YT8ud2lkZ2V0cyA/PyBbXTtcclxuICAgICAgICBjb25zdCB3aWRnZXREZXRhaWxzID0gQXJyYXkuaXNBcnJheSh3aWRnZXREZXRhaWxzUmF3KVxyXG4gICAgICAgICAgPyB3aWRnZXREZXRhaWxzUmF3XHJcbiAgICAgICAgICA6IFtdO1xyXG4gICAgICAgIGNvbnN0IGFsbFdpZGdldHNSYXcgPSBkYXRhPy5hbGxfd2lkZ2V0cyA/PyB3aWRnZXREZXRhaWxzO1xyXG4gICAgICAgIGNvbnN0IGFsbFdpZGdldHMgPSBBcnJheS5pc0FycmF5KGFsbFdpZGdldHNSYXcpID8gYWxsV2lkZ2V0c1JhdyA6IFtdO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQgPSB3aWRnZXREZXRhaWxzO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID1cclxuICAgICAgICAgIHdpZGdldERldGFpbHMubGVuZ3RoID4gMCA/IFsuLi5uZXcgU2V0KHdpZGdldERldGFpbHMpXSA6IFtdO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkV2lkZ2V0cyA9XHJcbiAgICAgICAgICBhbGxXaWRnZXRzLmxlbmd0aCA+IDAgPyBbLi4ubmV3IFNldChhbGxXaWRnZXRzKV0gOiBbXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc3RhcnREYXRlKSB7XHJcbiAgICAgICAgY29uc3QgbWluVG9EYXRlID0gdGhpcy5zZXRUb0RhdGUoc3RhcnREYXRlKTtcclxuICAgICAgICB0aGlzLnRvRGF0ZVBpY2tlckNvbmZpZyA9IHsgLi4udGhpcy5kYXRlUGlja2VyQmFzZUNvbmZpZywgbWluOiBtaW5Ub0RhdGUgfTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhpZGVUb0RhdGUgPSB0cnVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmhpZGVUb0RhdGUgPSBmYWxzZTtcclxuICAgICAgfSwgMjApO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdwb3B1bGF0ZSBkYXNoYm9hcmQgZXJyb3IgPT4nLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIC8veW91ciBjb2RlIHRvIHVwZGF0ZSB0aGUgbW9kZWxcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHNldFBlcm1pc3Npb24ocm9sZUFjdGlvbnM6IGFueSkge1xyXG4gICAgbGV0IGlmRXhpc3RSaXNrID0gcm9sZUFjdGlvbnM/LmZpbmQoKGVsOiBhbnkpID0+IGVsLm1vZHVsZU5hbWUgPT0gJ3Jpc2snKTtcclxuICAgIGlmRXhpc3RSaXNrPy5zdWJNb2R1bGU/LmZvckVhY2goKG1vZHVsZTogYW55KSA9PiB7XHJcbiAgICAgIG1vZHVsZT8ucGVybWlzc2lvbnM/LmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAocGVybWlzc2lvbj8uY29kZSkge1xyXG4gICAgICAgICAgY2FzZSAnUlJNUic6IHtcclxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24/LmRlZmF1bHRQZXJtaXNzaW9uID09IDEgfHwgcGVybWlzc2lvbj8uZW5hYmxlID09IDEpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzTWFuYWdlUmlzayA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIGRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZyb21PcGVuID0gISF0aGlzLmZyb21EYXRlUGlja2VyPy5hcmVDYWxlbmRhcnNTaG93bjtcclxuICAgIGNvbnN0IHRvT3BlbiA9ICEhdGhpcy50b0RhdGVQaWNrZXI/LmFyZUNhbGVuZGFyc1Nob3duO1xyXG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXJPdmVybGF5ICYmICFmcm9tT3BlbiAmJiAhdG9PcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQ/LnRhcmdldCBhcyBFbGVtZW50IHwgbnVsbDtcclxuICAgIGlmICghdGFyZ2V0RWxlbWVudD8uY2xvc2VzdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gS2VlcCBjYWxlbmRhciBvcGVuIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY2FsZW5kYXIgVUkgaXRzZWxmXHJcbiAgICAvLyAoaW5jbHVkaW5nIG1vbnRoL3llYXIgbmF2aWdhdGlvbikuIFRoZSBmdWxsLXNjcmVlbiB0cmFuc3BhcmVudFxyXG4gICAgLy8gYC5kcC1wb3B1cGAgYmFja2Ryb3AgaXMgaW50ZW50aW9uYWxseSB0cmVhdGVkIGFzIGFuIG91dHNpZGUgY2xpY2suXHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlQ2FsZW5kYXIgPSAhIXRhcmdldEVsZW1lbnQuY2xvc2VzdChcclxuICAgICAgJ2RwLWRheS1jYWxlbmRhciwgZHAtbW9udGgtY2FsZW5kYXIsIGRwLWRheS10aW1lLWNhbGVuZGFyLCBkcC10aW1lLXNlbGVjdCdcclxuICAgICk7XHJcbiAgICBjb25zdCBjbGlja2VkT25EYXRlSW5wdXQgPSAhIXRhcmdldEVsZW1lbnQuY2xvc2VzdChcclxuICAgICAgJyNmcm9tX2RhdGUsICN0b19kYXRlJ1xyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY2xpY2tlZEluc2lkZUNhbGVuZGFyIHx8IGNsaWNrZWRPbkRhdGVJbnB1dCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZyb21PcGVuIHx8IHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9PT0gJ0ZST01fREFURScpIHtcclxuICAgICAgdGhpcy5jbG9zZUZyb21EYXRlUGlja2VyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodG9PcGVuIHx8IHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9PT0gJ1RPX0RBVEUnKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VUb0RhdGVQaWNrZXIoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSBmYWxzZTtcclxuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICcnO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLXNuYWNrLWJhcj48L2FwcC1zbmFjay1iYXI+XHJcbjxkaXYgY2xhc3M9XCJjcmVhdGUtZGFzaGJvYXJkXCIgKm5nSWY9XCIhb3BlbkNvbmZpZ3VyZVdpZGdldHNcIj5cclxuICA8ZGl2IGNsYXNzPVwiY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIgdngtZC1mbGV4IHZ4LWp1c3RpZnktZW5kXCIgW2NsYXNzLmFuaW1hdGUtc2xpZGVJblJpZ2h0XT1cImFuaW1hdGlvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vcmUtb3B0aW9uXCIgKm5nSWY9XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XHJcbiAgICAgIDxhcHAtdXNlci1saXN0ICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICd3aG9DYW5WaWV3J1wiXHJcbiAgICAgICAgKHNhdmVTZWxlY3RlZFVzZXJzKT1cInNhdmVTZWxlY3RlZExpc3QoJ3dob0NhblZpZXcnLCAkZXZlbnQpXCIgKGNsb3NlVXNlckxpc3QpPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpXCJcclxuICAgICAgICBbdG90YWxQYWdlc109XCJ0b3RhbFBhZ2VzXCIgW3RvdGFsTGlzdF09XCJ0b3RhbExpc3RcIiBbbGlzdERldGFpbHNdPVwibGlzdERldGFpbHNcIiBbdG90YWxncm91cHNjb3VudF09XCJ0b3RhbGdyb3Vwc1wiXHJcbiAgICAgICAgW2ZlYXR1cmVdPVwiZmVhdHVyZVwiPjwvYXBwLXVzZXItbGlzdD5cclxuICAgICAgPGFwcC1yZXNwb25zaWJpbGl0eS1jZW50ZXIgKm5nSWY9XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3JjTGlzdCdcIlxyXG4gICAgICAgIFtyZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0XT1cInJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3RcIiBbcmFkaW9TZWxlY3Rpb25dPVwiZmFsc2VcIlxyXG4gICAgICAgIFtzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVyc109XCJcclxuICAgICAgICAgIGRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnNcclxuICAgICAgICBcIiBbcmNJZEtleV09XCInaXRlbV9pZCdcIiAoc2F2ZVNlbGVjdGVkTGlzdCk9XCJzYXZlU2VsZWN0ZWRMaXN0KCdyYycsICRldmVudClcIlxyXG4gICAgICAgIChjbG9zZVJjTGlzdCk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIj5cclxuICAgICAgPC9hcHAtcmVzcG9uc2liaWxpdHktY2VudGVyPlxyXG4gICAgICA8IS0tIDxhcHAtY2F0ZWdvcmllcyAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJ1wiXHJcbiAgICAgICAgW2NhdGVnb3J5TGlzdF09XCJyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXNUcmVlXCIgW2FsbENhdGVnb3JpZXNdPVwiYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcIlxyXG4gICAgICAgIFtjYXRlZ29yeUlkS2V5XT1cIidjYXRlZ29yeV9pZCdcIiBbc2VsZWN0ZWRDYXRlZ29yaWVzXT1cImRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXNcIlxyXG4gICAgICAgIChzYXZlU2VsZWN0ZWRDYXRlZ29yeSk9XCJcclxuICAgICAgICAgIHNhdmVTZWxlY3RlZExpc3QoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsICRldmVudClcclxuICAgICAgICBcIiAoY2xvc2VDYXRlZ29yaWVzTGlzdCk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIj48L2FwcC1jYXRlZ29yaWVzPiAtLT5cclxuICAgICAgPGFwcC1saXN0LWNvbnRhaW5lciBsaXN0ICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnXCJcclxuICAgICAgICAoY2xvc2UpPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpXCI+XHJcbiAgICAgICAgPGFwcC1wcm9ncmFtLWxpc3QgYm9keSAoaXRlbXNTZWxlY3RlZENoYW5nZSk9XCJvblByb2dyYW1TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJdGVtc109XCJzZWxlY3RlZFByb2dyYW1zXCIgW3VybF09XCJwcm9ncmFtTGlzdFVybFwiPjwvYXBwLXByb2dyYW0tbGlzdD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWJldHdlZW4gdngtdy0xMDBcIiBmb290ZXI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIHZ4LWZzLTEyIHZ4LWQtZmxleFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGVkLWNvdW50LWJveCB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCI+XHJcbiAgICAgICAgICAgICAgICB7eyBhbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGggfX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIFByb2dyYW1cclxuICAgICAgICAgICAgICAgIHt7IGFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCA+IDEgPyBcIkNhdGVnb3JpZXNcIiA6IFwiQ2F0ZWdvcnlcIiB9fVxyXG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZSB2eC1kLWZsZXhcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbEJ0blwiIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5leHRCdG5cIiAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1wiPlxyXG4gICAgICAgICAgICAgIE5leHQgPGkgY2xhc3M9XCJpY29uc1wiPiYjeGU5MWU7PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2FwcC1saXN0LWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ2eC1kaWFsb2ctY29udGFpbmVyIHNpZGUtZGlhbG9nXCIgW2NsYXNzLnRhYmxldC13aWR0aF09XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XHJcbiAgICAgIDxhcHAtbG9hZGVyLWlubGluZSAqbmdJZj1cInZMb2FkZXJcIj48L2FwcC1sb2FkZXItaW5saW5lPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidngtZGlhbG9nLWJvZHktY29udGFpbmVyXCIgKHNjcm9sbCk9XCJhbmltYXRlSW1hZ2UoKVwiXHJcbiAgICAgICAgICBbY2xhc3MuaGlkZGVuLXNjcm9sbF09XCJwb3BvdmVyU2VydmljZS5zdG9wU2Nyb2xsXCI+XHJcbiAgICAgICAgICA8IS0tIERhc2hib2FyZCBOYW1lIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmRpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlXCI+XHJcbiAgICAgICAgICAgICAgPGltZyBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZEljb25cIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAhZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lIHx8IGFjdGl2ZVNlbGVjdG9yID09PSAnbmFtZSdcclxuICAgICAgICAgICAgICAgIFwiIGFsdD1cIlwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIC8+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNoZWNrSWNvblwiICpuZ0lmPVwiZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJjaGVja0ljb25fX2NpcmNsZVwiIGN4PVwiMjZcIiBjeT1cIjI2XCIgcj1cIjI1XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5EYXNoYm9hcmRcclxuICAgICAgICAgICAgICAgICAgTmFtZVxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmUgdngtdHh0LXJlZCB2eC1mcy0xNiB2eC1mdy00MDBcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGV4dEZpZWxkXCIgcGxhY2Vob2xkZXI9XCJBZGQgZGFzaGJvYXJkIG5hbWUgKE1heCBsaW1pdDogMzAgY2hhcmFjdGVycykuXCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZVwiIChrZXlkb3duKT1cImFjdGl2ZVNlbGVjdG9yID0gJ25hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAoZm9jdXNpbik9XCJhY3RpdmF0ZVNlbGVjdG9yKCduYW1lJywgdHJ1ZSlcIiAoZm9jdXNvdXQpPVwiYWN0aXZhdGVTZWxlY3RvcignbmFtZScsIGZhbHNlKVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50ZXJcIiAqbmdJZj1cImRhc2hib2FyZEZvcm0/LmRhc2hib2FyZE5hbWU/Lmxlbmd0aCA+IDBcIj57eyAzMCAtXHJcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidngtdHh0LWVycm9yXCIgW2FwcFNjcm9sbEluVmlld109XCJ0cnVlXCIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAoZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkTmFtZT8ubGVuZ3RoID4gMzAgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmROYW1lKVxyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLmxlbmd0aCA+IDMwXHJcbiAgICAgICAgICAgICAgICAgID8gXCJZb3UgaGF2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgbGltaXQgb2YgMzAgY2hhcmFjdGVycy5cIlxyXG4gICAgICAgICAgICAgICAgICA6IFwiUGxlYXNlIGVudGVyIGEgbmFtZSBmb3IgdGhpcyBEYXNoYm9hcmQuXCJcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtaW5wdXQtZ3JvdXAgdngtbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8dmNvbXBseS1lZGl0b3IgW2VkaXRvckNvbmZpZ109XCJkYXNoYm9hcmREZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRGb3JtLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dFwiPjwvdmNvbXBseS1lZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRlclwiICpuZ0lmPVwiZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0Py5sZW5ndGggPiAwXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAyNTAgLVxyXG4gICAgICAgICAgICAgICAgICAgIChkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQgfCB0ZXh0Q291bnQpXHJcbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZ4LXR4dC1lcnJvclwiIFthcHBTY3JvbGxJblZpZXddPVwidHJ1ZVwiICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhc2hib2FyZEZvcm0/LmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCB8IHRleHRDb3VudCkgPiAyNTBcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIFlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGNoYXJhY3RlciBsaW1pdCBvZiAyNTBcclxuICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy5cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIERhc2hib2FyZCBEaXNwbGF5IENyaXRlcmlhICAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC1sYWJlbCB2eC1mcy0xMCB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wbC0xIHZ4LXByLTEgdngtbGgtNFwiPlxyXG4gICAgICAgICAgICBEYXNoYm9hcmQgRGlzcGxheSBDcml0ZXJpYVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPGFwcC1pbmZvcm1hdGlvbi1ibG9jaz48L2FwcC1pbmZvcm1hdGlvbi1ibG9jaz5cclxuXHJcbiAgICAgICAgICA8IS0tIFdobyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VsZWN0b3IgPT09ICd3aG9DYW5WaWV3J1wiIFtjbGFzcy5kaXNhYmxlZF09XCJcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAmJlxyXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnd2hvQ2FuVmlldycgJiZcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXHJcbiAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtuZ1NyY109XCJBU1NFVFMuZGFzaEJvYXJkVXNlcnNJY29uXCIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5sZW5ndGggPT0gMCB8fFxyXG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciA9PT0gJ3dob0NhblZpZXcnXHJcbiAgICAgICAgICAgICAgICBcIiBhbHQ9XCJcIiB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiAvPlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjaGVja0ljb25cIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICd3aG9DYW5WaWV3J1xyXG4gICAgICAgICAgICAgICAgXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJjaGVja0ljb25fX2NpcmNsZVwiIGN4PVwiMjZcIiBjeT1cIjI2XCIgcj1cIjI1XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5XaG9cclxuICAgICAgICAgICAgICAgICAgY2FuIHZpZXcgdGhpcyBkYXNoYm9hcmQ/PHNwYW4gY2xhc3M9XCJyZXF1aXJlIHZ4LXR4dC1yZWQgdngtZnMtMTYgdngtZnctNDAwXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID09IDBcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveEVuYWJsZSB2eC1wbC0zIHZ4LXByLTMgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCd3aG9DYW5WaWV3JywgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdEJveFBsYWNlaG9kZXIgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1saC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgV2hvIGNhbiB2aWV3IHRoaXMgZGFzaGJvYXJkP1xyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveFN1Y2Nlc3MgdngtcGwtMiB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBzRW5hYmxlZFwiIGlkPVwib25seXVzZXJzbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCIgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyIG9mIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8uc2xpY2UoMCwgMSlcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcyB2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1yLTFcIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm1lbWJlcl9pZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlldycsIHVzZXIpXCI+JiN4ZTlhZTs8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBOYW1lIHZ4LWZzLTExIHZ4LWxhYmVsLXR4dFwiIFthclRvb2x0aXBdPVwidXNlci5tZW1iZXJfbmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCIgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj57eyB1c2VyLm1lbWJlcl9uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID4gMSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFncm91cHNFbmFibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gZ3JlZW5CZyB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwidXNlckxpc3QucG9wb3ZlcigpXCIgcGxhY2VtZW50PVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAre3sgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5zbGljZSgxKS5sZW5ndGggfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjdXNlckxpc3QgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlciBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlIDogMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwidXNlcj8ubWVtYmVyX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzLWljb25cIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0LmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWVtYmVyX2lkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgIWdyb3Vwc0VuYWJsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIChjbGljayk9XCJyZW1vdmUoJ3dob0NhblZpZXcnLCB1c2VyKVwiPiYjeGU5MGQ7PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVzZXI/Lm1lbWJlcl9uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1wb3BvdmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJncm91cHNFbmFibGVkXCIgY2xhc3M9XCJ2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCI+VVNFUihTKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biBncmVlbkJnIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBQb3BvdmVyIChjbGljayk9XCJ1c2VyQ291bnQucG9wb3ZlcigpXCIgcGxhY2VtZW50PVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1sLTIgdngtbXItMlwiICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkR3JvdXA/Lmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFZpZXdlcnM/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+Jjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRHcm91cD8ubGVuZ3RoXCIgaWQ9XCJ1c2Vyc2FuZGdyb3Vwc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCI+VVNFUiBHUk9VUChTKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwiZ3JvdXBDb3VudC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEdyb3VwPy5sZW5ndGggfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8YXBwLXBvcG92ZXIgI3VzZXJDb3VudCBbZG9udENsb3Nlb25DbGlja109XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGRhdGEgb2YgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwiZGF0YS5tZW1iZXJfbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MtaWNvblwiICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tZW1iZXJfaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlldycsIGRhdGEpXCI+JiN4ZTkwZDs8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5tZW1iZXJfbmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtcG9wb3Zlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICNncm91cENvdW50IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwiZGF0YS5ncm91cF9uYW1lXCIgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcy1pY29uXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlld0dyb3VwJywgZGF0YSlcIj4mI3hlOTBkOzwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmdyb3VwX25hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yICE9PSAnd2hvQ2FuVmlldydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdEJ0biB2eC1mcy0xMSB2eC1mdy02MDAgdngtdHh0LWJsdWUgdngtdHQtdXBwZXJjYXNlIHZ4LXAtMCB2eC1tLTAgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3dob0NhblZpZXcnLCB0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtbXItMVwiPiYjeGU5MGM7PC9pPiBFRElUXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBSZXNwb25zaWJpbGl0eSBDZW50ZXIgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1yb3dcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVNlbGVjdG9yID09PSAncmNMaXN0J1wiIFtjbGFzcy5kaXNhYmxlZF09XCJcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAmJlxyXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAncmNMaXN0JyAmJlxyXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcclxuICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwIHx8XHJcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yID09PSAncmNMaXN0J1xyXG4gICAgICAgICAgICAgICAgXCIgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRSY0ljb25cIiBhbHQ9XCJcIiB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiAvPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICdyY0xpc3QnXHJcbiAgICAgICAgICAgICAgICBcIiBjbGFzcz1cImNoZWNrSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiY2hlY2tJY29uX19jaGVja1wiIGZpbGw9XCJub25lXCIgZD1cIk0xNC4xIDI3LjJsNy4xIDcuMiAxNi43LTE2LjhcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidngtZm9ybS1ncm91cCB2eC1kLWJsb2NrIHZ4LW1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZ4LWZzLTExIHZ4LWZ3LTUwMCB2eC1sYWJlbC10eHQgdngtZC1ibG9jayB2eC10dC11cHBlcmNhc2UgdngtbWItMiB2eC13LTEwMCB2eC1saC00XCI+UkVTUE9OU0lCSUxJVFlcclxuICAgICAgICAgICAgICAgICAgQ0VOVEVSKFMpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID09IDBcclxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcigncmNMaXN0JywgdHJ1ZSlcIiBbY2xhc3MuZXJyb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA9PVxyXG4gICAgICAgICAgICAgICAgICAgICAgMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmlza0NhdGVnb3JpZXM/Lmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Qm94UGxhY2Vob2RlciB2eC1mcy0xMyB2eC1wYXJhZ3JhcGgtdHh0IHZ4LWxoLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhlIFJlc3BvbnNpYmlsaXR5IENlbnRlcihzKSB0aGF0IHlvdSB3b3VsZCBsaWtlPGJyIC8+ZGlzcGxheWVkXHJcbiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIERhc2hib2FyZCwgaWYgYW55LlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICBcIiBjbGFzcz1cInNlbGVjdEJveFN1Y2Nlc3MgdngtcGwtMiB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCIgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmMgb2YgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/LnNsaWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcyB2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1yLTFcIiAoY2xpY2spPVwicmVtb3ZlKCdyYycsIHJjKVwiPiYjeGU5YWU7PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcE5hbWUgdngtZnMtMTEgdngtbGFiZWwtdHh0XCIgW2FyVG9vbHRpcF09XCJyYy5pdGVtX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIiB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPnt7IHJjLml0ZW1fbmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPiAxXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInJjTGlzdC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAre3tcclxuICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5zbGljZSgxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICNyY0xpc3QgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmMgb2YgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlIDogMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwicmM/Lml0ZW1fbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MtaWNvblwiIChjbGljayk9XCJyZW1vdmUoJ3JjJywgcmMpXCI+JiN4ZTkwZDs8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmM/Lml0ZW1fbmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtcG9wb3Zlcj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgIT09ICdyY0xpc3QnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRCdG4gdngtZnMtMTEgdngtZnctNjAwIHZ4LXR4dC1ibHVlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wLTAgdngtbS0wIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCdyY0xpc3QnLCB0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtbXItMVwiPiYjeGU5MGM7PC9pPiBFRElUXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBQcm9ncmFtIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcIiBbY2xhc3MuZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgJiZcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycgJiZcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXHJcbiAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cclxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPT1cclxuICAgICAgICAgICAgICAgICAgICAwIHx8IGFjdGl2ZVNlbGVjdG9yID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJ1xyXG4gICAgICAgICAgICAgICAgXCIgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRQcm9ncmFtSWNvblwiIGFsdD1cIlwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIC8+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcclxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiY2hlY2tJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJjaGVja0ljb25fX2NpcmNsZVwiIGN4PVwiMjZcIiBjeT1cIjI2XCIgcj1cIjI1XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5QUk9HUkFNPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID09IDBcclxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcigncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJywgdHJ1ZSlcIiBbY2xhc3MuZXJyb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA9PVxyXG4gICAgICAgICAgICAgICAgICAgICAgMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmlza0NhdGVnb3JpZXM/Lmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Qm94UGxhY2Vob2RlciB2eC1mcy0xMyB2eC1wYXJhZ3JhcGgtdHh0IHZ4LWxoLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhlIFByb2dyYW0ocykgdGhhdCB5b3Ugd291bGQgbGlrZSBkaXNwbGF5ZWQgaW5cclxuICAgICAgICAgICAgICAgICAgICB0aGU8YnIgLz5EYXNoYm9hcmQsIGlmIGFueS5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcENvbnRhaW5lciB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LXBsLTIgdngtcHItMlwiICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJDYXRlZ29yeSBvZiBhbGxQcm9nYW1TZWxlY3RlZD8uc2xpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzIHZ4LWZzLTEyIHZ4LXBhcmFncmFwaC10eHQgdngtbXItMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlKCdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnLCByQ2F0ZWdvcnkpXCI+JiN4ZTlhZTs8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIiBbYXJUb29sdGlwXT1cInJDYXRlZ29yeS5pdGVtX25hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIiB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPnt7IHJDYXRlZ29yeS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPy5sZW5ndGggPiAxXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXIgKGNsaWNrKT1cInJDYXRlZ29yeUxpc3QucG9wb3ZlcigpXCIgcGxhY2VtZW50PVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgK3t7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZD8uc2xpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICNyQ2F0ZWdvcnlMaXN0IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJDYXRlZ29yeSBvZiBhbGxQcm9nYW1TZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2UgOiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IGluZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCIgW2FyVG9vbHRpcF09XCJyQ2F0ZWdvcnk/Lm5hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzLWljb25cIiAoY2xpY2spPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ2F0ZWdvcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+JiN4ZTkwZDs8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgckNhdGVnb3J5Py5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1wb3BvdmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJhY3RpdmVTZWxlY3RvciAhPT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdEJ0biB2eC1mcy0xMSB2eC1mdy02MDAgdngtdHh0LWJsdWUgdngtdHQtdXBwZXJjYXNlIHZ4LXAtMCB2eC1tLTAgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkwYzs8L2k+IEVESVRcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBUaW1lZnJhbWUgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1yb3dcIiBbY2xhc3MuZGlzYWJsZWRdPVwiYWN0aXZlU2VsZWN0b3IgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cclxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlIHx8XHJcbiAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFRvRGF0ZVxyXG4gICAgICAgICAgICAgICAgXCIgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRUaW1lRnJhbWVJY29uXCIgYWx0PVwiXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgLz5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkRnJvbURhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRUb0RhdGVcclxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiY2hlY2tJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJjaGVja0ljb25fX2NpcmNsZVwiIGN4PVwiMjZcIiBjeT1cIjI2XCIgcj1cIjI1XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTE0LjEgMjcuMmw3LjEgNy4yIDE2LjctMTYuOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIj5USU1FRlJBTUU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidngtY29udHJvbC1wYW5lbC1zdWItbGFiZWxcIj5TZWxlY3QgaG93IGxvbmcgdGhlIHNlbGVjdGVkIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICAgICAgICAgIE9uY2UgdGhlIHNlbGVjdGVkIHRpbWVmcmFtZSBleHBpcmVzLCB0aGUgZGFzaGJvYXJkIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZWFjdGl2YXRlZCBhbmQgbm8gbG9uZ2VyXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCB0byB1c2Vycy4gSWYgbm8gdGltZWZyYW1lIGlzIHNlbGVjdGVkLCB0aGUgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgICAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgcGVybWFuZW50bHkuPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB2eC1kLWZsZXggdngtanVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTJkOzwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImZyb21fZGF0ZVwiIFt2YWx1ZV09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZSB8IGRhdGUgOiAnZGQgTU1NIHl5eXknXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIiBbcGxhY2Vob2xkZXJdPVwiJ0Zyb20nXCIgKGNsaWNrKT1cIm9wZW5Gcm9tRGF0ZVBpY2tlcigkZXZlbnQpXCIgcmVhZG9ubHkgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZHAtZGF0ZS1waWNrZXIgI2Zyb21EYXRlUGlja2VyIFsobmdNb2RlbCldPVwiZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyb21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERhdGVcIiAob25TZWxlY3QpPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRnJvbURhdGVQaWNrZXIoKTsgZGF0ZVBpY2tlck92ZXJsYXkgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgXCIgW2NvbmZpZ109XCJmcm9tRGF0ZVBpY2tlckNvbmZpZ1wiPjwvZHAtZGF0ZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAoY2xpY2spPVwiY2xvc2VGcm9tRGF0ZVBpY2tlcigpXCIgKm5nSWY9XCJkYXRlUGlja2VyT3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0XCIgKm5nSWY9XCIhaGlkZVRvRGF0ZVwiIFtjbGFzcy5kaXNhYmxlZF09XCIhZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRGcm9tRGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTJkOzwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvX2RhdGVcIiBbdmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVG9EYXRlIHwgZGF0ZSA6ICdkZCBNTU0geXl5eSdcclxuICAgICAgICAgICAgICAgICAgICAgIFwiIFtwbGFjZWhvbGRlcl09XCInVG8nXCIgKGNsaWNrKT1cIm9wZW5Ub0RhdGVQaWNrZXIoJGV2ZW50KVwiIHJlYWRvbmx5IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRwLWRhdGUtcGlja2VyICN0b0RhdGVQaWNrZXIgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlVG9EYXRlUGlja2VyKCk7IGRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIFwiIFtjb25maWddPVwidG9EYXRlUGlja2VyQ29uZmlnXCI+PC9kcC1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiIChjbGljayk9XCJjbG9zZVRvRGF0ZVBpY2tlcigpXCIgKm5nSWY9XCJkYXRlUGlja2VyT3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ2eC10eHQtZXJyb3JcIiBbYXBwU2Nyb2xsSW5WaWV3XT1cInRydWVcIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICBTZWxlY3QgYSB0aW1lLWZyYW1lLlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRW1haWwgU3VtbWFyeSAtLT5cclxuICAgICAgICAgIDwhLS0gPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ2ZyZXF1ZW5jeSdcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgJiZcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ2ZyZXF1ZW5jeScgJiZcclxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZEVtYWlsU3VtbWFyaWVzSWNvblwiXHJcbiAgICAgICAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIzNlwiXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIzNlwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrSWNvblwiXHJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgNTIgNTJcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGVcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja0ljb25fX2NpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgIGN4PVwiMjZcIlxyXG4gICAgICAgICAgICAgICAgICBjeT1cIjI2XCJcclxuICAgICAgICAgICAgICAgICAgcj1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tJY29uX19jaGVja1wiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xIDI3LjJsNy4xIDcuMiAxNi43LTE2LjhcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZ4LWZvcm0tZ3JvdXAgdngtZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1kLWJsb2NrIHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0yIHZ4LXctMTAwIHZ4LWxoLTRcIlxyXG4gICAgICAgICAgICAgICAgICA+RW1haWwgU3VtbWFyaWVzPC9sYWJlbFxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidngtY29udHJvbC1wYW5lbC1zdWItbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICA+SWYgeW91IHdvdWxkIGxpa2UgdG8gc2VuZCBhIHN1bW1hcnkgb2YgdGhpcyBEYXNoYm9hcmQsIHBsZWFzZVxyXG4gICAgICAgICAgICAgICAgICBzZWxlY3QgYSBmcmVxdWVuY3koQnkgZGVmYXVsdCBWQ29tcGx5IHNlbmRzIGEgd2Vla2x5XHJcbiAgICAgICAgICAgICAgICAgIFN1bW1hcnkpLjwvbGFiZWxcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcignZnJlcXVlbmN5JywgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hQbGFjZWhvZGVyIHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtbGgtNFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBFbWFpbCBTdW1tYXJpZXNcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveFRleHQgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FyVG9vbHRpcF09XCJkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnZnJlcXVlbmN5J1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0QnRuIHZ4LWZzLTExIHZ4LWZ3LTYwMCB2eC10eHQtYmx1ZSB2eC10dC11cHBlcmNhc2UgdngtcC0wIHZ4LW0tMCB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcignZnJlcXVlbmN5JywgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkwYzs8L2k+IEVESVRcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ibG9ja1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInZ4LWJ0biBibG9jayBwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY29uZmlndXJlRGFzaGJvYXJkKClcIj5cclxuICAgICAgICAgICAgTmV4dDogQ29uZmlndXJlIFdpZGdldHNcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1kaWFsb2dcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIlxyXG4gICAgICAgIChjbGljayk9XCJjbG9zZS5lbWl0KHsgbW9kZTogJ2Rpc2NhcmQnIH0pXCIgW2FyVG9vbHRpcF09XCInW0VzY10gdG8gY2xvc2UnXCIgcGxhY2VtZW50PVwibGVmdFwiIHR5cGU9XCJibGFja1wiIGRlbGF5PVwiMFwiXHJcbiAgICAgICAgW3Rvb2x0aXBNYW5kYXRvcnldPVwidHJ1ZVwiIFtjbGFzcy5oaWRlXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImljb25zXCI+JiN4ZTkzZjs8L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWNvbmZpcm1hdGlvbi1hbGVydFwiICpuZ0lmPVwiXHJcbiAgICAgICAgICBzdWJtaXR0ZWQgJiZcclxuICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPT0gMCBcclxuICAgICAgICBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWNvbmZpcm1hdGlvbi1hbGVydC10b3BcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImljb25zXCI+JiN4ZTkzMDs8L2k+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInRleHRcIiAqbmdJZj1cInNob3dSaXNrQ2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgU2VsZWN0IGEgUmVzcG9uc2liaWxpdHkgQ2VudGVyIG9yIFJpc2sgQ2F0ZWdvcnkuXHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInRleHRcIiAqbmdJZj1cIiFzaG93Umlza0NhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgIFNlbGVjdCBhIFJlc3BvbnNpYmlsaXR5IENlbnRlci5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWNvbmZpcm1hdGlvbi1hbGVydC1ib3R0b21cIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWVzc2FnZVwiPjwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbGxcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInN1Ym1pdHRlZCA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgT0tBWVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxhcHAtc21pbGV5LWRpYWxvZyAqbmdJZj1cImlzU21pbGV5XCIgW21lc3NhZ2VdPVwic21pbGV5TWVzc2FnZVwiPjwvYXBwLXNtaWxleS1kaWFsb2c+XHJcblxyXG48YXBwLWNvbmZpZ3VyZS13aWRnZXRzICpuZ0lmPVwib3BlbkNvbmZpZ3VyZVdpZGdldHNcIiBbbW9kZV09XCJtb2RlXCIgW2Rpc3BsYXllZFdpZGdldHNdPVwiZGlzcGxheWVkV2lkZ2V0c1wiXHJcbiAgW3Nob3dSaXNrXT1cInNob3dSaXNrV2lkZ2V0c1wiIFtzaG93Q29tcGxpYW5jZV09XCIhc2hvd0NvbXBsaWFuY2VXaWRnZXRzXCIgW3NlbGVjdGVkV2lkZ2V0c0RhdGFdPVwic2VsZWN0ZWRXaWRnZXRzXCJcclxuICAod2lkZ2V0c0RhdGFNb2RpZmllZCk9XCJzZXRTZWxlY3RlZFdpZGdldHMoJGV2ZW50KVwiXHJcbiAgKGNsb3NlQ29uZmlndXJlV2lkZ2V0cyk9XCJjbG9zZUNvbmZpZ3VyZVdpZGdldHMoJGV2ZW50KVwiPjwvYXBwLWNvbmZpZ3VyZS13aWRnZXRzPiJdfQ==
|