cloud-ide-core 1.0.1 → 1.0.2
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 +49 -10
- package/fesm2022/{cloud-ide-core-general-master-type.component-B26auJZw.mjs → cloud-ide-core-general-master-type.component-BNYoP_bS.mjs} +132 -134
- package/fesm2022/{cloud-ide-core-general-master-type.component-B26auJZw.mjs.map → cloud-ide-core-general-master-type.component-BNYoP_bS.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs} +7 -7
- package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs.map → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs → cloud-ide-core-general-master.component-CFGGHinl.mjs} +152 -154
- package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs.map → cloud-ide-core-general-master.component-CFGGHinl.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs → cloud-ide-core-page-form.component-vfE-LkTS.mjs} +25 -25
- package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs.map → cloud-ide-core-page-form.component-vfE-LkTS.mjs.map} +1 -1
- package/fesm2022/cloud-ide-core.mjs +1113 -1110
- package/fesm2022/cloud-ide-core.mjs.map +1 -1
- package/index.d.ts +1736 -3
- package/package.json +3 -5
- package/esm2022/cloud-ide-core.mjs +0 -5
- package/esm2022/lib/cloud-ide-core.component.mjs +0 -19
- package/esm2022/lib/cloud-ide-core.routes.mjs +0 -137
- package/esm2022/lib/cloud-ide-core.service.mjs +0 -14
- package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +0 -768
- package/esm2022/lib/core/department-management/index.mjs +0 -5
- package/esm2022/lib/core/department-management/services/department-management.service.mjs +0 -187
- package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +0 -1122
- package/esm2022/lib/core/designation-management/index.mjs +0 -5
- package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +0 -194
- package/esm2022/lib/core/general-master-management/components/general-master/general-master.component.mjs +0 -738
- package/esm2022/lib/core/general-master-management/components/general-master-type/general-master-type.component.mjs +0 -608
- package/esm2022/lib/core/general-master-management/services/general-master-type.service.mjs +0 -203
- package/esm2022/lib/core/general-master-management/services/general-master.service.mjs +0 -166
- package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +0 -794
- package/esm2022/lib/core/grade-level-management/index.mjs +0 -5
- package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +0 -172
- package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +0 -1135
- package/esm2022/lib/core/menu-management/index.mjs +0 -10
- package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +0 -11
- package/esm2022/lib/core/menu-management/mock-data/menu-items.json +0 -311
- package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +0 -230
- package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +0 -483
- package/esm2022/lib/core/page-management/components/page-form/page-form.component.mjs +0 -212
- package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +0 -393
- package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +0 -767
- package/esm2022/lib/core/page-management/index.mjs +0 -10
- package/esm2022/lib/core/page-management/services/page-controls.service.mjs +0 -136
- package/esm2022/lib/core/page-management/services/page-management.service.mjs +0 -98
- package/esm2022/lib/core/page-management/services/page-theme.service.mjs +0 -107
- package/esm2022/public-api.mjs +0 -17
- package/lib/cloud-ide-core.component.d.ts +0 -5
- package/lib/cloud-ide-core.routes.d.ts +0 -2
- package/lib/cloud-ide-core.service.d.ts +0 -6
- package/lib/core/department-management/components/department-list/department-list.component.d.ts +0 -178
- package/lib/core/department-management/index.d.ts +0 -2
- package/lib/core/department-management/services/department-management.service.d.ts +0 -68
- package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +0 -242
- package/lib/core/designation-management/index.d.ts +0 -2
- package/lib/core/designation-management/services/designation-management.service.d.ts +0 -69
- package/lib/core/general-master-management/components/general-master/general-master.component.d.ts +0 -167
- package/lib/core/general-master-management/components/general-master-type/general-master-type.component.d.ts +0 -129
- package/lib/core/general-master-management/services/general-master-type.service.d.ts +0 -75
- package/lib/core/general-master-management/services/general-master.service.d.ts +0 -62
- package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +0 -199
- package/lib/core/grade-level-management/index.d.ts +0 -2
- package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +0 -69
- package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +0 -278
- package/lib/core/menu-management/index.d.ts +0 -3
- package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +0 -30
- package/lib/core/menu-management/services/menu-management.service.d.ts +0 -85
- package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +0 -126
- package/lib/core/page-management/components/page-form/page-form.component.d.ts +0 -35
- package/lib/core/page-management/components/page-list/page-list.component.d.ts +0 -91
- package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +0 -189
- package/lib/core/page-management/index.d.ts +0 -6
- package/lib/core/page-management/services/page-controls.service.d.ts +0 -54
- package/lib/core/page-management/services/page-management.service.d.ts +0 -42
- package/lib/core/page-management/services/page-theme.service.d.ts +0 -43
- package/public-api.d.ts +0 -8
|
@@ -1,767 +0,0 @@
|
|
|
1
|
-
import { Component, signal, computed, viewChild, DestroyRef, inject } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { Validators, ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';
|
|
4
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
5
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import { PageThemeService } from '../../services/page-theme.service';
|
|
7
|
-
import { AppStateHelperService } from 'cloud-ide-layout';
|
|
8
|
-
import { CideEleButtonComponent, CideEleDataGridComponent, CideIconComponent, CideInputComponent, CideSelectComponent, CideTextareaComponent, CideEleDropdownComponent, CideEleJsonEditorComponent, CideSelectOptionComponent } from 'cloud-ide-element';
|
|
9
|
-
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "@angular/forms";
|
|
13
|
-
export class PageThemeComponent {
|
|
14
|
-
constructor() {
|
|
15
|
-
// Dependency injection
|
|
16
|
-
this.destroyRef = inject(DestroyRef);
|
|
17
|
-
this.themeService = inject(PageThemeService);
|
|
18
|
-
this.appState = inject(AppStateHelperService);
|
|
19
|
-
this.fb = inject(NonNullableFormBuilder);
|
|
20
|
-
this.router = inject(Router);
|
|
21
|
-
this.route = inject(ActivatedRoute);
|
|
22
|
-
// Modern ViewChild signals for template renderers (Angular 20 approach)
|
|
23
|
-
this.themeDetailsRendererTemplate = viewChild.required('themeDetailsRendererTemplate');
|
|
24
|
-
this.themeStatusRendererTemplate = viewChild.required('themeStatusRendererTemplate');
|
|
25
|
-
this.actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
|
|
26
|
-
// Make Math available in template
|
|
27
|
-
this.Math = Math;
|
|
28
|
-
// Signals for reactive state management
|
|
29
|
-
this.themes = signal([]);
|
|
30
|
-
this.loading = signal(false);
|
|
31
|
-
this.error = signal(null);
|
|
32
|
-
this.selectedItems = signal([]);
|
|
33
|
-
this.searchTerm = signal('');
|
|
34
|
-
// Derived list filtered by searchTerm
|
|
35
|
-
this.filteredThemes = computed(() => {
|
|
36
|
-
const q = (this.searchTerm() || '').toLowerCase().trim();
|
|
37
|
-
const items = this.themes() || [];
|
|
38
|
-
if (!q)
|
|
39
|
-
return items;
|
|
40
|
-
return items.filter(t => {
|
|
41
|
-
const title = (t.sytm_title || '').toLowerCase();
|
|
42
|
-
const code = (t.sytm_theme_code || '').toLowerCase();
|
|
43
|
-
const desc = (t.sytm_desc || '').toLowerCase();
|
|
44
|
-
return title.includes(q) || code.includes(q) || desc.includes(q);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
// Page information
|
|
48
|
-
this.pageId = signal('');
|
|
49
|
-
this.pageTitle = signal('');
|
|
50
|
-
// Form state
|
|
51
|
-
this.isEditMode = signal(false);
|
|
52
|
-
this.editingThemeId = signal(null);
|
|
53
|
-
this.retrievedTheme = signal(null);
|
|
54
|
-
// Pagination signals
|
|
55
|
-
this.currentPage = signal(1);
|
|
56
|
-
this.pageSize = signal(10);
|
|
57
|
-
this.totalItems = signal(0);
|
|
58
|
-
// Modern reactive forms with signals
|
|
59
|
-
this.themeForm = this.fb.group({
|
|
60
|
-
sytm_title: ['', [Validators.required]],
|
|
61
|
-
sytm_desc: [''],
|
|
62
|
-
sytm_theme_code: ['', [Validators.required]],
|
|
63
|
-
sytm_preview_id_fm: [''],
|
|
64
|
-
sytm_sub_title: [''],
|
|
65
|
-
sytm_configuration: ['{}'],
|
|
66
|
-
sytm_entity_id_syen: [''],
|
|
67
|
-
sytm_isselected: [false],
|
|
68
|
-
sytm_layout: this.fb.group({
|
|
69
|
-
sytm_layout_sidebar: this.fb.group({ status: [true] }),
|
|
70
|
-
sytm_layout_header: this.fb.group({ status: [true] }),
|
|
71
|
-
sytm_layout_footer: this.fb.group({ status: [false] }),
|
|
72
|
-
sytm_layout_breadcrumb: this.fb.group({ status: [true] }),
|
|
73
|
-
sytm_layout_console: this.fb.group({ status: [false] }),
|
|
74
|
-
sytm_layout_request: this.fb.group({ status: [false] }),
|
|
75
|
-
sytm_layout_drawer: this.fb.array([])
|
|
76
|
-
}),
|
|
77
|
-
sytm_isactive: [true]
|
|
78
|
-
});
|
|
79
|
-
// Computed values
|
|
80
|
-
this.isFormDirty = computed(() => this.themeForm.dirty);
|
|
81
|
-
// Multi-select options for layout sections
|
|
82
|
-
this.layoutOptions = [
|
|
83
|
-
{ value: 'sidebar', label: 'Sidebar' },
|
|
84
|
-
{ value: 'header', label: 'Header' },
|
|
85
|
-
{ value: 'footer', label: 'Footer' },
|
|
86
|
-
{ value: 'breadcrumb', label: 'Breadcrumb' },
|
|
87
|
-
{ value: 'console', label: 'Console' },
|
|
88
|
-
{ value: 'request', label: 'Request' }
|
|
89
|
-
];
|
|
90
|
-
// Grid configuration signal
|
|
91
|
-
this.gridConfig = signal({
|
|
92
|
-
id: 'theme-list-grid',
|
|
93
|
-
title: '',
|
|
94
|
-
subtitle: '',
|
|
95
|
-
columns: [
|
|
96
|
-
{
|
|
97
|
-
key: 'details',
|
|
98
|
-
header: 'Theme Details',
|
|
99
|
-
type: 'custom',
|
|
100
|
-
width: 'auto',
|
|
101
|
-
truncate: true,
|
|
102
|
-
align: 'left',
|
|
103
|
-
renderer: 'themeDetailsRenderer'
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
key: 'sytm_theme_code',
|
|
107
|
-
header: 'Theme Code',
|
|
108
|
-
type: 'text',
|
|
109
|
-
width: '150px',
|
|
110
|
-
truncate: true,
|
|
111
|
-
align: 'left'
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
key: 'sytm_isactive',
|
|
115
|
-
header: 'Status',
|
|
116
|
-
type: 'custom',
|
|
117
|
-
width: '100px',
|
|
118
|
-
truncate: false,
|
|
119
|
-
align: 'center',
|
|
120
|
-
renderer: 'themeStatusRenderer'
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
key: 'actions',
|
|
124
|
-
header: '',
|
|
125
|
-
type: 'custom',
|
|
126
|
-
width: '120px',
|
|
127
|
-
truncate: false,
|
|
128
|
-
align: 'center',
|
|
129
|
-
renderer: 'actionsDropdownRenderer'
|
|
130
|
-
}
|
|
131
|
-
],
|
|
132
|
-
data: [],
|
|
133
|
-
trackBy: '_id',
|
|
134
|
-
pagination: {
|
|
135
|
-
enabled: true,
|
|
136
|
-
pageSize: 10,
|
|
137
|
-
pageSizeOptions: [10, 25, 50, 100],
|
|
138
|
-
showQuickJump: true,
|
|
139
|
-
showPageInfo: true,
|
|
140
|
-
showRefresh: true
|
|
141
|
-
},
|
|
142
|
-
search: {
|
|
143
|
-
enabled: true,
|
|
144
|
-
placeholder: 'Search themes...',
|
|
145
|
-
searchableColumns: ['sytm_title', 'sytm_desc', 'sytm_theme_code'],
|
|
146
|
-
debounceMs: 300
|
|
147
|
-
},
|
|
148
|
-
loading: {
|
|
149
|
-
useDefer: true,
|
|
150
|
-
skeletonRows: 5,
|
|
151
|
-
showOverlay: false
|
|
152
|
-
},
|
|
153
|
-
scroll: {
|
|
154
|
-
enabled: true,
|
|
155
|
-
maxHeight: '',
|
|
156
|
-
minHeight: '',
|
|
157
|
-
stickyHeader: true,
|
|
158
|
-
virtualScroll: false,
|
|
159
|
-
rowHeight: 50
|
|
160
|
-
},
|
|
161
|
-
responsive: true,
|
|
162
|
-
striped: false,
|
|
163
|
-
bordered: true,
|
|
164
|
-
compact: false,
|
|
165
|
-
tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
|
|
166
|
-
});
|
|
167
|
-
// Action handlers for grid
|
|
168
|
-
this.actionHandlers = {
|
|
169
|
-
onEdit: (item) => this.editTheme(item),
|
|
170
|
-
onDelete: (item) => this.deleteTheme(item),
|
|
171
|
-
onToggleStatus: (item) => this.toggleThemeStatus(item)
|
|
172
|
-
};
|
|
173
|
-
// ===== Drawer (sytm_layout_drawer) helpers =====
|
|
174
|
-
this.drawerConfigOptions = [
|
|
175
|
-
{ value: 'drawer_notes', label: 'Drawer Notes' },
|
|
176
|
-
{ value: 'drawer_theme', label: 'Drawer Theme' }
|
|
177
|
-
];
|
|
178
|
-
}
|
|
179
|
-
// Helper to resolve preview image URL safely
|
|
180
|
-
getPreviewUrl(theme) {
|
|
181
|
-
const id = theme?.sytm_preview_id_fm || '';
|
|
182
|
-
if (!id)
|
|
183
|
-
return '';
|
|
184
|
-
const svcUnknown = this.themeService;
|
|
185
|
-
const hasGetPreviewUrl = (svc) => typeof svc === 'object' && svc !== null &&
|
|
186
|
-
'getPreviewUrl' in svc &&
|
|
187
|
-
typeof svc['getPreviewUrl'] === 'function';
|
|
188
|
-
if (hasGetPreviewUrl(svcUnknown)) {
|
|
189
|
-
return svcUnknown.getPreviewUrl(id);
|
|
190
|
-
}
|
|
191
|
-
return '';
|
|
192
|
-
}
|
|
193
|
-
// Input handler to avoid $any casts in template
|
|
194
|
-
onGallerySearchInput(event) {
|
|
195
|
-
const target = event.target;
|
|
196
|
-
this.searchTerm.set(target?.value ?? '');
|
|
197
|
-
}
|
|
198
|
-
// Read enabled selections from form values
|
|
199
|
-
enabledLayoutSelections() {
|
|
200
|
-
const layout = this.themeForm.get('sytm_layout');
|
|
201
|
-
if (!layout)
|
|
202
|
-
return [];
|
|
203
|
-
const selections = [];
|
|
204
|
-
const getBool = (path) => Boolean(this.themeForm.get(path)?.value);
|
|
205
|
-
if (getBool('sytm_layout.sytm_layout_sidebar.status'))
|
|
206
|
-
selections.push('sidebar');
|
|
207
|
-
if (getBool('sytm_layout.sytm_layout_header.status'))
|
|
208
|
-
selections.push('header');
|
|
209
|
-
if (getBool('sytm_layout.sytm_layout_footer.status'))
|
|
210
|
-
selections.push('footer');
|
|
211
|
-
if (getBool('sytm_layout.sytm_layout_breadcrumb.status'))
|
|
212
|
-
selections.push('breadcrumb');
|
|
213
|
-
if (getBool('sytm_layout.sytm_layout_console.status'))
|
|
214
|
-
selections.push('console');
|
|
215
|
-
if (getBool('sytm_layout.sytm_layout_request.status'))
|
|
216
|
-
selections.push('request');
|
|
217
|
-
return selections;
|
|
218
|
-
}
|
|
219
|
-
// Update form booleans from multi-select change
|
|
220
|
-
onEnabledLayoutChange(values) {
|
|
221
|
-
const setBool = (path, val) => this.themeForm.get(path)?.setValue(val);
|
|
222
|
-
const selected = new Set(values);
|
|
223
|
-
setBool('sytm_layout.sytm_layout_sidebar.status', selected.has('sidebar'));
|
|
224
|
-
setBool('sytm_layout.sytm_layout_header.status', selected.has('header'));
|
|
225
|
-
setBool('sytm_layout.sytm_layout_footer.status', selected.has('footer'));
|
|
226
|
-
setBool('sytm_layout.sytm_layout_breadcrumb.status', selected.has('breadcrumb'));
|
|
227
|
-
setBool('sytm_layout.sytm_layout_console.status', selected.has('console'));
|
|
228
|
-
setBool('sytm_layout.sytm_layout_request.status', selected.has('request'));
|
|
229
|
-
}
|
|
230
|
-
ngOnInit() {
|
|
231
|
-
this.initializeComponent();
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Initialize component
|
|
235
|
-
*/
|
|
236
|
-
initializeComponent() {
|
|
237
|
-
// Get page information from route
|
|
238
|
-
this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
|
|
239
|
-
console.log('🔍 Query params:', params);
|
|
240
|
-
const queryParams = params['query'];
|
|
241
|
-
const queryData = generateObjectFromString(queryParams);
|
|
242
|
-
this.pageId.set(queryData?.sypg_id || '');
|
|
243
|
-
this.pageTitle.set(queryData?.sypg_title || '');
|
|
244
|
-
if (this.pageId()) {
|
|
245
|
-
this.loadThemes();
|
|
246
|
-
this.setupFormSubscriptions();
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
this.error.set('No page ID provided');
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Load themes from API
|
|
255
|
-
*/
|
|
256
|
-
loadThemes() {
|
|
257
|
-
this.loading.set(true);
|
|
258
|
-
this.error.set(null);
|
|
259
|
-
const request = {
|
|
260
|
-
sytm_page_id_sypg: this.pageId()
|
|
261
|
-
};
|
|
262
|
-
this.themeService.getThemeList(request)
|
|
263
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
264
|
-
.subscribe({
|
|
265
|
-
next: (response) => {
|
|
266
|
-
if (response.success) {
|
|
267
|
-
this.themes.set(response.data || []);
|
|
268
|
-
this.totalItems.set(response.total || 0);
|
|
269
|
-
this.updateGridData();
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
this.error.set(response.message || 'Failed to load themes');
|
|
273
|
-
}
|
|
274
|
-
this.loading.set(false);
|
|
275
|
-
},
|
|
276
|
-
error: (error) => {
|
|
277
|
-
console.error('Error loading themes:', error);
|
|
278
|
-
this.error.set('Failed to load themes. Please try again.');
|
|
279
|
-
this.loading.set(false);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Setup form subscriptions
|
|
285
|
-
*/
|
|
286
|
-
setupFormSubscriptions() {
|
|
287
|
-
// Watch for form changes to enable/disable save button
|
|
288
|
-
this.themeForm.valueChanges
|
|
289
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
290
|
-
.subscribe(() => {
|
|
291
|
-
// Form validation is handled by computed signals
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Update grid data
|
|
296
|
-
*/
|
|
297
|
-
updateGridData() {
|
|
298
|
-
this.gridConfig.update(config => ({
|
|
299
|
-
...config,
|
|
300
|
-
data: this.themes()
|
|
301
|
-
}));
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Get custom renderers for grid
|
|
305
|
-
*/
|
|
306
|
-
/**
|
|
307
|
-
* Get template renderers for grid
|
|
308
|
-
*/
|
|
309
|
-
getTemplateRenderers() {
|
|
310
|
-
return {
|
|
311
|
-
themeDetailsRenderer: this.themeDetailsRendererTemplate(),
|
|
312
|
-
themeStatusRenderer: this.themeStatusRendererTemplate(),
|
|
313
|
-
actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Handle grid events
|
|
318
|
-
*/
|
|
319
|
-
onGridEvent(event) {
|
|
320
|
-
switch (event.type) {
|
|
321
|
-
case 'pageChange':
|
|
322
|
-
if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
|
|
323
|
-
this.currentPage.set(event.data['pageIndex']);
|
|
324
|
-
this.pageSize.set(event.data['pageSize']);
|
|
325
|
-
this.loadThemes();
|
|
326
|
-
}
|
|
327
|
-
break;
|
|
328
|
-
case 'search':
|
|
329
|
-
if (event.data && typeof event.data === 'string') {
|
|
330
|
-
this.searchTerm.set(event.data);
|
|
331
|
-
this.currentPage.set(1);
|
|
332
|
-
this.loadThemes();
|
|
333
|
-
}
|
|
334
|
-
break;
|
|
335
|
-
case 'refresh':
|
|
336
|
-
this.loadThemes();
|
|
337
|
-
break;
|
|
338
|
-
case 'action':
|
|
339
|
-
// Handle action events if needed
|
|
340
|
-
console.log('Action event:', event);
|
|
341
|
-
break;
|
|
342
|
-
case 'rowClick':
|
|
343
|
-
// Handle row click events if needed
|
|
344
|
-
console.log('Row click event:', event);
|
|
345
|
-
break;
|
|
346
|
-
case 'sort':
|
|
347
|
-
// Handle sort events if needed
|
|
348
|
-
console.log('Sort event:', event);
|
|
349
|
-
break;
|
|
350
|
-
case 'export':
|
|
351
|
-
// Handle export events if needed
|
|
352
|
-
console.log('Export event:', event);
|
|
353
|
-
break;
|
|
354
|
-
case 'rowReorder':
|
|
355
|
-
// Handle row reorder events if needed
|
|
356
|
-
console.log('Row reorder event:', event);
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Create new theme
|
|
362
|
-
*/
|
|
363
|
-
createTheme() {
|
|
364
|
-
if (!this.themeForm.valid) {
|
|
365
|
-
this.markFormAsTouched();
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
const formValue = this.themeForm.getRawValue();
|
|
369
|
-
const newTheme = {
|
|
370
|
-
sytm_title: formValue.sytm_title,
|
|
371
|
-
sytm_desc: formValue.sytm_desc,
|
|
372
|
-
sytm_theme_code: formValue.sytm_theme_code,
|
|
373
|
-
sytm_preview_id_fm: formValue.sytm_preview_id_fm,
|
|
374
|
-
sytm_page_id_sypg: this.pageId(),
|
|
375
|
-
sytm_configuration: JSON.parse(formValue.sytm_configuration),
|
|
376
|
-
sytm_sub_title: formValue.sytm_sub_title,
|
|
377
|
-
sytm_entity_id_syen: formValue.sytm_entity_id_syen || this.appState.getActiveEntityId(),
|
|
378
|
-
sytm_isselected: Boolean(formValue.sytm_isselected),
|
|
379
|
-
sytm_layout: {
|
|
380
|
-
sytm_layout_sidebar: { status: Boolean(formValue.sytm_layout.sytm_layout_sidebar.status) },
|
|
381
|
-
sytm_layout_header: { status: Boolean(formValue.sytm_layout.sytm_layout_header.status) },
|
|
382
|
-
sytm_layout_footer: { status: Boolean(formValue.sytm_layout.sytm_layout_footer.status) },
|
|
383
|
-
sytm_layout_breadcrumb: { status: Boolean(formValue.sytm_layout.sytm_layout_breadcrumb.status) },
|
|
384
|
-
sytm_layout_console: { status: Boolean(formValue.sytm_layout.sytm_layout_console.status) },
|
|
385
|
-
sytm_layout_request: { status: Boolean(formValue.sytm_layout.sytm_layout_request.status) },
|
|
386
|
-
sytm_layout_drawer: formValue.sytm_layout.sytm_layout_drawer
|
|
387
|
-
},
|
|
388
|
-
sytm_isactive: formValue.sytm_isactive
|
|
389
|
-
};
|
|
390
|
-
this.loading.set(true);
|
|
391
|
-
this.themeService.createTheme(newTheme)
|
|
392
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
393
|
-
.subscribe({
|
|
394
|
-
next: (response) => {
|
|
395
|
-
if (response.success) {
|
|
396
|
-
this.resetForm();
|
|
397
|
-
this.loadThemes();
|
|
398
|
-
console.log('✅ Theme created successfully');
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
console.error('❌ Failed to create theme:', response.message);
|
|
402
|
-
}
|
|
403
|
-
this.loading.set(false);
|
|
404
|
-
},
|
|
405
|
-
error: (error) => {
|
|
406
|
-
console.error('Error creating theme:', error);
|
|
407
|
-
console.error('❌ Failed to create theme. Please try again.');
|
|
408
|
-
this.loading.set(false);
|
|
409
|
-
}
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Update existing theme
|
|
414
|
-
*/
|
|
415
|
-
updateTheme() {
|
|
416
|
-
if (!this.themeForm.valid || !this.editingThemeId()) {
|
|
417
|
-
this.markFormAsTouched();
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
const formValue = this.themeForm.getRawValue();
|
|
421
|
-
const updatedTheme = {
|
|
422
|
-
_id: this.editingThemeId() || '',
|
|
423
|
-
sytm_title: formValue.sytm_title,
|
|
424
|
-
sytm_desc: formValue.sytm_desc,
|
|
425
|
-
sytm_theme_code: formValue.sytm_theme_code,
|
|
426
|
-
sytm_preview_id_fm: formValue.sytm_preview_id_fm,
|
|
427
|
-
sytm_page_id_sypg: this.pageId(),
|
|
428
|
-
sytm_configuration: JSON.parse(formValue.sytm_configuration),
|
|
429
|
-
sytm_sub_title: formValue.sytm_sub_title,
|
|
430
|
-
sytm_entity_id_syen: formValue.sytm_entity_id_syen || this.appState.getActiveEntityId(),
|
|
431
|
-
sytm_isselected: Boolean(formValue.sytm_isselected),
|
|
432
|
-
sytm_layout: {
|
|
433
|
-
sytm_layout_sidebar: { status: Boolean(formValue.sytm_layout.sytm_layout_sidebar.status) },
|
|
434
|
-
sytm_layout_header: { status: Boolean(formValue.sytm_layout.sytm_layout_header.status) },
|
|
435
|
-
sytm_layout_footer: { status: Boolean(formValue.sytm_layout.sytm_layout_footer.status) },
|
|
436
|
-
sytm_layout_breadcrumb: { status: Boolean(formValue.sytm_layout.sytm_layout_breadcrumb.status) },
|
|
437
|
-
sytm_layout_console: { status: Boolean(formValue.sytm_layout.sytm_layout_console.status) },
|
|
438
|
-
sytm_layout_request: { status: Boolean(formValue.sytm_layout.sytm_layout_request.status) },
|
|
439
|
-
sytm_layout_drawer: formValue.sytm_layout.sytm_layout_drawer
|
|
440
|
-
},
|
|
441
|
-
sytm_isactive: formValue.sytm_isactive
|
|
442
|
-
};
|
|
443
|
-
this.loading.set(true);
|
|
444
|
-
this.themeService.updateTheme(updatedTheme)
|
|
445
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
446
|
-
.subscribe({
|
|
447
|
-
next: (response) => {
|
|
448
|
-
if (response.success) {
|
|
449
|
-
this.resetForm();
|
|
450
|
-
this.loadThemes();
|
|
451
|
-
console.log('✅ Theme updated successfully');
|
|
452
|
-
}
|
|
453
|
-
else {
|
|
454
|
-
console.error('❌ Failed to update theme:', response.message);
|
|
455
|
-
}
|
|
456
|
-
this.loading.set(false);
|
|
457
|
-
},
|
|
458
|
-
error: (error) => {
|
|
459
|
-
console.error('Error updating theme:', error);
|
|
460
|
-
console.error('❌ Failed to update theme. Please try again.');
|
|
461
|
-
this.loading.set(false);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Edit theme
|
|
467
|
-
*/
|
|
468
|
-
editTheme(theme) {
|
|
469
|
-
this.isEditMode.set(true);
|
|
470
|
-
this.editingThemeId.set(theme._id || null);
|
|
471
|
-
this.retrievedTheme.set(theme);
|
|
472
|
-
this.themeForm.patchValue({
|
|
473
|
-
sytm_title: theme.sytm_title || '',
|
|
474
|
-
sytm_desc: theme.sytm_desc || '',
|
|
475
|
-
sytm_theme_code: theme.sytm_theme_code || '',
|
|
476
|
-
sytm_preview_id_fm: theme.sytm_preview_id_fm || '',
|
|
477
|
-
sytm_sub_title: theme.sytm_sub_title || '',
|
|
478
|
-
sytm_configuration: JSON.stringify(theme.sytm_configuration || {}, null, 2),
|
|
479
|
-
sytm_entity_id_syen: theme.sytm_entity_id_syen || this.appState.getActiveEntityId(),
|
|
480
|
-
sytm_isselected: theme.sytm_isselected ?? false,
|
|
481
|
-
sytm_layout: {
|
|
482
|
-
sytm_layout_sidebar: { status: theme.sytm_layout?.sytm_layout_sidebar?.status ?? true },
|
|
483
|
-
sytm_layout_header: { status: theme.sytm_layout?.sytm_layout_header?.status ?? true },
|
|
484
|
-
sytm_layout_footer: { status: theme.sytm_layout?.sytm_layout_footer?.status ?? false },
|
|
485
|
-
sytm_layout_breadcrumb: { status: theme.sytm_layout?.sytm_layout_breadcrumb?.status ?? true },
|
|
486
|
-
sytm_layout_console: { status: theme.sytm_layout?.sytm_layout_console?.status ?? false },
|
|
487
|
-
sytm_layout_request: { status: theme.sytm_layout?.sytm_layout_request?.status ?? false },
|
|
488
|
-
sytm_layout_drawer: theme.sytm_layout?.sytm_layout_drawer || []
|
|
489
|
-
},
|
|
490
|
-
sytm_isactive: theme.sytm_isactive ?? true
|
|
491
|
-
});
|
|
492
|
-
// Rebuild drawer array controls from data
|
|
493
|
-
while (this.drawerArray.length) {
|
|
494
|
-
this.drawerArray.removeAt(0);
|
|
495
|
-
}
|
|
496
|
-
(theme.sytm_layout?.sytm_layout_drawer || []).forEach(d => {
|
|
497
|
-
this.drawerArray.push(this.createDrawerGroup({
|
|
498
|
-
syth_status: d?.syth_status ?? true,
|
|
499
|
-
syth_config_syco_for: d?.syth_config_syco_for ?? 'drawer_notes'
|
|
500
|
-
}));
|
|
501
|
-
});
|
|
502
|
-
this.themeForm.markAsPristine();
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Delete theme
|
|
506
|
-
*/
|
|
507
|
-
deleteTheme(theme) {
|
|
508
|
-
if (confirm(`Are you sure you want to delete the theme "${theme.sytm_title}"?`)) {
|
|
509
|
-
this.loading.set(true);
|
|
510
|
-
this.themeService.deleteTheme(theme._id || '')
|
|
511
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
512
|
-
.subscribe({
|
|
513
|
-
next: (response) => {
|
|
514
|
-
if (response.success) {
|
|
515
|
-
this.loadThemes();
|
|
516
|
-
console.log('✅ Theme deleted successfully');
|
|
517
|
-
}
|
|
518
|
-
else {
|
|
519
|
-
console.error('❌ Failed to delete theme:', response.message);
|
|
520
|
-
}
|
|
521
|
-
this.loading.set(false);
|
|
522
|
-
},
|
|
523
|
-
error: (error) => {
|
|
524
|
-
console.error('Error deleting theme:', error);
|
|
525
|
-
console.error('❌ Failed to delete theme. Please try again.');
|
|
526
|
-
this.loading.set(false);
|
|
527
|
-
}
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* Toggle theme status
|
|
533
|
-
*/
|
|
534
|
-
toggleThemeStatus(theme) {
|
|
535
|
-
this.loading.set(true);
|
|
536
|
-
this.themeService.toggleThemeStatus({ sytm_id: theme._id || '', sytm_isactive: !theme.sytm_isactive })
|
|
537
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
538
|
-
.subscribe({
|
|
539
|
-
next: (response) => {
|
|
540
|
-
if (response.success) {
|
|
541
|
-
this.loadThemes();
|
|
542
|
-
console.log(`✅ Theme ${theme.sytm_isactive ? 'deactivated' : 'activated'} successfully`);
|
|
543
|
-
}
|
|
544
|
-
else {
|
|
545
|
-
console.error('❌ Failed to toggle theme status:', response.message);
|
|
546
|
-
}
|
|
547
|
-
this.loading.set(false);
|
|
548
|
-
},
|
|
549
|
-
error: (error) => {
|
|
550
|
-
console.error('Error toggling theme status:', error);
|
|
551
|
-
console.error('❌ Failed to toggle theme status. Please try again.');
|
|
552
|
-
this.loading.set(false);
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* Save theme (create or update)
|
|
558
|
-
*/
|
|
559
|
-
saveTheme() {
|
|
560
|
-
if (this.isEditMode()) {
|
|
561
|
-
this.updateTheme();
|
|
562
|
-
}
|
|
563
|
-
else {
|
|
564
|
-
this.createTheme();
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Cancel form
|
|
569
|
-
*/
|
|
570
|
-
cancelForm() {
|
|
571
|
-
this.resetForm();
|
|
572
|
-
}
|
|
573
|
-
/**
|
|
574
|
-
* Go back to page list
|
|
575
|
-
*/
|
|
576
|
-
goBack() {
|
|
577
|
-
this.router.navigate(['/core/page']);
|
|
578
|
-
}
|
|
579
|
-
/**
|
|
580
|
-
* Reset form
|
|
581
|
-
*/
|
|
582
|
-
resetForm() {
|
|
583
|
-
this.themeForm.reset({
|
|
584
|
-
sytm_title: '',
|
|
585
|
-
sytm_desc: '',
|
|
586
|
-
sytm_theme_code: '',
|
|
587
|
-
sytm_preview_id_fm: '',
|
|
588
|
-
sytm_sub_title: '',
|
|
589
|
-
sytm_configuration: '{}',
|
|
590
|
-
sytm_entity_id_syen: '',
|
|
591
|
-
sytm_isselected: false,
|
|
592
|
-
sytm_layout: {
|
|
593
|
-
sytm_layout_sidebar: { status: true },
|
|
594
|
-
sytm_layout_header: { status: true },
|
|
595
|
-
sytm_layout_footer: { status: false },
|
|
596
|
-
sytm_layout_breadcrumb: { status: true },
|
|
597
|
-
sytm_layout_console: { status: false },
|
|
598
|
-
sytm_layout_request: { status: false },
|
|
599
|
-
sytm_layout_drawer: []
|
|
600
|
-
},
|
|
601
|
-
sytm_isactive: true
|
|
602
|
-
});
|
|
603
|
-
// Explicitly clear the FormArray for drawers
|
|
604
|
-
while (this.drawerArray.length) {
|
|
605
|
-
this.drawerArray.removeAt(0);
|
|
606
|
-
}
|
|
607
|
-
this.isEditMode.set(false);
|
|
608
|
-
this.editingThemeId.set(null);
|
|
609
|
-
this.retrievedTheme.set(null);
|
|
610
|
-
this.themeForm.markAsPristine();
|
|
611
|
-
this.themeForm.markAsUntouched();
|
|
612
|
-
}
|
|
613
|
-
/**
|
|
614
|
-
* Mark form as touched to trigger validation display
|
|
615
|
-
*/
|
|
616
|
-
markFormAsTouched() {
|
|
617
|
-
Object.keys(this.themeForm.controls).forEach(key => {
|
|
618
|
-
const control = this.themeForm.get(key);
|
|
619
|
-
control?.markAsTouched();
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* Get dropdown items for actions
|
|
624
|
-
*/
|
|
625
|
-
getActionDropdownItems(theme) {
|
|
626
|
-
return [
|
|
627
|
-
{
|
|
628
|
-
id: 'edit',
|
|
629
|
-
label: 'Edit',
|
|
630
|
-
icon: 'edit',
|
|
631
|
-
disabled: false
|
|
632
|
-
},
|
|
633
|
-
{
|
|
634
|
-
id: 'toggle',
|
|
635
|
-
label: theme.sytm_isactive ? 'Deactivate' : 'Activate',
|
|
636
|
-
icon: theme.sytm_isactive ? 'block' : 'check_circle',
|
|
637
|
-
disabled: false
|
|
638
|
-
},
|
|
639
|
-
{
|
|
640
|
-
id: 'delete',
|
|
641
|
-
label: 'Delete',
|
|
642
|
-
icon: 'delete',
|
|
643
|
-
disabled: false
|
|
644
|
-
}
|
|
645
|
-
];
|
|
646
|
-
}
|
|
647
|
-
/**
|
|
648
|
-
* Handle dropdown item click
|
|
649
|
-
* This method handles clicks on dropdown menu items in the actions column
|
|
650
|
-
*/
|
|
651
|
-
onDropdownItemClick(item, row) {
|
|
652
|
-
console.log('🔵 onDropdownItemClick called with:', item, row);
|
|
653
|
-
switch (item.id) {
|
|
654
|
-
case 'edit':
|
|
655
|
-
console.log('🔵 Calling editTheme with:', row);
|
|
656
|
-
this.editTheme(row);
|
|
657
|
-
break;
|
|
658
|
-
case 'toggle':
|
|
659
|
-
console.log('🔵 Calling toggleThemeStatus with:', row);
|
|
660
|
-
this.toggleThemeStatus(row);
|
|
661
|
-
break;
|
|
662
|
-
case 'delete':
|
|
663
|
-
console.log('🔵 Calling deleteTheme with:', row);
|
|
664
|
-
this.deleteTheme(row);
|
|
665
|
-
break;
|
|
666
|
-
default:
|
|
667
|
-
console.log('🔵 Unknown action:', item.id);
|
|
668
|
-
}
|
|
669
|
-
// Close all dropdowns after action
|
|
670
|
-
this.closeAllDropdowns();
|
|
671
|
-
}
|
|
672
|
-
/**
|
|
673
|
-
* Close all dropdowns
|
|
674
|
-
*/
|
|
675
|
-
closeAllDropdowns() {
|
|
676
|
-
// Close all dropdowns by clicking outside
|
|
677
|
-
const event = new MouseEvent('click', { bubbles: true });
|
|
678
|
-
document.dispatchEvent(event);
|
|
679
|
-
}
|
|
680
|
-
get drawerArray() {
|
|
681
|
-
return this.themeForm.get('sytm_layout.sytm_layout_drawer');
|
|
682
|
-
}
|
|
683
|
-
createDrawerGroup(drawer) {
|
|
684
|
-
return this.fb.group({
|
|
685
|
-
syth_status: [drawer?.syth_status ?? true],
|
|
686
|
-
syth_config_syco_for: [drawer?.syth_config_syco_for ?? 'drawer_notes']
|
|
687
|
-
});
|
|
688
|
-
}
|
|
689
|
-
addDrawer() {
|
|
690
|
-
this.drawerArray.push(this.createDrawerGroup());
|
|
691
|
-
this.themeForm.markAsDirty();
|
|
692
|
-
}
|
|
693
|
-
removeDrawer(index) {
|
|
694
|
-
if (index >= 0 && index < this.drawerArray.length) {
|
|
695
|
-
this.drawerArray.removeAt(index);
|
|
696
|
-
this.themeForm.markAsDirty();
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
/**
|
|
700
|
-
* Set selected theme (only one can be selected per page)
|
|
701
|
-
*/
|
|
702
|
-
setSelectedTheme(theme) {
|
|
703
|
-
if (!theme || theme.sytm_isselected)
|
|
704
|
-
return; // already selected
|
|
705
|
-
const previouslySelected = this.themes().find(t => t.sytm_isselected && t._id !== theme._id);
|
|
706
|
-
// Disable previous selection (best-effort)
|
|
707
|
-
if (previouslySelected) {
|
|
708
|
-
const disablePayload = {
|
|
709
|
-
_id: previouslySelected._id || '',
|
|
710
|
-
sytm_title: previouslySelected.sytm_title || '',
|
|
711
|
-
sytm_desc: previouslySelected.sytm_desc || '',
|
|
712
|
-
sytm_theme_code: previouslySelected.sytm_theme_code || '',
|
|
713
|
-
sytm_preview_id_fm: previouslySelected.sytm_preview_id_fm || '',
|
|
714
|
-
sytm_page_id_sypg: this.pageId(),
|
|
715
|
-
sytm_configuration: previouslySelected.sytm_configuration || {},
|
|
716
|
-
sytm_sub_title: previouslySelected.sytm_sub_title || '',
|
|
717
|
-
sytm_entity_id_syen: previouslySelected.sytm_entity_id_syen || this.appState.getActiveEntityId(),
|
|
718
|
-
sytm_isselected: false,
|
|
719
|
-
sytm_layout: previouslySelected.sytm_layout,
|
|
720
|
-
sytm_isactive: previouslySelected.sytm_isactive ?? true
|
|
721
|
-
};
|
|
722
|
-
this.themeService.updateTheme(disablePayload).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ next: () => { }, error: () => { } });
|
|
723
|
-
}
|
|
724
|
-
// Enable current selection
|
|
725
|
-
const enablePayload = {
|
|
726
|
-
_id: theme._id || '',
|
|
727
|
-
sytm_title: theme.sytm_title || '',
|
|
728
|
-
sytm_desc: theme.sytm_desc || '',
|
|
729
|
-
sytm_theme_code: theme.sytm_theme_code || '',
|
|
730
|
-
sytm_preview_id_fm: theme.sytm_preview_id_fm || '',
|
|
731
|
-
sytm_page_id_sypg: this.pageId(),
|
|
732
|
-
sytm_configuration: theme.sytm_configuration || {},
|
|
733
|
-
sytm_sub_title: theme.sytm_sub_title || '',
|
|
734
|
-
sytm_entity_id_syen: theme.sytm_entity_id_syen || this.appState.getActiveEntityId(),
|
|
735
|
-
sytm_isselected: true,
|
|
736
|
-
sytm_layout: theme.sytm_layout,
|
|
737
|
-
sytm_isactive: theme.sytm_isactive ?? true
|
|
738
|
-
};
|
|
739
|
-
this.loading.set(true);
|
|
740
|
-
this.themeService.updateTheme(enablePayload)
|
|
741
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
742
|
-
.subscribe({
|
|
743
|
-
next: () => { this.loadThemes(); this.loading.set(false); },
|
|
744
|
-
error: () => { this.loading.set(false); }
|
|
745
|
-
});
|
|
746
|
-
}
|
|
747
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageThemeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
748
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: PageThemeComponent, isStandalone: true, selector: "cide-core-app-page-theme", viewQueries: [{ propertyName: "themeDetailsRendererTemplate", first: true, predicate: ["themeDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "themeStatusRendererTemplate", first: true, predicate: ["themeStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Page Theme Container -->\r\n<div class=\"tw-flex tw-h-full tw-w-full\">\r\n \r\n <!-- Left: Form and header (60%) -->\r\n <div class=\"tw-w-full lg:tw-w-3/5 tw-flex tw-flex-col tw-border-r tw-border-gray-200\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title and Back Button -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"goBack()\" class=\"tw-text-gray-600 hover:tw-text-gray-900\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_back</cide-ele-icon>\r\n </button>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">palette</cide-ele-icon>\r\n <div>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Theme Management</h5>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-m-0\">Page: {{ pageTitle() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Quick Add/Edit Form Section -->\r\n <div class=\"tw-px-6 tw-py-4 tw-bg-white tw-overflow-auto\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\r\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Theme' : 'Quick Add Theme' }}</h6>\r\n </div>\r\n </div>\r\n\r\n <!-- Form (kept as-is) -->\r\n <form [formGroup]=\"themeForm\" (ngSubmit)=\"saveTheme()\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\">\r\n <!-- Theme Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_title\" formControlName=\"sytm_title\" placeholder=\"Enter theme title\" label=\"Theme Title*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Theme Code -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_theme_code\" formControlName=\"sytm_theme_code\" placeholder=\"Enter theme code\" label=\"Theme Code*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Status -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input\r\n id=\"sytm_isactive_cb\"\r\n type=\"checkbox\"\r\n label=\"Active\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isactive\">\r\n </cide-ele-input>\r\n </div>\r\n <!-- Sub Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_sub_title\" formControlName=\"sytm_sub_title\" placeholder=\"Enter sub title\" label=\"Sub Title\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Preview ID -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_preview_id_fm\" formControlName=\"sytm_preview_id_fm\" placeholder=\"Enter preview image ID\" label=\"Preview Image ID\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Description -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\r\n <cide-ele-textarea id=\"sytm_desc\" formControlName=\"sytm_desc\" placeholder=\"Enter theme description\" rows=\"2\" label=\"Description\" size=\"sm\"></cide-ele-textarea>\r\n </div>\r\n <!-- Configuration JSON -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <cide-ele-json-editor label=\"Configuration JSON\" formControlName=\"sytm_configuration\" [required]=\"true\" [config]=\"{\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n minHeight: 150,\r\n maxHeight: 300,\r\n placeholder: 'Enter theme configuration JSON...'\r\n }\" helperText=\"Enter valid JSON configuration for the theme\"></cide-ele-json-editor>\r\n </div>\r\n <!-- Layout Configuration + Selection: right-side checkbox list -->\r\n <div class=\"lg:tw-col-span-1 tw-space-y-2\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Layout & Selection</div>\r\n <!-- Selected toggle -->\r\n <div class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-px-3 tw-py-2\">\r\n <cide-ele-input\r\n id=\"sytm_isselected\"\r\n type=\"checkbox\"\r\n label=\"Selected (Default)\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isselected\">\r\n </cide-ele-input>\r\n </div>\r\n <div formGroupName=\"sytm_layout\" class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-divide-y tw-overflow-hidden\">\r\n <!-- Sidebar -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_sidebar\">\r\n <cide-ele-input id=\"layout_sidebar_status\" type=\"checkbox\" label=\"Sidebar\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Header -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_header\">\r\n <cide-ele-input id=\"layout_header_status\" type=\"checkbox\" label=\"Header\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Footer -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_footer\">\r\n <cide-ele-input id=\"layout_footer_status\" type=\"checkbox\" label=\"Footer\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Breadcrumb -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_breadcrumb\">\r\n <cide-ele-input id=\"layout_breadcrumb_status\" type=\"checkbox\" label=\"Breadcrumb\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Console -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_console\">\r\n <cide-ele-input id=\"layout_console_status\" type=\"checkbox\" label=\"Console\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Request -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_request\">\r\n <cide-ele-input id=\"layout_request_status\" type=\"checkbox\" label=\"Request\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-pt-1\">Toggle active sections. Only one theme can be selected as default. More options can be added here later.</p>\r\n </div>\r\n <!-- Drawer Configuration -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Drawers</div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"outline\" (click)=\"addDrawer()\">\r\n Add Drawer\r\n </button>\r\n </div>\r\n\r\n <div formGroupName=\"sytm_layout\">\r\n <div class=\"tw-space-y-2\" formArrayName=\"sytm_layout_drawer\">\r\n <div *ngFor=\"let drawerGrp of drawerArray.controls; let i = index\" [formGroupName]=\"i\" class=\"tw-border tw-border-gray-200 tw-rounded-md tw-p-3 tw-flex tw-items-center tw-gap-3\">\r\n <cide-ele-input id=\"drawer_active_{{i}}\" type=\"checkbox\" label=\"Active\" size=\"sm\" formControlName=\"syth_status\"></cide-ele-input>\r\n <div class=\"tw-flex-1\">\r\n <cide-ele-select\r\n id=\"drawer_config_{{i}}\"\r\n label=\"Drawer For\"\r\n size=\"sm\"\r\n [options]=\"drawerConfigOptions\"\r\n formControlName=\"syth_config_syco_for\">\r\n </cide-ele-select>\r\n </div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"ghost\" (click)=\"removeDrawer(i)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Configure multiple drawers as needed.</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-flex tw-flex-col tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-end tw-space-x-3\">\r\n <button cideEleButton type=\"button\" variant=\"outline\" (click)=\"cancelForm()\" [disabled]=\"loading()\">Cancel</button>\r\n <button cideEleButton type=\"submit\" variant=\"primary\" leftIcon=\"add\" [disabled]=\"!themeForm.valid || loading()\" [loading]=\"loading()\">\r\n {{ isEditMode() ? 'Update Theme' : 'Create Theme' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Right: Theme gallery (40%) -->\r\n <div class=\"tw-hidden lg:tw-flex tw-w-2/5 tw-flex-col\">\r\n <!-- (Header consolidated above) -->\r\n\r\n <!-- Gallery list -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-bg-gray-50\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-p-4\">\r\n @for (theme of filteredThemes(); track theme._id) {\r\n <div class=\"tw-rounded-md tw-transition tw-cursor-pointer tw-relative\"\r\n [ngClass]=\"theme.sytm_isselected\r\n ? 'tw-border tw-border-blue-500 tw-ring-2 tw-ring-blue-200 tw-bg-blue-50/50'\r\n : 'tw-bg-white tw-border tw-border-gray-200 hover:tw-shadow-sm'\"\r\n (click)=\"editTheme(theme)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-selected]=\"theme.sytm_isselected ? 'true' : 'false'\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\"\r\n (keydown.enter)=\"editTheme(theme)\"\r\n (keydown.space)=\"$event.preventDefault(); editTheme(theme)\">\r\n\r\n <!-- Selected badge -->\r\n <div *ngIf=\"theme.sytm_isselected\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-600 tw-text-white\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">check</cide-ele-icon>\r\n </div>\r\n \r\n <div class=\"tw-aspect-[16/9] tw-bg-gray-100 tw-rounded-t-md tw-overflow-hidden tw-flex tw-items-center tw-justify-center\">\r\n @if (getPreviewUrl(theme)) {\r\n <img [src]=\"getPreviewUrl(theme)\" class=\"tw-w-full tw-h-full tw-object-cover\" alt=\"Preview\" />\r\n } @else {\r\n <div class=\"tw-text-gray-400 tw-text-xs\">No preview</div>\r\n }\r\n </div>\r\n <div class=\"tw-p-3 tw-space-y-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" [title]=\"theme.sytm_title\">{{ theme.sytm_title || 'Untitled Theme' }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" [title]=\"theme.sytm_theme_code\">{{ theme.sytm_theme_code }}</div>\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-pt-1\">\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-text-xs\" [ngClass]=\"theme.sytm_isactive ? 'tw-text-green-700' : 'tw-text-red-700'\">\r\n <span class=\"tw-w-1.5 tw-h-1.5 tw-rounded-full\" [ngClass]=\"theme.sytm_isactive ? 'tw-bg-green-500' : 'tw-bg-red-500'\"></span>\r\n {{ theme.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <!-- Set Selected Button - Clear and Simple -->\r\n @if (theme.sytm_isselected) {\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-rounded-md tw-text-xs tw-font-medium\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3\">check</cide-ele-icon>\r\n Selected\r\n </span>\r\n } @else {\r\n <button cideEleButton \r\n variant=\"outline\" \r\n size=\"xs\"\r\n (click)=\"$event.stopPropagation(); setSelectedTheme(theme)\"\r\n [attr.aria-label]=\"'Select ' + (theme.sytm_title || theme.sytm_theme_code) + ' theme'\"\r\n class=\"tw-text-xs\">\r\n Select\r\n </button>\r\n }\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); editTheme(theme)\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">edit</cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); deleteTheme(theme)\"\r\n [attr.aria-label]=\"'Delete theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!loading() && filteredThemes().length === 0) {\r\n <div class=\"tw-col-span-full tw-text-center tw-text-xs tw-text-gray-500 tw-py-8\">No themes found</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Template References for Grid Renderers (Best Practice)\r\n \r\n These ng-template elements represent the Angular best practice for custom rendering.\r\n They provide:\r\n - Type safety with template context\r\n - Component lifecycle integration\r\n - Change detection optimization\r\n - Proper event handling\r\n - Accessibility features\r\n \r\n Note: Current data grid uses string renderers for compatibility.\r\n Templates are maintained for future component enhancement.\r\n-->\r\n\r\n<!-- Theme Details Renderer Template -->\r\n<ng-template #themeDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Theme Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon \r\n class=\"tw-text-purple-600\" \r\n size=\"xs\">\r\n palette\r\n </cide-ele-icon>\r\n </div>\r\n \r\n <!-- Theme Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sytm_title\">\r\n {{ row.sytm_title || 'Untitled' }}\r\n </div>\r\n @if (row.sytm_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sytm_desc\">\r\n {{ row.sytm_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Theme Status Renderer Template -->\r\n<ng-template #themeStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sytm_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideEleJsonEditorComponent, selector: "cide-ele-json-editor", inputs: ["label", "helperText", "required", "disabled", "showCharacterCount", "config"], outputs: ["valueChange", "objectChange", "errorsChange", "validChange"] }] }); }
|
|
749
|
-
}
|
|
750
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageThemeComponent, decorators: [{
|
|
751
|
-
type: Component,
|
|
752
|
-
args: [{ selector: 'cide-core-app-page-theme', standalone: true, imports: [
|
|
753
|
-
CommonModule,
|
|
754
|
-
ReactiveFormsModule,
|
|
755
|
-
FormsModule,
|
|
756
|
-
CideEleDataGridComponent,
|
|
757
|
-
CideEleButtonComponent,
|
|
758
|
-
CideInputComponent,
|
|
759
|
-
CideSelectComponent,
|
|
760
|
-
CideTextareaComponent,
|
|
761
|
-
CideIconComponent,
|
|
762
|
-
CideEleDropdownComponent,
|
|
763
|
-
CideEleJsonEditorComponent,
|
|
764
|
-
CideSelectOptionComponent
|
|
765
|
-
], template: "<!-- Page Theme Container -->\r\n<div class=\"tw-flex tw-h-full tw-w-full\">\r\n \r\n <!-- Left: Form and header (60%) -->\r\n <div class=\"tw-w-full lg:tw-w-3/5 tw-flex tw-flex-col tw-border-r tw-border-gray-200\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title and Back Button -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"goBack()\" class=\"tw-text-gray-600 hover:tw-text-gray-900\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_back</cide-ele-icon>\r\n </button>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">palette</cide-ele-icon>\r\n <div>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Theme Management</h5>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-m-0\">Page: {{ pageTitle() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Quick Add/Edit Form Section -->\r\n <div class=\"tw-px-6 tw-py-4 tw-bg-white tw-overflow-auto\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\r\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Theme' : 'Quick Add Theme' }}</h6>\r\n </div>\r\n </div>\r\n\r\n <!-- Form (kept as-is) -->\r\n <form [formGroup]=\"themeForm\" (ngSubmit)=\"saveTheme()\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\">\r\n <!-- Theme Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_title\" formControlName=\"sytm_title\" placeholder=\"Enter theme title\" label=\"Theme Title*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Theme Code -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_theme_code\" formControlName=\"sytm_theme_code\" placeholder=\"Enter theme code\" label=\"Theme Code*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Status -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input\r\n id=\"sytm_isactive_cb\"\r\n type=\"checkbox\"\r\n label=\"Active\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isactive\">\r\n </cide-ele-input>\r\n </div>\r\n <!-- Sub Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_sub_title\" formControlName=\"sytm_sub_title\" placeholder=\"Enter sub title\" label=\"Sub Title\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Preview ID -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_preview_id_fm\" formControlName=\"sytm_preview_id_fm\" placeholder=\"Enter preview image ID\" label=\"Preview Image ID\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Description -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\r\n <cide-ele-textarea id=\"sytm_desc\" formControlName=\"sytm_desc\" placeholder=\"Enter theme description\" rows=\"2\" label=\"Description\" size=\"sm\"></cide-ele-textarea>\r\n </div>\r\n <!-- Configuration JSON -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <cide-ele-json-editor label=\"Configuration JSON\" formControlName=\"sytm_configuration\" [required]=\"true\" [config]=\"{\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n minHeight: 150,\r\n maxHeight: 300,\r\n placeholder: 'Enter theme configuration JSON...'\r\n }\" helperText=\"Enter valid JSON configuration for the theme\"></cide-ele-json-editor>\r\n </div>\r\n <!-- Layout Configuration + Selection: right-side checkbox list -->\r\n <div class=\"lg:tw-col-span-1 tw-space-y-2\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Layout & Selection</div>\r\n <!-- Selected toggle -->\r\n <div class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-px-3 tw-py-2\">\r\n <cide-ele-input\r\n id=\"sytm_isselected\"\r\n type=\"checkbox\"\r\n label=\"Selected (Default)\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isselected\">\r\n </cide-ele-input>\r\n </div>\r\n <div formGroupName=\"sytm_layout\" class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-divide-y tw-overflow-hidden\">\r\n <!-- Sidebar -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_sidebar\">\r\n <cide-ele-input id=\"layout_sidebar_status\" type=\"checkbox\" label=\"Sidebar\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Header -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_header\">\r\n <cide-ele-input id=\"layout_header_status\" type=\"checkbox\" label=\"Header\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Footer -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_footer\">\r\n <cide-ele-input id=\"layout_footer_status\" type=\"checkbox\" label=\"Footer\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Breadcrumb -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_breadcrumb\">\r\n <cide-ele-input id=\"layout_breadcrumb_status\" type=\"checkbox\" label=\"Breadcrumb\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Console -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_console\">\r\n <cide-ele-input id=\"layout_console_status\" type=\"checkbox\" label=\"Console\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Request -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_request\">\r\n <cide-ele-input id=\"layout_request_status\" type=\"checkbox\" label=\"Request\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-pt-1\">Toggle active sections. Only one theme can be selected as default. More options can be added here later.</p>\r\n </div>\r\n <!-- Drawer Configuration -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Drawers</div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"outline\" (click)=\"addDrawer()\">\r\n Add Drawer\r\n </button>\r\n </div>\r\n\r\n <div formGroupName=\"sytm_layout\">\r\n <div class=\"tw-space-y-2\" formArrayName=\"sytm_layout_drawer\">\r\n <div *ngFor=\"let drawerGrp of drawerArray.controls; let i = index\" [formGroupName]=\"i\" class=\"tw-border tw-border-gray-200 tw-rounded-md tw-p-3 tw-flex tw-items-center tw-gap-3\">\r\n <cide-ele-input id=\"drawer_active_{{i}}\" type=\"checkbox\" label=\"Active\" size=\"sm\" formControlName=\"syth_status\"></cide-ele-input>\r\n <div class=\"tw-flex-1\">\r\n <cide-ele-select\r\n id=\"drawer_config_{{i}}\"\r\n label=\"Drawer For\"\r\n size=\"sm\"\r\n [options]=\"drawerConfigOptions\"\r\n formControlName=\"syth_config_syco_for\">\r\n </cide-ele-select>\r\n </div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"ghost\" (click)=\"removeDrawer(i)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Configure multiple drawers as needed.</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-flex tw-flex-col tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-end tw-space-x-3\">\r\n <button cideEleButton type=\"button\" variant=\"outline\" (click)=\"cancelForm()\" [disabled]=\"loading()\">Cancel</button>\r\n <button cideEleButton type=\"submit\" variant=\"primary\" leftIcon=\"add\" [disabled]=\"!themeForm.valid || loading()\" [loading]=\"loading()\">\r\n {{ isEditMode() ? 'Update Theme' : 'Create Theme' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Right: Theme gallery (40%) -->\r\n <div class=\"tw-hidden lg:tw-flex tw-w-2/5 tw-flex-col\">\r\n <!-- (Header consolidated above) -->\r\n\r\n <!-- Gallery list -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-bg-gray-50\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-p-4\">\r\n @for (theme of filteredThemes(); track theme._id) {\r\n <div class=\"tw-rounded-md tw-transition tw-cursor-pointer tw-relative\"\r\n [ngClass]=\"theme.sytm_isselected\r\n ? 'tw-border tw-border-blue-500 tw-ring-2 tw-ring-blue-200 tw-bg-blue-50/50'\r\n : 'tw-bg-white tw-border tw-border-gray-200 hover:tw-shadow-sm'\"\r\n (click)=\"editTheme(theme)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-selected]=\"theme.sytm_isselected ? 'true' : 'false'\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\"\r\n (keydown.enter)=\"editTheme(theme)\"\r\n (keydown.space)=\"$event.preventDefault(); editTheme(theme)\">\r\n\r\n <!-- Selected badge -->\r\n <div *ngIf=\"theme.sytm_isselected\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-600 tw-text-white\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">check</cide-ele-icon>\r\n </div>\r\n \r\n <div class=\"tw-aspect-[16/9] tw-bg-gray-100 tw-rounded-t-md tw-overflow-hidden tw-flex tw-items-center tw-justify-center\">\r\n @if (getPreviewUrl(theme)) {\r\n <img [src]=\"getPreviewUrl(theme)\" class=\"tw-w-full tw-h-full tw-object-cover\" alt=\"Preview\" />\r\n } @else {\r\n <div class=\"tw-text-gray-400 tw-text-xs\">No preview</div>\r\n }\r\n </div>\r\n <div class=\"tw-p-3 tw-space-y-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" [title]=\"theme.sytm_title\">{{ theme.sytm_title || 'Untitled Theme' }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" [title]=\"theme.sytm_theme_code\">{{ theme.sytm_theme_code }}</div>\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-pt-1\">\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-text-xs\" [ngClass]=\"theme.sytm_isactive ? 'tw-text-green-700' : 'tw-text-red-700'\">\r\n <span class=\"tw-w-1.5 tw-h-1.5 tw-rounded-full\" [ngClass]=\"theme.sytm_isactive ? 'tw-bg-green-500' : 'tw-bg-red-500'\"></span>\r\n {{ theme.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <!-- Set Selected Button - Clear and Simple -->\r\n @if (theme.sytm_isselected) {\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-rounded-md tw-text-xs tw-font-medium\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3\">check</cide-ele-icon>\r\n Selected\r\n </span>\r\n } @else {\r\n <button cideEleButton \r\n variant=\"outline\" \r\n size=\"xs\"\r\n (click)=\"$event.stopPropagation(); setSelectedTheme(theme)\"\r\n [attr.aria-label]=\"'Select ' + (theme.sytm_title || theme.sytm_theme_code) + ' theme'\"\r\n class=\"tw-text-xs\">\r\n Select\r\n </button>\r\n }\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); editTheme(theme)\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">edit</cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); deleteTheme(theme)\"\r\n [attr.aria-label]=\"'Delete theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!loading() && filteredThemes().length === 0) {\r\n <div class=\"tw-col-span-full tw-text-center tw-text-xs tw-text-gray-500 tw-py-8\">No themes found</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Template References for Grid Renderers (Best Practice)\r\n \r\n These ng-template elements represent the Angular best practice for custom rendering.\r\n They provide:\r\n - Type safety with template context\r\n - Component lifecycle integration\r\n - Change detection optimization\r\n - Proper event handling\r\n - Accessibility features\r\n \r\n Note: Current data grid uses string renderers for compatibility.\r\n Templates are maintained for future component enhancement.\r\n-->\r\n\r\n<!-- Theme Details Renderer Template -->\r\n<ng-template #themeDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Theme Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon \r\n class=\"tw-text-purple-600\" \r\n size=\"xs\">\r\n palette\r\n </cide-ele-icon>\r\n </div>\r\n \r\n <!-- Theme Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sytm_title\">\r\n {{ row.sytm_title || 'Untitled' }}\r\n </div>\r\n @if (row.sytm_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sytm_desc\">\r\n {{ row.sytm_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Theme Status Renderer Template -->\r\n<ng-template #themeStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sytm_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> " }]
|
|
766
|
-
}] });
|
|
767
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS10aGVtZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvcGFnZS1tYW5hZ2VtZW50L2NvbXBvbmVudHMvcGFnZS10aGVtZS9wYWdlLXRoZW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLXRoZW1lL3BhZ2UtdGhlbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBZ0Msd0JBQXdCLEVBQWdCLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFclMsT0FB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QUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0FseEJVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLG9oQkNoQy9CLHFraUJBNFRlLDJDRDVTWCxZQUFZLDZWQUNaLG1CQUFtQix1bUNBQ25CLFdBQVcsK0JBRVgsc0JBQXNCLGtYQUN0QixrQkFBa0IsMGJBQ2xCLG1CQUFtQixtWUFDbkIscUJBQXFCLDBVQUNyQixpQkFBaUIsK0ZBQ2pCLHdCQUF3Qix3S0FDeEIsMEJBQTBCOzsyRkFNakIsa0JBQWtCO2tCQXBCOUIsU0FBUzsrQkFDRSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLHdCQUF3Qjt3QkFDeEIsc0JBQXNCO3dCQUN0QixrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIscUJBQXFCO3dCQUNyQixpQkFBaUI7d0JBQ2pCLHdCQUF3Qjt3QkFDeEIsMEJBQTBCO3dCQUMxQix5QkFBeUI7cUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwsIGNvbXB1dGVkLCB2aWV3Q2hpbGQsIFRlbXBsYXRlUmVmLCBEZXN0cm95UmVmLCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZhbGlkYXRvcnMsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsIEZvcm1zTW9kdWxlLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBQYWdlVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZS10aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlSGVscGVyU2VydmljZSB9IGZyb20gJ2Nsb3VkLWlkZS1sYXlvdXQnO1xuaW1wb3J0IHsgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudCwgQ2lkZUVsZURhdGFHcmlkQ29tcG9uZW50LCBDaWRlSWNvbkNvbXBvbmVudCwgQ2lkZUlucHV0Q29tcG9uZW50LCBDaWRlU2VsZWN0Q29tcG9uZW50LCBDaWRlVGV4dGFyZWFDb21wb25lbnQsIEdyaWRDb25maWd1cmF0aW9uLCBHcmlkRXZlbnQsIENpZGVFbGVEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25JdGVtLCBDaWRlRWxlSnNvbkVkaXRvckNvbXBvbmVudCwgQ2lkZVNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IFRlbXBsYXRlQ29udGV4dCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IElDb3JlU3l0bSwgTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkLCBJQ29yZVN5dGhEcmF3ZXIsIE1TeXN0ZW1QYWdlc1RoZW1lLCBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2lkZS1jb3JlLWFwcC1wYWdlLXRoZW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENpZGVFbGVEYXRhR3JpZENvbXBvbmVudCxcbiAgICBDaWRlRWxlQnV0dG9uQ29tcG9uZW50LFxuICAgIENpZGVJbnB1dENvbXBvbmVudCxcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxuICAgIENpZGVUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBDaWRlSWNvbkNvbXBvbmVudCxcbiAgICBDaWRlRWxlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQ2lkZUVsZUpzb25FZGl0b3JDb21wb25lbnQsXG4gICAgQ2lkZVNlbGVjdE9wdGlvbkNvbXBvbmVudFxuXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2UtdGhlbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUaGVtZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIERlcGVuZGVuY3kgaW5qZWN0aW9uXG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSB0aGVtZVNlcnZpY2UgPSBpbmplY3QoUGFnZVRoZW1lU2VydmljZSk7XG4gIHByaXZhdGUgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVIZWxwZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChOb25OdWxsYWJsZUZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgLy8gTW9kZXJuIFZpZXdDaGlsZCBzaWduYWxzIGZvciB0ZW1wbGF0ZSByZW5kZXJlcnMgKEFuZ3VsYXIgMjAgYXBwcm9hY2gpXG4gIHRoZW1lRGV0YWlsc1JlbmRlcmVyVGVtcGxhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8VGVtcGxhdGVDb250ZXh0PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4+KCd0aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlJyk7XG4gIHRoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSA9IHZpZXdDaGlsZC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjxUZW1wbGF0ZUNvbnRleHQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pj4oJ3RoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZScpO1xuICBhY3Rpb25zRHJvcGRvd25SZW5kZXJlclRlbXBsYXRlID0gdmlld0NoaWxkLnJlcXVpcmVkPFRlbXBsYXRlUmVmPFRlbXBsYXRlQ29udGV4dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PignYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZScpO1xuXG4gIC8vIE1ha2UgTWF0aCBhdmFpbGFibGUgaW4gdGVtcGxhdGVcbiAgTWF0aCA9IE1hdGg7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGUgbWFuYWdlbWVudFxuICB0aGVtZXMgPSBzaWduYWw8SUNvcmVTeXRtW10+KFtdKTtcbiAgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBzZWxlY3RlZEl0ZW1zID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIHNlYXJjaFRlcm0gPSBzaWduYWwoJycpO1xuXG4gIC8vIERlcml2ZWQgbGlzdCBmaWx0ZXJlZCBieSBzZWFyY2hUZXJtXG4gIGZpbHRlcmVkVGhlbWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHEgPSAodGhpcy5zZWFyY2hUZXJtKCkgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50aGVtZXMoKSB8fCBbXTtcbiAgICBpZiAoIXEpIHJldHVybiBpdGVtcztcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHQgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSAodC5zeXRtX3RpdGxlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgY29kZSA9ICh0LnN5dG1fdGhlbWVfY29kZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGRlc2MgPSAodC5zeXRtX2Rlc2MgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdGl0bGUuaW5jbHVkZXMocSkgfHwgY29kZS5pbmNsdWRlcyhxKSB8fCBkZXNjLmluY2x1ZGVzKHEpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBIZWxwZXIgdG8gcmVzb2x2ZSBwcmV2aWV3IGltYWdlIFVSTCBzYWZlbHlcbiAgZ2V0UHJldmlld1VybCh0aGVtZTogSUNvcmVTeXRtKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHRoZW1lPy5zeXRtX3ByZXZpZXdfaWRfZm0gfHwgJyc7XG4gICAgaWYgKCFpZCkgcmV0dXJuICcnO1xuXG4gICAgdHlwZSBXaXRoUHJldmlld1VybCA9IHsgZ2V0UHJldmlld1VybDogKHBpZDogc3RyaW5nKSA9PiBzdHJpbmcgfTtcbiAgICBjb25zdCBzdmNVbmtub3duOiB1bmtub3duID0gdGhpcy50aGVtZVNlcnZpY2U7XG5cbiAgICBjb25zdCBoYXNHZXRQcmV2aWV3VXJsID0gKHN2YzogdW5rbm93bik6IHN2YyBpcyBXaXRoUHJldmlld1VybCA9PlxuICAgICAgdHlwZW9mIHN2YyA9PT0gJ29iamVjdCcgJiYgc3ZjICE9PSBudWxsICYmXG4gICAgICAnZ2V0UHJldmlld1VybCcgaW4gKHN2YyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgJiZcbiAgICAgIHR5cGVvZiAoc3ZjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsnZ2V0UHJldmlld1VybCddID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGhhc0dldFByZXZpZXdVcmwoc3ZjVW5rbm93bikpIHtcbiAgICAgIHJldHVybiBzdmNVbmtub3duLmdldFByZXZpZXdVcmwoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBJbnB1dCBoYW5kbGVyIHRvIGF2b2lkICRhbnkgY2FzdHMgaW4gdGVtcGxhdGVcbiAgb25HYWxsZXJ5U2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQodGFyZ2V0Py52YWx1ZSA/PyAnJyk7XG4gIH1cblxuICAvLyBQYWdlIGluZm9ybWF0aW9uXG4gIHBhZ2VJZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcGFnZVRpdGxlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8vIEZvcm0gc3RhdGVcbiAgaXNFZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIGVkaXRpbmdUaGVtZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZXRyaWV2ZWRUaGVtZSA9IHNpZ25hbDxJQ29yZVN5dG0gfCBudWxsPihudWxsKTtcblxuICAvLyBQYWdpbmF0aW9uIHNpZ25hbHNcbiAgY3VycmVudFBhZ2UgPSBzaWduYWwoMSk7XG4gIHBhZ2VTaXplID0gc2lnbmFsKDEwKTtcbiAgdG90YWxJdGVtcyA9IHNpZ25hbCgwKTtcblxuICAvLyBNb2Rlcm4gcmVhY3RpdmUgZm9ybXMgd2l0aCBzaWduYWxzXG4gIHRoZW1lRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIHN5dG1fdGl0bGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICBzeXRtX2Rlc2M6IFsnJ10sXG4gICAgc3l0bV90aGVtZV9jb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiBbJyddLFxuICAgIHN5dG1fc3ViX3RpdGxlOiBbJyddLFxuICAgIHN5dG1fY29uZmlndXJhdGlvbjogWyd7fSddLFxuICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IFsnJ10sXG4gICAgc3l0bV9pc3NlbGVjdGVkOiBbZmFsc2VdLFxuICAgIHN5dG1fbGF5b3V0OiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHRoaXMuZmIuZ3JvdXAoeyBzdGF0dXM6IFt0cnVlXSB9KSxcbiAgICAgIHN5dG1fbGF5b3V0X2hlYWRlcjogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW3RydWVdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB0aGlzLmZiLmdyb3VwKHsgc3RhdHVzOiBbZmFsc2VdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW3RydWVdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW2ZhbHNlXSB9KSxcbiAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHRoaXMuZmIuZ3JvdXAoeyBzdGF0dXM6IFtmYWxzZV0gfSksXG4gICAgICBzeXRtX2xheW91dF9kcmF3ZXI6IHRoaXMuZmIuYXJyYXkoW10gYXMgSUNvcmVTeXRoRHJhd2VyW10pXG4gICAgfSksXG4gICAgc3l0bV9pc2FjdGl2ZTogW3RydWVdXG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkIHZhbHVlc1xuICBpc0Zvcm1EaXJ0eSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGhlbWVGb3JtLmRpcnR5KTtcblxuICAvLyBNdWx0aS1zZWxlY3Qgb3B0aW9ucyBmb3IgbGF5b3V0IHNlY3Rpb25zXG4gIGxheW91dE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ3NpZGViYXInLCBsYWJlbDogJ1NpZGViYXInIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcicsIGxhYmVsOiAnSGVhZGVyJyB9LFxuICAgIHsgdmFsdWU6ICdmb290ZXInLCBsYWJlbDogJ0Zvb3RlcicgfSxcbiAgICB7IHZhbHVlOiAnYnJlYWRjcnVtYicsIGxhYmVsOiAnQnJlYWRjcnVtYicgfSxcbiAgICB7IHZhbHVlOiAnY29uc29sZScsIGxhYmVsOiAnQ29uc29sZScgfSxcbiAgICB7IHZhbHVlOiAncmVxdWVzdCcsIGxhYmVsOiAnUmVxdWVzdCcgfVxuICBdIGFzIGNvbnN0O1xuXG4gIC8vIFJlYWQgZW5hYmxlZCBzZWxlY3Rpb25zIGZyb20gZm9ybSB2YWx1ZXNcbiAgZW5hYmxlZExheW91dFNlbGVjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMudGhlbWVGb3JtLmdldCgnc3l0bV9sYXlvdXQnKTtcbiAgICBpZiAoIWxheW91dCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBnZXRCb29sID0gKHBhdGg6IHN0cmluZykgPT4gQm9vbGVhbih0aGlzLnRoZW1lRm9ybS5nZXQocGF0aCk/LnZhbHVlKTtcblxuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ3NpZGViYXInKTtcbiAgICBpZiAoZ2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ2hlYWRlcicpO1xuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9mb290ZXIuc3RhdHVzJykpIHNlbGVjdGlvbnMucHVzaCgnZm9vdGVyJyk7XG4gICAgaWYgKGdldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzJykpIHNlbGVjdGlvbnMucHVzaCgnYnJlYWRjcnVtYicpO1xuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9jb25zb2xlLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ2NvbnNvbGUnKTtcbiAgICBpZiAoZ2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfcmVxdWVzdC5zdGF0dXMnKSkgc2VsZWN0aW9ucy5wdXNoKCdyZXF1ZXN0Jyk7XG5cbiAgICByZXR1cm4gc2VsZWN0aW9ucztcbiAgfVxuXG4gIC8vIFVwZGF0ZSBmb3JtIGJvb2xlYW5zIGZyb20gbXVsdGktc2VsZWN0IGNoYW5nZVxuICBvbkVuYWJsZWRMYXlvdXRDaGFuZ2UodmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNldEJvb2wgPSAocGF0aDogc3RyaW5nLCB2YWw6IGJvb2xlYW4pID0+IHRoaXMudGhlbWVGb3JtLmdldChwYXRoKT8uc2V0VmFsdWUodmFsKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh2YWx1ZXMpO1xuICAgIHNldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X3NpZGViYXIuc3RhdHVzJywgc2VsZWN0ZWQuaGFzKCdzaWRlYmFyJykpO1xuICAgIHNldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2hlYWRlci5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2hlYWRlcicpKTtcbiAgICBzZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9mb290ZXIuc3RhdHVzJywgc2VsZWN0ZWQuaGFzKCdmb290ZXInKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfYnJlYWRjcnVtYi5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2JyZWFkY3J1bWInKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2NvbnNvbGUnKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfcmVxdWVzdC5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ3JlcXVlc3QnKSk7XG4gIH1cblxuICAvLyBHcmlkIGNvbmZpZ3VyYXRpb24gc2lnbmFsXG4gIGdyaWRDb25maWcgPSBzaWduYWw8R3JpZENvbmZpZ3VyYXRpb248SUNvcmVTeXRtPj4oe1xuICAgIGlkOiAndGhlbWUtbGlzdC1ncmlkJyxcbiAgICB0aXRsZTogJycsXG4gICAgc3VidGl0bGU6ICcnLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZGV0YWlscycsXG4gICAgICAgIGhlYWRlcjogJ1RoZW1lIERldGFpbHMnLFxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgdHJ1bmNhdGU6IHRydWUsXG4gICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIHJlbmRlcmVyOiAndGhlbWVEZXRhaWxzUmVuZGVyZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzeXRtX3RoZW1lX2NvZGUnLFxuICAgICAgICBoZWFkZXI6ICdUaGVtZSBDb2RlJyxcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB3aWR0aDogJzE1MHB4JyxcbiAgICAgICAgdHJ1bmNhdGU6IHRydWUsXG4gICAgICAgIGFsaWduOiAnbGVmdCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3N5dG1faXNhY3RpdmUnLFxuICAgICAgICBoZWFkZXI6ICdTdGF0dXMnLFxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgd2lkdGg6ICcxMDBweCcsXG4gICAgICAgIHRydW5jYXRlOiBmYWxzZSxcbiAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICByZW5kZXJlcjogJ3RoZW1lU3RhdHVzUmVuZGVyZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdhY3Rpb25zJyxcbiAgICAgICAgaGVhZGVyOiAnJyxcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgIHdpZHRoOiAnMTIwcHgnLFxuICAgICAgICB0cnVuY2F0ZTogZmFsc2UsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgcmVuZGVyZXI6ICdhY3Rpb25zRHJvcGRvd25SZW5kZXJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgIGRhdGE6IFtdLFxuICAgIHRyYWNrQnk6ICdfaWQnLFxuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMTAsXG4gICAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMjUsIDUwLCAxMDBdLFxuICAgICAgc2hvd1F1aWNrSnVtcDogdHJ1ZSxcbiAgICAgIHNob3dQYWdlSW5mbzogdHJ1ZSxcbiAgICAgIHNob3dSZWZyZXNoOiB0cnVlXG4gICAgfSxcbiAgICBzZWFyY2g6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCB0aGVtZXMuLi4nLFxuICAgICAgc2VhcmNoYWJsZUNvbHVtbnM6IFsnc3l0bV90aXRsZScsICdzeXRtX2Rlc2MnLCAnc3l0bV90aGVtZV9jb2RlJ10sXG4gICAgICBkZWJvdW5jZU1zOiAzMDBcbiAgICB9LFxuICAgIGxvYWRpbmc6IHtcbiAgICAgIHVzZURlZmVyOiB0cnVlLFxuICAgICAgc2tlbGV0b25Sb3dzOiA1LFxuICAgICAgc2hvd092ZXJsYXk6IGZhbHNlXG4gICAgfSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBtYXhIZWlnaHQ6ICcnLFxuICAgICAgbWluSGVpZ2h0OiAnJyxcbiAgICAgIHN0aWNreUhlYWRlcjogdHJ1ZSxcbiAgICAgIHZpcnR1YWxTY3JvbGw6IGZhbHNlLFxuICAgICAgcm93SGVpZ2h0OiA1MFxuICAgIH0sXG4gICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICBzdHJpcGVkOiBmYWxzZSxcbiAgICBib3JkZXJlZDogdHJ1ZSxcbiAgICBjb21wYWN0OiBmYWxzZSxcbiAgICB0YWJsZUNsYXNzOiAndHctdGFibGUtZml4ZWQgdHctdy1mdWxsIHR3LXJvdW5kZWQtbm9uZSdcbiAgfSk7XG5cbiAgLy8gQWN0aW9uIGhhbmRsZXJzIGZvciBncmlkXG4gIGFjdGlvbkhhbmRsZXJzID0ge1xuICAgIG9uRWRpdDogKGl0ZW06IElDb3JlU3l0bSkgPT4gdGhpcy5lZGl0VGhlbWUoaXRlbSksXG4gICAgb25EZWxldGU6IChpdGVtOiBJQ29yZVN5dG0pID0+IHRoaXMuZGVsZXRlVGhlbWUoaXRlbSksXG4gICAgb25Ub2dnbGVTdGF0dXM6IChpdGVtOiBJQ29yZVN5dG0pID0+IHRoaXMudG9nZ2xlVGhlbWVTdGF0dXMoaXRlbSlcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIC8vIEdldCBwYWdlIGluZm9ybWF0aW9uIGZyb20gcm91dGVcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIFF1ZXJ5IHBhcmFtczonLCBwYXJhbXMpO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJhbXNbJ3F1ZXJ5J107XG4gICAgICBjb25zdCBxdWVyeURhdGEgPSBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcocXVlcnlQYXJhbXMpO1xuXG4gICAgICB0aGlzLnBhZ2VJZC5zZXQocXVlcnlEYXRhPy5zeXBnX2lkIHx8ICcnKTtcbiAgICAgIHRoaXMucGFnZVRpdGxlLnNldChxdWVyeURhdGE/LnN5cGdfdGl0bGUgfHwgJycpO1xuXG4gICAgICBpZiAodGhpcy5wYWdlSWQoKSkge1xuICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgdGhpcy5zZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yLnNldCgnTm8gcGFnZSBJRCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlbWVzIGZyb20gQVBJXG4gICAqL1xuICBwcml2YXRlIGxvYWRUaGVtZXMoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIGNvbnN0IHJlcXVlc3Q6IE1TeXN0ZW1QYWdlc1RoZW1lID0ge1xuICAgICAgc3l0bV9wYWdlX2lkX3N5cGc6IHRoaXMucGFnZUlkKClcbiAgICB9O1xuXG4gICAgdGhpcy50aGVtZVNlcnZpY2UuZ2V0VGhlbWVMaXN0KHJlcXVlc3QpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy50aGVtZXMuc2V0KHJlc3BvbnNlLmRhdGEgfHwgW10pO1xuICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1zLnNldChyZXNwb25zZS50b3RhbCB8fCAwKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZERhdGEoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2UubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgdGhlbWVzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB0aGVtZXM6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdGYWlsZWQgdG8gbG9hZCB0aGVtZXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGZvcm0gc3Vic2NyaXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIFdhdGNoIGZvciBmb3JtIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgc2F2ZSBidXR0b25cbiAgICB0aGlzLnRoZW1lRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEZvcm0gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGJ5IGNvbXB1dGVkIHNpZ25hbHNcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBncmlkIGRhdGFcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlR3JpZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkQ29uZmlnLnVwZGF0ZShjb25maWcgPT4gKHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGRhdGE6IHRoaXMudGhlbWVzKClcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1c3RvbSByZW5kZXJlcnMgZm9yIGdyaWRcbiAgICovXG5cblxuICAvKipcbiAgICogR2V0IHRlbXBsYXRlIHJlbmRlcmVycyBmb3IgZ3JpZFxuICAgKi9cbiAgZ2V0VGVtcGxhdGVSZW5kZXJlcnMoKTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8VGVtcGxhdGVDb250ZXh0Pj4ge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVtZURldGFpbHNSZW5kZXJlcjogdGhpcy50aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlKCksXG4gICAgICB0aGVtZVN0YXR1c1JlbmRlcmVyOiB0aGlzLnRoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSgpLFxuICAgICAgYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXI6IHRoaXMuYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZ3JpZCBldmVudHNcbiAgICovXG4gIG9uR3JpZEV2ZW50KGV2ZW50OiBHcmlkRXZlbnQ8SUNvcmVTeXRtPik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAncGFnZUNoYW5nZSc6XG4gICAgICAgIGlmIChldmVudC5kYXRhICYmIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJiAncGFnZUluZGV4JyBpbiBldmVudC5kYXRhICYmICdwYWdlU2l6ZScgaW4gZXZlbnQuZGF0YSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2Uuc2V0KGV2ZW50LmRhdGFbJ3BhZ2VJbmRleCddIGFzIG51bWJlcik7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZS5zZXQoZXZlbnQuZGF0YVsncGFnZVNpemUnXSBhcyBudW1iZXIpO1xuICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXJtLnNldChldmVudC5kYXRhKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlLnNldCgxKTtcbiAgICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3Rpb24nOlxuICAgICAgICAvLyBIYW5kbGUgYWN0aW9uIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ0FjdGlvbiBldmVudDonLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncm93Q2xpY2snOlxuICAgICAgICAvLyBIYW5kbGUgcm93IGNsaWNrIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1JvdyBjbGljayBldmVudDonLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgIC8vIEhhbmRsZSBzb3J0IGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1NvcnQgZXZlbnQ6JywgZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4cG9ydCc6XG4gICAgICAgIC8vIEhhbmRsZSBleHBvcnQgZXZlbnRzIGlmIG5lZWRlZFxuICAgICAgICBjb25zb2xlLmxvZygnRXhwb3J0IGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyb3dSZW9yZGVyJzpcbiAgICAgICAgLy8gSGFuZGxlIHJvdyByZW9yZGVyIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1JvdyByZW9yZGVyIGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgdGhlbWVcbiAgICovXG4gIGNyZWF0ZVRoZW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aGVtZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMubWFya0Zvcm1Bc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnRoZW1lRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IG5ld1RoZW1lOiBNU3lzdGVtUGFnZXNUaGVtZUluc2VydFVwZGF0ZVBheWxvYWQgPSB7XG4gICAgICBzeXRtX3RpdGxlOiBmb3JtVmFsdWUuc3l0bV90aXRsZSxcbiAgICAgIHN5dG1fZGVzYzogZm9ybVZhbHVlLnN5dG1fZGVzYyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogZm9ybVZhbHVlLnN5dG1fdGhlbWVfY29kZSxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogZm9ybVZhbHVlLnN5dG1fcHJldmlld19pZF9mbSxcbiAgICAgIHN5dG1fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnBhcnNlKGZvcm1WYWx1ZS5zeXRtX2NvbmZpZ3VyYXRpb24pLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IGZvcm1WYWx1ZS5zeXRtX3N1Yl90aXRsZSxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IGZvcm1WYWx1ZS5zeXRtX2VudGl0eV9pZF9zeWVuIHx8IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKSxcbiAgICAgIHN5dG1faXNzZWxlY3RlZDogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9pc3NlbGVjdGVkKSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZm9vdGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IEJvb2xlYW4oZm9ybVZhbHVlLnN5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzKSB9LFxuICAgICAgICBzeXRtX2xheW91dF9jb25zb2xlOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMpIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9yZXF1ZXN0LnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiBmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZHJhd2VyIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5dG1faXNhY3RpdmVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS5jcmVhdGVUaGVtZShuZXdUaGVtZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkVGhlbWVzKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIFRoZW1lIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gY3JlYXRlIHRoZW1lOicsIHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHRoZW1lOicsIGVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGNyZWF0ZSB0aGVtZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGV4aXN0aW5nIHRoZW1lXG4gICAqL1xuICB1cGRhdGVUaGVtZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGhlbWVGb3JtLnZhbGlkIHx8ICF0aGlzLmVkaXRpbmdUaGVtZUlkKCkpIHtcbiAgICAgIHRoaXMubWFya0Zvcm1Bc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnRoZW1lRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZWRUaGVtZTogTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xuICAgICAgX2lkOiB0aGlzLmVkaXRpbmdUaGVtZUlkKCkgfHwgJycsXG4gICAgICBzeXRtX3RpdGxlOiBmb3JtVmFsdWUuc3l0bV90aXRsZSxcbiAgICAgIHN5dG1fZGVzYzogZm9ybVZhbHVlLnN5dG1fZGVzYyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogZm9ybVZhbHVlLnN5dG1fdGhlbWVfY29kZSxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogZm9ybVZhbHVlLnN5dG1fcHJldmlld19pZF9mbSxcbiAgICAgIHN5dG1fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnBhcnNlKGZvcm1WYWx1ZS5zeXRtX2NvbmZpZ3VyYXRpb24pLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IGZvcm1WYWx1ZS5zeXRtX3N1Yl90aXRsZSxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IGZvcm1WYWx1ZS5zeXRtX2VudGl0eV9pZF9zeWVuIHx8IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKSxcbiAgICAgIHN5dG1faXNzZWxlY3RlZDogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9pc3NlbGVjdGVkKSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZm9vdGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IEJvb2xlYW4oZm9ybVZhbHVlLnN5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzKSB9LFxuICAgICAgICBzeXRtX2xheW91dF9jb25zb2xlOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMpIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9yZXF1ZXN0LnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiBmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZHJhd2VyIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5dG1faXNhY3RpdmVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZSh1cGRhdGVkVGhlbWUpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBUaGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHVwZGF0ZSB0aGVtZTonLCByZXNwb25zZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyB0aGVtZTonLCBlcnJvcik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byB1cGRhdGUgdGhlbWUuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlbWVcbiAgICovXG4gIGVkaXRUaGVtZSh0aGVtZTogSUNvcmVTeXRtKTogdm9pZCB7XG4gICAgdGhpcy5pc0VkaXRNb2RlLnNldCh0cnVlKTtcbiAgICB0aGlzLmVkaXRpbmdUaGVtZUlkLnNldCh0aGVtZS5faWQgfHwgbnVsbCk7XG4gICAgdGhpcy5yZXRyaWV2ZWRUaGVtZS5zZXQodGhlbWUpO1xuXG4gICAgdGhpcy50aGVtZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzeXRtX3RpdGxlOiB0aGVtZS5zeXRtX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9kZXNjOiB0aGVtZS5zeXRtX2Rlc2MgfHwgJycsXG4gICAgICBzeXRtX3RoZW1lX2NvZGU6IHRoZW1lLnN5dG1fdGhlbWVfY29kZSB8fCAnJyxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogdGhlbWUuc3l0bV9wcmV2aWV3X2lkX2ZtIHx8ICcnLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IHRoZW1lLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnN0cmluZ2lmeSh0aGVtZS5zeXRtX2NvbmZpZ3VyYXRpb24gfHwge30sIG51bGwsIDIpLFxuICAgICAgc3l0bV9lbnRpdHlfaWRfc3llbjogdGhlbWUuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICBzeXRtX2lzc2VsZWN0ZWQ6IHRoZW1lLnN5dG1faXNzZWxlY3RlZCA/PyBmYWxzZSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfc2lkZWJhcj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogdGhlbWUuc3l0bV9sYXlvdXQ/LnN5dG1fbGF5b3V0X2hlYWRlcj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogdGhlbWUuc3l0bV9sYXlvdXQ/LnN5dG1fbGF5b3V0X2Zvb3Rlcj8uc3RhdHVzID8/IGZhbHNlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X2JyZWFkY3J1bWI6IHsgc3RhdHVzOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfYnJlYWRjcnVtYj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogeyBzdGF0dXM6IHRoZW1lLnN5dG1fbGF5b3V0Py5zeXRtX2xheW91dF9jb25zb2xlPy5zdGF0dXMgPz8gZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfcmVxdWVzdDogeyBzdGF0dXM6IHRoZW1lLnN5dG1fbGF5b3V0Py5zeXRtX2xheW91dF9yZXF1ZXN0Py5zdGF0dXMgPz8gZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfZHJhd2VyIHx8IFtdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogdGhlbWUuc3l0bV9pc2FjdGl2ZSA/PyB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBSZWJ1aWxkIGRyYXdlciBhcnJheSBjb250cm9scyBmcm9tIGRhdGFcbiAgICB3aGlsZSAodGhpcy5kcmF3ZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJhd2VyQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgICh0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfZHJhd2VyIHx8IFtdKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgdGhpcy5kcmF3ZXJBcnJheS5wdXNoKHRoaXMuY3JlYXRlRHJhd2VyR3JvdXAoe1xuICAgICAgICBzeXRoX3N0YXR1czogZD8uc3l0aF9zdGF0dXMgPz8gdHJ1ZSxcbiAgICAgICAgc3l0aF9jb25maWdfc3ljb19mb3I6IGQ/LnN5dGhfY29uZmlnX3N5Y29fZm9yID8/ICdkcmF3ZXJfbm90ZXMnXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnRoZW1lRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGVtZVxuICAgKi9cbiAgZGVsZXRlVGhlbWUodGhlbWU6IElDb3JlU3l0bSk6IHZvaWQge1xuICAgIGlmIChjb25maXJtKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSB0aGVtZSBcIiR7dGhlbWUuc3l0bV90aXRsZX1cIj9gKSkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLmRlbGV0ZVRoZW1lKHRoZW1lLl9pZCB8fCAnJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkVGhlbWVzKCk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgVGhlbWUgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gZGVsZXRlIHRoZW1lOicsIHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyB0aGVtZTonLCBlcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGRlbGV0ZSB0aGVtZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGVtZSBzdGF0dXNcbiAgICovXG4gIHRvZ2dsZVRoZW1lU3RhdHVzKHRoZW1lOiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRvZ2dsZVRoZW1lU3RhdHVzKHsgc3l0bV9pZDogdGhlbWUuX2lkIHx8ICcnLCBzeXRtX2lzYWN0aXZlOiAhdGhlbWUuc3l0bV9pc2FjdGl2ZSB9KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYOKchSBUaGVtZSAke3RoZW1lLnN5dG1faXNhY3RpdmUgPyAnZGVhY3RpdmF0ZWQnIDogJ2FjdGl2YXRlZCd9IHN1Y2Nlc3NmdWxseWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHRvZ2dsZSB0aGVtZSBzdGF0dXM6JywgcmVzcG9uc2UubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdG9nZ2xpbmcgdGhlbWUgc3RhdHVzOicsIGVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHRvZ2dsZSB0aGVtZSBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlbWUgKGNyZWF0ZSBvciB1cGRhdGUpXG4gICAqL1xuICBzYXZlVGhlbWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRoZW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlVGhlbWUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGZvcm1cbiAgICovXG4gIGNhbmNlbEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyBiYWNrIHRvIHBhZ2UgbGlzdFxuICAgKi9cbiAgZ29CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvcmUvcGFnZSddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmb3JtXG4gICAqL1xuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnRoZW1lRm9ybS5yZXNldCh7XG4gICAgICBzeXRtX3RpdGxlOiAnJyxcbiAgICAgIHN5dG1fZGVzYzogJycsXG4gICAgICBzeXRtX3RoZW1lX2NvZGU6ICcnLFxuICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiAnJyxcbiAgICAgIHN5dG1fc3ViX3RpdGxlOiAnJyxcbiAgICAgIHN5dG1fY29uZmlndXJhdGlvbjogJ3t9JyxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46ICcnLFxuICAgICAgc3l0bV9pc3NlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiB0cnVlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X2hlYWRlcjogeyBzdGF0dXM6IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogeyBzdGF0dXM6IGZhbHNlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBmYWxzZSB9LFxuICAgICAgICBzeXRtX2xheW91dF9kcmF3ZXI6IFtdIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRXhwbGljaXRseSBjbGVhciB0aGUgRm9ybUFycmF5IGZvciBkcmF3ZXJzXG4gICAgd2hpbGUgKHRoaXMuZHJhd2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRyYXdlckFycmF5LnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZWRpdGluZ1RoZW1lSWQuc2V0KG51bGwpO1xuICAgIHRoaXMucmV0cmlldmVkVGhlbWUuc2V0KG51bGwpO1xuICAgIHRoaXMudGhlbWVGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy50aGVtZUZvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBmb3JtIGFzIHRvdWNoZWQgdG8gdHJpZ2dlciB2YWxpZGF0aW9uIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgbWFya0Zvcm1Bc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy50aGVtZUZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRoZW1lRm9ybS5nZXQoa2V5KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZHJvcGRvd24gaXRlbXMgZm9yIGFjdGlvbnNcbiAgICovXG4gIGdldEFjdGlvbkRyb3Bkb3duSXRlbXModGhlbWU6IElDb3JlU3l0bSk6IERyb3Bkb3duSXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogJ2VkaXQnLFxuICAgICAgICBsYWJlbDogJ0VkaXQnLFxuICAgICAgICBpY29uOiAnZWRpdCcsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICd0b2dnbGUnLFxuICAgICAgICBsYWJlbDogdGhlbWUuc3l0bV9pc2FjdGl2ZSA/ICdEZWFjdGl2YXRlJyA6ICdBY3RpdmF0ZScsXG4gICAgICAgIGljb246IHRoZW1lLnN5dG1faXNhY3RpdmUgPyAnYmxvY2snIDogJ2NoZWNrX2NpcmNsZScsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdkZWxldGUnLFxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgIGljb246ICdkZWxldGUnLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBkcm9wZG93biBpdGVtIGNsaWNrXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgY2xpY2tzIG9uIGRyb3Bkb3duIG1lbnUgaXRlbXMgaW4gdGhlIGFjdGlvbnMgY29sdW1uXG4gICAqL1xuICBvbkRyb3Bkb3duSXRlbUNsaWNrKGl0ZW06IERyb3Bkb3duSXRlbSwgcm93OiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygn8J+UtSBvbkRyb3Bkb3duSXRlbUNsaWNrIGNhbGxlZCB3aXRoOicsIGl0ZW0sIHJvdyk7XG5cbiAgICBzd2l0Y2ggKGl0ZW0uaWQpIHtcbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICBjb25zb2xlLmxvZygn8J+UtSBDYWxsaW5nIGVkaXRUaGVtZSB3aXRoOicsIHJvdyk7XG4gICAgICAgIHRoaXMuZWRpdFRoZW1lKHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgY29uc29sZS5sb2coJ/CflLUgQ2FsbGluZyB0b2dnbGVUaGVtZVN0YXR1cyB3aXRoOicsIHJvdyk7XG4gICAgICAgIHRoaXMudG9nZ2xlVGhlbWVTdGF0dXMocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBjb25zb2xlLmxvZygn8J+UtSBDYWxsaW5nIGRlbGV0ZVRoZW1lIHdpdGg6Jywgcm93KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVtZShyb3cpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5S1IFVua25vd24gYWN0aW9uOicsIGl0ZW0uaWQpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBkcm9wZG93bnMgYWZ0ZXIgYWN0aW9uXG4gICAgdGhpcy5jbG9zZUFsbERyb3Bkb3ducygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFsbCBkcm9wZG93bnNcbiAgICovXG4gIHByaXZhdGUgY2xvc2VBbGxEcm9wZG93bnMoKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgYWxsIGRyb3Bkb3ducyBieSBjbGlja2luZyBvdXRzaWRlXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICAvLyA9PT09PSBEcmF3ZXIgKHN5dG1fbGF5b3V0X2RyYXdlcikgaGVscGVycyA9PT09PVxuICBkcmF3ZXJDb25maWdPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdkcmF3ZXJfbm90ZXMnLCBsYWJlbDogJ0RyYXdlciBOb3RlcycgfSxcbiAgICB7IHZhbHVlOiAnZHJhd2VyX3RoZW1lJywgbGFiZWw6ICdEcmF3ZXIgVGhlbWUnIH1cbiAgXTtcblxuICBnZXQgZHJhd2VyQXJyYXkoKTogRm9ybUFycmF5PEZvcm1Hcm91cD4ge1xuICAgIHJldHVybiB0aGlzLnRoZW1lRm9ybS5nZXQoJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2RyYXdlcicpIGFzIHVua25vd24gYXMgRm9ybUFycmF5PEZvcm1Hcm91cD47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYXdlckdyb3VwKGRyYXdlcj86IFBhcnRpYWw8SUNvcmVTeXRoRHJhd2VyPik6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc3l0aF9zdGF0dXM6IFtkcmF3ZXI/LnN5dGhfc3RhdHVzID8/IHRydWVdLFxuICAgICAgc3l0aF9jb25maWdfc3ljb19mb3I6IFtkcmF3ZXI/LnN5dGhfY29uZmlnX3N5Y29fZm9yID8/ICdkcmF3ZXJfbm90ZXMnXVxuICAgIH0pIGFzIHVua25vd24gYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgYWRkRHJhd2VyKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd2VyQXJyYXkucHVzaCh0aGlzLmNyZWF0ZURyYXdlckdyb3VwKCkpO1xuICAgIHRoaXMudGhlbWVGb3JtLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICByZW1vdmVEcmF3ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5kcmF3ZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJhd2VyQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgdGhpcy50aGVtZUZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGVjdGVkIHRoZW1lIChvbmx5IG9uZSBjYW4gYmUgc2VsZWN0ZWQgcGVyIHBhZ2UpXG4gICAqL1xuICBzZXRTZWxlY3RlZFRoZW1lKHRoZW1lOiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICBpZiAoIXRoZW1lIHx8IHRoZW1lLnN5dG1faXNzZWxlY3RlZCkgcmV0dXJuOyAvLyBhbHJlYWR5IHNlbGVjdGVkXG5cbiAgICBjb25zdCBwcmV2aW91c2x5U2VsZWN0ZWQgPSB0aGlzLnRoZW1lcygpLmZpbmQodCA9PiB0LnN5dG1faXNzZWxlY3RlZCAmJiB0Ll9pZCAhPT0gdGhlbWUuX2lkKTtcblxuICAgIC8vIERpc2FibGUgcHJldmlvdXMgc2VsZWN0aW9uIChiZXN0LWVmZm9ydClcbiAgICBpZiAocHJldmlvdXNseVNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBkaXNhYmxlUGF5bG9hZDogTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xuICAgICAgICBfaWQ6IHByZXZpb3VzbHlTZWxlY3RlZC5faWQgfHwgJycsXG4gICAgICAgIHN5dG1fdGl0bGU6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX3RpdGxlIHx8ICcnLFxuICAgICAgICBzeXRtX2Rlc2M6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX2Rlc2MgfHwgJycsXG4gICAgICAgIHN5dG1fdGhlbWVfY29kZTogcHJldmlvdXNseVNlbGVjdGVkLnN5dG1fdGhlbWVfY29kZSB8fCAnJyxcbiAgICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9wcmV2aWV3X2lkX2ZtIHx8ICcnLFxuICAgICAgICBzeXRtX3BhZ2VfaWRfc3lwZzogdGhpcy5wYWdlSWQoKSxcbiAgICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9jb25maWd1cmF0aW9uIHx8IHt9LFxuICAgICAgICBzeXRtX3N1Yl90aXRsZTogcHJldmlvdXNseVNlbGVjdGVkLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgICBzeXRtX2VudGl0eV9pZF9zeWVuOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICAgIHN5dG1faXNzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHN5dG1fbGF5b3V0OiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9sYXlvdXQsXG4gICAgICAgIHN5dG1faXNhY3RpdmU6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX2lzYWN0aXZlID8/IHRydWVcbiAgICAgIH07XG4gICAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZShkaXNhYmxlUGF5bG9hZCkucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4ge30sIGVycm9yOiAoKSA9PiB7fSB9KTtcbiAgICB9XG5cbiAgICAvLyBFbmFibGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICBjb25zdCBlbmFibGVQYXlsb2FkOiBNU3lzdGVtUGFnZXNUaGVtZUluc2VydFVwZGF0ZVBheWxvYWQgPSB7XG4gICAgICBfaWQ6IHRoZW1lLl9pZCB8fCAnJyxcbiAgICAgIHN5dG1fdGl0bGU6IHRoZW1lLnN5dG1fdGl0bGUgfHwgJycsXG4gICAgICBzeXRtX2Rlc2M6IHRoZW1lLnN5dG1fZGVzYyB8fCAnJyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogdGhlbWUuc3l0bV90aGVtZV9jb2RlIHx8ICcnLFxuICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiB0aGVtZS5zeXRtX3ByZXZpZXdfaWRfZm0gfHwgJycsXG4gICAgICBzeXRtX3BhZ2VfaWRfc3lwZzogdGhpcy5wYWdlSWQoKSxcbiAgICAgIHN5dG1fY29uZmlndXJhdGlvbjogdGhlbWUuc3l0bV9jb25maWd1cmF0aW9uIHx8IHt9LFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IHRoZW1lLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9lbnRpdHlfaWRfc3llbjogdGhlbWUuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICBzeXRtX2lzc2VsZWN0ZWQ6IHRydWUsXG4gICAgICBzeXRtX2xheW91dDogdGhlbWUuc3l0bV9sYXlvdXQsXG4gICAgICBzeXRtX2lzYWN0aXZlOiB0aGVtZS5zeXRtX2lzYWN0aXZlID8/IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZShlbmFibGVQYXlsb2FkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmxvYWRUaGVtZXMoKTsgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7IH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpOyB9XG4gICAgICB9KTtcbiAgfVxufSIsIjwhLS0gUGFnZSBUaGVtZSBDb250YWluZXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWgtZnVsbCB0dy13LWZ1bGxcIj5cclxuICBcclxuICA8IS0tIExlZnQ6IEZvcm0gYW5kIGhlYWRlciAoNjAlKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIGxnOnR3LXctMy81IHR3LWZsZXggdHctZmxleC1jb2wgdHctYm9yZGVyLXIgdHctYm9yZGVyLWdyYXktMjAwXCI+XHJcblxyXG4gIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctcHgtNiB0dy1weS0zIHR3LWJvcmRlci1iIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1iZy1ncmF5LTUwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHNtOnR3LWZsZXgtcm93IHR3LWp1c3RpZnktYmV0d2VlbiB0dy1pdGVtcy1zdGFydCBzbTp0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteS0zIHNtOnR3LXNwYWNlLXktMFwiPlxyXG5cclxuICAgICAgPCEtLSBUaXRsZSBhbmQgQmFjayBCdXR0b24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1zcGFjZS14LTRcIj5cclxuICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB2YXJpYW50PVwiZ2hvc3RcIiBzaXplPVwic21cIiAoY2xpY2spPVwiZ29CYWNrKClcIiBjbGFzcz1cInR3LXRleHQtZ3JheS02MDAgaG92ZXI6dHctdGV4dC1ncmF5LTkwMFwiPlxyXG4gICAgICAgICAgPGNpZGUtZWxlLWljb24gY2xhc3M9XCJ0dy13LTQgdHctaC00XCI+YXJyb3dfYmFjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+XHJcbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXRleHQtYmx1ZS02MDAgdHctdy01IHR3LWgtNVwiPnBhbGV0dGU8L2NpZGUtZWxlLWljb24+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJ0dy10ZXh0LWJhc2UgdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTkwMCB0dy1tLTBcIj5UaGVtZSBNYW5hZ2VtZW50PC9oNT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS01MDAgdHctbS0wXCI+UGFnZToge3sgcGFnZVRpdGxlKCkgfX08L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XHJcbiAgICBAaWYgKGVycm9yKCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1tdC00IHR3LXAtNCB0dy1iZy1yZWQtNTAgdHctYm9yZGVyIHR3LWJvcmRlci1yZWQtMjAwIHR3LXJvdW5kZWQtbWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtc3RhcnRcIj5cclxuICAgICAgICA8Y2lkZS1lbGUtaWNvbiBuYW1lPVwiZXJyb3JcIiBjbGFzcz1cInR3LXRleHQtcmVkLTQwMCB0dy13LTUgdHctaC01IHR3LW10LTAuNSB0dy1mbGV4LXNocmluay0wXCI+PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1tbC0zXCI+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LWZvbnQtbWVkaXVtIHR3LXRleHQtcmVkLTgwMCB0dy1tLTBcIj5FcnJvcjwvaDM+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInR3LXRleHQtc20gdHctdGV4dC1yZWQtNzAwIHR3LW10LTEgdHctbS0wXCI+e3sgZXJyb3IoKSB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFF1aWNrIEFkZC9FZGl0IEZvcm0gU2VjdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1weC02IHR3LXB5LTQgdHctYmctd2hpdGUgdHctb3ZlcmZsb3ctYXV0b1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktYmV0d2VlbiB0dy1tYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1zcGFjZS14LTNcIj5cclxuICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXRleHQtYmx1ZS02MDAgdHctdy01IHR3LWgtNVwiPnt7IGlzRWRpdE1vZGUoKSA/ICdlZGl0JyA6ICdhZGQnIH19PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgIDxoNiBjbGFzcz1cInR3LXRleHQtc20gdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTkwMCB0dy1tLTBcIj57eyBpc0VkaXRNb2RlKCkgPyAnRWRpdCBUaGVtZScgOiAnUXVpY2sgQWRkIFRoZW1lJyB9fTwvaDY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEZvcm0gKGtlcHQgYXMtaXMpIC0tPlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ0aGVtZUZvcm1cIiAobmdTdWJtaXQpPVwic2F2ZVRoZW1lKClcIiBjbGFzcz1cInR3LXNwYWNlLXktNFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMSBtZDp0dy1ncmlkLWNvbHMtMiBsZzp0dy1ncmlkLWNvbHMtMyB0dy1nYXAtNFwiPlxyXG4gICAgICAgIDwhLS0gVGhlbWUgVGl0bGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJzeXRtX3RpdGxlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV90aXRsZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGhlbWUgdGl0bGVcIiBsYWJlbD1cIlRoZW1lIFRpdGxlKlwiIHNpemU9XCJzbVwiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBUaGVtZSBDb2RlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1zcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwic3l0bV90aGVtZV9jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV90aGVtZV9jb2RlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciB0aGVtZSBjb2RlXCIgbGFiZWw9XCJUaGVtZSBDb2RlKlwiIHNpemU9XCJzbVwiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcclxuICAgICAgICAgICAgICBpZD1cInN5dG1faXNhY3RpdmVfY2JcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJBY3RpdmVcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5dG1faXNhY3RpdmVcIj5cclxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIFN1YiBUaXRsZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yXCI+XHJcbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBpZD1cInN5dG1fc3ViX3RpdGxlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV9zdWJfdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHN1YiB0aXRsZVwiIGxhYmVsPVwiU3ViIFRpdGxlXCIgc2l6ZT1cInNtXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIFByZXZpZXcgSUQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJzeXRtX3ByZXZpZXdfaWRfZm1cIiBmb3JtQ29udHJvbE5hbWU9XCJzeXRtX3ByZXZpZXdfaWRfZm1cIiBwbGFjZWhvbGRlcj1cIkVudGVyIHByZXZpZXcgaW1hZ2UgSURcIiBsYWJlbD1cIlByZXZpZXcgSW1hZ2UgSURcIiBzaXplPVwic21cIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMiBtZDp0dy1jb2wtc3Bhbi0yXCI+XHJcbiAgICAgICAgICAgIDxjaWRlLWVsZS10ZXh0YXJlYSBpZD1cInN5dG1fZGVzY1wiIGZvcm1Db250cm9sTmFtZT1cInN5dG1fZGVzY1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGhlbWUgZGVzY3JpcHRpb25cIiByb3dzPVwiMlwiIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBzaXplPVwic21cIj48L2NpZGUtZWxlLXRleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDwhLS0gQ29uZmlndXJhdGlvbiBKU09OIC0tPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yIG1kOnR3LWNvbC1zcGFuLTNcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWpzb24tZWRpdG9yIGxhYmVsPVwiQ29uZmlndXJhdGlvbiBKU09OXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV9jb25maWd1cmF0aW9uXCIgW3JlcXVpcmVkXT1cInRydWVcIiBbY29uZmlnXT1cIntcclxuICAgICAgICAgICAgICAgc2hvd0xpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICBhdXRvRm9ybWF0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICBtaW5IZWlnaHQ6IDE1MCxcclxuICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAzMDAsXHJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgdGhlbWUgY29uZmlndXJhdGlvbiBKU09OLi4uJ1xyXG4gICAgICAgICAgICAgIH1cIiBoZWxwZXJUZXh0PVwiRW50ZXIgdmFsaWQgSlNPTiBjb25maWd1cmF0aW9uIGZvciB0aGUgdGhlbWVcIj48L2NpZGUtZWxlLWpzb24tZWRpdG9yPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gTGF5b3V0IENvbmZpZ3VyYXRpb24gKyBTZWxlY3Rpb246IHJpZ2h0LXNpZGUgY2hlY2tib3ggbGlzdCAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZzp0dy1jb2wtc3Bhbi0xIHR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC1zbSB0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktNzAwXCI+TGF5b3V0ICYgU2VsZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gU2VsZWN0ZWQgdG9nZ2xlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1yb3VuZGVkLW1kIHR3LXB4LTMgdHctcHktMlwiPlxyXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzeXRtX2lzc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU2VsZWN0ZWQgKERlZmF1bHQpXCJcclxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5dG1faXNzZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cInN5dG1fbGF5b3V0XCIgY2xhc3M9XCJ0dy1iZy13aGl0ZSB0dy1ib3JkZXIgdHctYm9yZGVyLWdyYXktMjAwIHR3LXJvdW5kZWQtbWQgdHctZGl2aWRlLXkgdHctb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBTaWRlYmFyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X3NpZGViYXJfc3RhdHVzXCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJTaWRlYmFyXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfaGVhZGVyX3N0YXR1c1wiIHR5cGU9XCJjaGVja2JveFwiIGxhYmVsPVwiSGVhZGVyXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctcHgtMyB0dy1weS0yXCIgZm9ybUdyb3VwTmFtZT1cInN5dG1fbGF5b3V0X2Zvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X2Zvb3Rlcl9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIkZvb3RlclwiIHNpemU9XCJzbVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSBCcmVhZGNydW1iIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfYnJlYWRjcnVtYlwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X2JyZWFkY3J1bWJfc3RhdHVzXCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJCcmVhZGNydW1iXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIENvbnNvbGUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXB4LTMgdHctcHktMlwiIGZvcm1Hcm91cE5hbWU9XCJzeXRtX2xheW91dF9jb25zb2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfY29uc29sZV9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIkNvbnNvbGVcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0dXNcIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIFJlcXVlc3QgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXB4LTMgdHctcHktMlwiIGZvcm1Hcm91cE5hbWU9XCJzeXRtX2xheW91dF9yZXF1ZXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfcmVxdWVzdF9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIlJlcXVlc3RcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0dXNcIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDAgdHctcHQtMVwiPlRvZ2dsZSBhY3RpdmUgc2VjdGlvbnMuIE9ubHkgb25lIHRoZW1lIGNhbiBiZSBzZWxlY3RlZCBhcyBkZWZhdWx0LiBNb3JlIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmUgbGF0ZXIuPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSBEcmF3ZXIgQ29uZmlndXJhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1zcGFjZS15LTIgbWQ6dHctY29sLXNwYW4tM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXRleHQtc20gdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTcwMFwiPkRyYXdlcnM8L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gdHlwZT1cImJ1dHRvblwiIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJvdXRsaW5lXCIgKGNsaWNrKT1cImFkZERyYXdlcigpXCI+XHJcbiAgICAgICAgICAgICAgICBBZGQgRHJhd2VyXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yXCIgZm9ybUFycmF5TmFtZT1cInN5dG1fbGF5b3V0X2RyYXdlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHJhd2VyR3JwIG9mIGRyYXdlckFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwidHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1yb3VuZGVkLW1kIHR3LXAtMyB0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1nYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJkcmF3ZXJfYWN0aXZlX3t7aX19XCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJBY3RpdmVcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzeXRoX3N0YXR1c1wiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4LTFcIj5cclxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJhd2VyX2NvbmZpZ197e2l9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRyYXdlciBGb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZHJhd2VyQ29uZmlnT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXRoX2NvbmZpZ19zeWNvX2ZvclwiPlxyXG4gICAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc2l6ZT1cInhzXCIgdmFyaWFudD1cImdob3N0XCIgKGNsaWNrKT1cInJlbW92ZURyYXdlcihpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pY29uIGNsYXNzPVwidHctdy00IHR3LWgtNFwiPmRlbGV0ZTwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDBcIj5Db25maWd1cmUgbXVsdGlwbGUgZHJhd2VycyBhcyBuZWVkZWQuPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRm9ybSBBY3Rpb25zIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHR3LWdhcC0yIHR3LXB0LTQgdHctYm9yZGVyLXQgdHctYm9yZGVyLWdyYXktMjAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1lbmQgdHctc3BhY2UteC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVcIiAoY2xpY2spPVwiY2FuY2VsRm9ybSgpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gdHlwZT1cInN1Ym1pdFwiIHZhcmlhbnQ9XCJwcmltYXJ5XCIgbGVmdEljb249XCJhZGRcIiBbZGlzYWJsZWRdPVwiIXRoZW1lRm9ybS52YWxpZCB8fCBsb2FkaW5nKClcIiBbbG9hZGluZ109XCJsb2FkaW5nKClcIj5cclxuICAgICAgICAgIHt7IGlzRWRpdE1vZGUoKSA/ICdVcGRhdGUgVGhlbWUnIDogJ0NyZWF0ZSBUaGVtZScgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFJpZ2h0OiBUaGVtZSBnYWxsZXJ5ICg0MCUpIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dy1oaWRkZW4gbGc6dHctZmxleCB0dy13LTIvNSB0dy1mbGV4LWNvbFwiPlxyXG4gICAgPCEtLSAoSGVhZGVyIGNvbnNvbGlkYXRlZCBhYm92ZSkgLS0+XHJcblxyXG4gICAgPCEtLSBHYWxsZXJ5IGxpc3QgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctZmxleC0xIHR3LW92ZXJmbG93LWF1dG8gdHctYmctZ3JheS01MFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMSBtZDp0dy1ncmlkLWNvbHMtMiB0dy1nYXAtMyB0dy1wLTRcIj5cclxuICAgICAgICBAZm9yICh0aGVtZSBvZiBmaWx0ZXJlZFRoZW1lcygpOyB0cmFjayB0aGVtZS5faWQpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1yb3VuZGVkLW1kIHR3LXRyYW5zaXRpb24gdHctY3Vyc29yLXBvaW50ZXIgdHctcmVsYXRpdmVcIlxyXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0aGVtZS5zeXRtX2lzc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICA/ICd0dy1ib3JkZXIgdHctYm9yZGVyLWJsdWUtNTAwIHR3LXJpbmctMiB0dy1yaW5nLWJsdWUtMjAwIHR3LWJnLWJsdWUtNTAvNTAnXHJcbiAgICAgICAgICAgICAgICAgOiAndHctYmctd2hpdGUgdHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCBob3Zlcjp0dy1zaGFkb3ctc20nXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0aGVtZS5zeXRtX2lzc2VsZWN0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCB0aGVtZSAnICsgKHRoZW1lLnN5dG1fdGl0bGUgfHwgdGhlbWUuc3l0bV90aGVtZV9jb2RlKVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgZWRpdFRoZW1lKHRoZW1lKVwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBiYWRnZSAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRoZW1lLnN5dG1faXNzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy10b3AtMiB0dy1yaWdodC0yIHR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LXctNiB0dy1oLTYgdHctcm91bmRlZC1mdWxsIHR3LWJnLWJsdWUtNjAwIHR3LXRleHQtd2hpdGVcIj5cclxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctNCB0dy1oLTRcIj5jaGVjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LWFzcGVjdC1bMTYvOV0gdHctYmctZ3JheS0xMDAgdHctcm91bmRlZC10LW1kIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1qdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZ2V0UHJldmlld1VybCh0aGVtZSkpIHtcclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJnZXRQcmV2aWV3VXJsKHRoZW1lKVwiIGNsYXNzPVwidHctdy1mdWxsIHR3LWgtZnVsbCB0dy1vYmplY3QtY292ZXJcIiBhbHQ9XCJQcmV2aWV3XCIgLz5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNDAwIHR3LXRleHQteHNcIj5ObyBwcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXAtMyB0dy1zcGFjZS15LTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC1zbSB0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktOTAwIHR3LXRydW5jYXRlXCIgW3RpdGxlXT1cInRoZW1lLnN5dG1fdGl0bGVcIj57eyB0aGVtZS5zeXRtX3RpdGxlIHx8ICdVbnRpdGxlZCBUaGVtZScgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwIHR3LXRydW5jYXRlXCIgW3RpdGxlXT1cInRoZW1lLnN5dG1fdGhlbWVfY29kZVwiPnt7IHRoZW1lLnN5dG1fdGhlbWVfY29kZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1qdXN0aWZ5LWJldHdlZW4gdHctcHQtMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy1pbmxpbmUtZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctZ2FwLTEgdHctdGV4dC14c1wiIFtuZ0NsYXNzXT1cInRoZW1lLnN5dG1faXNhY3RpdmUgPyAndHctdGV4dC1ncmVlbi03MDAnIDogJ3R3LXRleHQtcmVkLTcwMCdcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy13LTEuNSB0dy1oLTEuNSB0dy1yb3VuZGVkLWZ1bGxcIiBbbmdDbGFzc109XCJ0aGVtZS5zeXRtX2lzYWN0aXZlID8gJ3R3LWJnLWdyZWVuLTUwMCcgOiAndHctYmctcmVkLTUwMCdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHRoZW1lLnN5dG1faXNhY3RpdmUgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1nYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFNldCBTZWxlY3RlZCBCdXR0b24gLSBDbGVhciBhbmQgU2ltcGxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICBAaWYgKHRoZW1lLnN5dG1faXNzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctaW5saW5lLWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWdhcC0xIHR3LXB4LTIgdHctcHktMSB0dy1iZy1ncmVlbi0xMDAgdHctdGV4dC1ncmVlbi04MDAgdHctcm91bmRlZC1tZCB0dy10ZXh0LXhzIHR3LWZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctMyB0dy1oLTNcIj5jaGVjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHNldFNlbGVjdGVkVGhlbWUodGhlbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdCAnICsgKHRoZW1lLnN5dG1fdGl0bGUgfHwgdGhlbWUuc3l0bV90aGVtZV9jb2RlKSArICcgdGhlbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctdGV4dC14c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJ4c1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0VkaXQgdGhlbWUgJyArICh0aGVtZS5zeXRtX3RpdGxlIHx8IHRoZW1lLnN5dG1fdGhlbWVfY29kZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctNCB0dy1oLTRcIj5lZGl0PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJ4c1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGRlbGV0ZVRoZW1lKHRoZW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlIHRoZW1lICcgKyAodGhlbWUuc3l0bV90aXRsZSB8fCB0aGVtZS5zeXRtX3RoZW1lX2NvZGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24gY2xhc3M9XCJ0dy13LTQgdHctaC00XCI+ZGVsZXRlPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGlmICghbG9hZGluZygpICYmIGZpbHRlcmVkVGhlbWVzKCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctY29sLXNwYW4tZnVsbCB0dy10ZXh0LWNlbnRlciB0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDAgdHctcHktOFwiPk5vIHRoZW1lcyBmb3VuZDwvZGl2PlxyXG4gICAgICAgIH1cclxuICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gXHJcbiAgQW5ndWxhciBUZW1wbGF0ZSBSZWZlcmVuY2VzIGZvciBHcmlkIFJlbmRlcmVycyAoQmVzdCBQcmFjdGljZSlcclxuICBcclxuICBUaGVzZSBuZy10ZW1wbGF0ZSBlbGVtZW50cyByZXByZXNlbnQgdGhlIEFuZ3VsYXIgYmVzdCBwcmFjdGljZSBmb3IgY3VzdG9tIHJlbmRlcmluZy5cclxuICBUaGV5IHByb3ZpZGU6XHJcbiAgLSBUeXBlIHNhZmV0eSB3aXRoIHRlbXBsYXRlIGNvbnRleHRcclxuICAtIENvbXBvbmVudCBsaWZlY3ljbGUgaW50ZWdyYXRpb25cclxuICAtIENoYW5nZSBkZXRlY3Rpb24gb3B0aW1pemF0aW9uXHJcbiAgLSBQcm9wZXIgZXZlbnQgaGFuZGxpbmdcclxuICAtIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXNcclxuICBcclxuICBOb3RlOiBDdXJyZW50IGRhdGEgZ3JpZCB1c2VzIHN0cmluZyByZW5kZXJlcnMgZm9yIGNvbXBhdGliaWxpdHkuXHJcbiAgVGVtcGxhdGVzIGFyZSBtYWludGFpbmVkIGZvciBmdXR1cmUgY29tcG9uZW50IGVuaGFuY2VtZW50LlxyXG4tLT5cclxuXHJcbjwhLS0gVGhlbWUgRGV0YWlscyBSZW5kZXJlciBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICN0aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1taW4tdy0wXCI+XHJcbiAgICA8IS0tIFRoZW1lIEljb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctZmxleC1zaHJpbmstMFwiPlxyXG4gICAgICA8Y2lkZS1lbGUtaWNvbiBcclxuICAgICAgICBjbGFzcz1cInR3LXRleHQtcHVycGxlLTYwMFwiIFxyXG4gICAgICAgIHNpemU9XCJ4c1wiPlxyXG4gICAgICAgIHBhbGV0dGVcclxuICAgICAgPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDwhLS0gVGhlbWUgRGV0YWlscyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1tbC0zIHR3LW1pbi13LTAgdHctZmxleC0xXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LWZvbnQtbWVkaXVtIHR3LXRleHQtZ3JheS05MDAgdHctdHJ1bmNhdGVcIiBcclxuICAgICAgICAgICBbdGl0bGVdPVwicm93LnN5dG1fdGl0bGVcIj5cclxuICAgICAgICB7eyByb3cuc3l0bV90aXRsZSB8fCAnVW50aXRsZWQnIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKHJvdy5zeXRtX2Rlc2MpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwIHR3LXRydW5jYXRlXCIgXHJcbiAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnN5dG1fZGVzY1wiPlxyXG4gICAgICAgICAge3sgcm93LnN5dG1fZGVzYyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gVGhlbWUgU3RhdHVzIFJlbmRlcmVyIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI3RoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8c3BhbiBjbGFzcz1cInR3LWlubGluZS1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1weC0yLjUgdHctcHktMC41IHR3LXJvdW5kZWQtZnVsbCB0dy10ZXh0LXhzIHR3LWZvbnQtbWVkaXVtIHR3LXdoaXRlc3BhY2Utbm93cmFwXCJcclxuICAgICAgICBbbmdDbGFzc109XCJyb3cuc3l0bV9pc2FjdGl2ZSA/ICd0dy1iZy1ncmVlbi0xMDAgdHctdGV4dC1ncmVlbi04MDAnIDogJ3R3LWJnLXJlZC0xMDAgdHctdGV4dC1yZWQtODAwJ1wiPlxyXG4gICAge3sgcm93LnN5dG1faXNhY3RpdmUgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScgfX1cclxuICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIEFjdGlvbnMgRHJvcGRvd24gUmVuZGVyZXIgVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8Y2lkZS1lbGUtZHJvcGRvd24gXHJcbiAgICBbaXRlbXNdPVwiZ2V0QWN0aW9uRHJvcGRvd25JdGVtcyhyb3cpXCJcclxuICAgIFtjb25maWddPVwieyB0cmlnZ2VySWNvbjogJ21vcmVfdmVydCcsIHRyaWdnZXJTaXplOiAnc20nIH1cIlxyXG4gICAgKGl0ZW1DbGljayk9XCJvbkRyb3Bkb3duSXRlbUNsaWNrKCRldmVudCwgcm93KVwiPlxyXG4gIDwvY2lkZS1lbGUtZHJvcGRvd24+XHJcbjwvbmctdGVtcGxhdGU+ICJdfQ==
|