cloud-ide-core 0.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.
Files changed (61) hide show
  1. package/README.md +49 -10
  2. package/fesm2022/cloud-ide-core-general-master-type.component-BNYoP_bS.mjs +609 -0
  3. package/fesm2022/cloud-ide-core-general-master-type.component-BNYoP_bS.mjs.map +1 -0
  4. package/fesm2022/cloud-ide-core-general-master-type.service-8JWTVijZ.mjs +206 -0
  5. package/fesm2022/cloud-ide-core-general-master-type.service-8JWTVijZ.mjs.map +1 -0
  6. package/fesm2022/cloud-ide-core-general-master.component-CFGGHinl.mjs +901 -0
  7. package/fesm2022/cloud-ide-core-general-master.component-CFGGHinl.mjs.map +1 -0
  8. package/fesm2022/cloud-ide-core-page-form.component-vfE-LkTS.mjs +215 -0
  9. package/fesm2022/cloud-ide-core-page-form.component-vfE-LkTS.mjs.map +1 -0
  10. package/fesm2022/cloud-ide-core.mjs +1280 -1105
  11. package/fesm2022/cloud-ide-core.mjs.map +1 -1
  12. package/index.d.ts +1736 -3
  13. package/package.json +3 -5
  14. package/esm2022/cloud-ide-core.mjs +0 -5
  15. package/esm2022/lib/cloud-ide-core.component.mjs +0 -19
  16. package/esm2022/lib/cloud-ide-core.service.mjs +0 -14
  17. package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +0 -768
  18. package/esm2022/lib/core/department-management/index.mjs +0 -5
  19. package/esm2022/lib/core/department-management/services/department-management.service.mjs +0 -187
  20. package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +0 -1122
  21. package/esm2022/lib/core/designation-management/index.mjs +0 -5
  22. package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +0 -194
  23. package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +0 -794
  24. package/esm2022/lib/core/grade-level-management/index.mjs +0 -5
  25. package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +0 -172
  26. package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +0 -1135
  27. package/esm2022/lib/core/menu-management/index.mjs +0 -10
  28. package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +0 -11
  29. package/esm2022/lib/core/menu-management/mock-data/menu-items.json +0 -311
  30. package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +0 -230
  31. package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +0 -483
  32. package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +0 -393
  33. package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +0 -767
  34. package/esm2022/lib/core/page-management/index.mjs +0 -10
  35. package/esm2022/lib/core/page-management/services/page-controls.service.mjs +0 -136
  36. package/esm2022/lib/core/page-management/services/page-management.service.mjs +0 -98
  37. package/esm2022/lib/core/page-management/services/page-theme.service.mjs +0 -107
  38. package/esm2022/public-api.mjs +0 -16
  39. package/lib/cloud-ide-core.component.d.ts +0 -5
  40. package/lib/cloud-ide-core.service.d.ts +0 -6
  41. package/lib/core/department-management/components/department-list/department-list.component.d.ts +0 -178
  42. package/lib/core/department-management/index.d.ts +0 -2
  43. package/lib/core/department-management/services/department-management.service.d.ts +0 -68
  44. package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +0 -242
  45. package/lib/core/designation-management/index.d.ts +0 -2
  46. package/lib/core/designation-management/services/designation-management.service.d.ts +0 -69
  47. package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +0 -199
  48. package/lib/core/grade-level-management/index.d.ts +0 -2
  49. package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +0 -69
  50. package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +0 -278
  51. package/lib/core/menu-management/index.d.ts +0 -3
  52. package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +0 -30
  53. package/lib/core/menu-management/services/menu-management.service.d.ts +0 -85
  54. package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +0 -126
  55. package/lib/core/page-management/components/page-list/page-list.component.d.ts +0 -91
  56. package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +0 -189
  57. package/lib/core/page-management/index.d.ts +0 -6
  58. package/lib/core/page-management/services/page-controls.service.d.ts +0 -54
  59. package/lib/core/page-management/services/page-management.service.d.ts +0 -42
  60. package/lib/core/page-management/services/page-theme.service.d.ts +0 -43
  61. package/public-api.d.ts +0 -7
@@ -1,483 +0,0 @@
1
- import { Component, signal, computed, DestroyRef, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';
4
- import { ActivatedRoute, Router } from '@angular/router';
5
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { PageControlsService } from '../../services/page-controls.service';
7
- import { AppStateHelperService } from 'cloud-ide-layout';
8
- import { CideEleButtonComponent, CideIconComponent, CideInputComponent, CideSelectComponent, CideEleDropdownComponent } 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 PageControlsComponent {
14
- constructor() {
15
- // Dependency injection
16
- this.destroyRef = inject(DestroyRef);
17
- this.controlsService = inject(PageControlsService);
18
- this.appState = inject(AppStateHelperService);
19
- this.fb = inject(NonNullableFormBuilder);
20
- this.router = inject(Router);
21
- this.route = inject(ActivatedRoute);
22
- // Make Math available in template
23
- this.Math = Math;
24
- // Signals for reactive state management
25
- this.controls = signal([]);
26
- this.loading = signal(false);
27
- this.error = signal(null);
28
- this.selectedItems = signal([]);
29
- this.searchTerm = signal('');
30
- // Page information
31
- this.pageId = signal('');
32
- this.pageTitle = signal('');
33
- // Form state
34
- this.isEditMode = signal(false);
35
- this.editingControlId = signal(null);
36
- this.retrievedControl = signal(null);
37
- // Control selection for new layout
38
- this.selectedControlId = signal(null);
39
- // Pagination signals
40
- this.currentPage = signal(1);
41
- this.pageSize = signal(10);
42
- this.totalItems = signal(0);
43
- // Modern reactive forms with signals - No validators for simplicity
44
- this.controlForm = this.fb.group({
45
- sype_key: [''],
46
- sype_label: [''],
47
- sype_label_hide: [false],
48
- sype_auto_complete: [false], // Changed to boolean for checkbox
49
- sype_hide_helper_and_error_text: [false],
50
- sype_type: [''], // controlType
51
- sype_option_key: [''],
52
- sype_placeholder: [''],
53
- sype_min_length: [0],
54
- sype_max_length: [20],
55
- sype_regex: [''],
56
- sype_required: [false],
57
- sype_disabled: [false],
58
- sype_width: [''], // Changed to string for px values like "20px"
59
- sype_height: [''], // Changed to string for px values like "20px"
60
- sype_label_placement: ['left'],
61
- sype_helper_text_collapse: [false],
62
- sype_default: [''],
63
- sype_tooltip: [''],
64
- sype_size: ['sm'], // Changed default to small
65
- sype_leading_icon: [''],
66
- sype_isactive: [true],
67
- sype_entity_id_syen: ['']
68
- });
69
- // Computed values
70
- this.isFormDirty = computed(() => this.controlForm.dirty);
71
- }
72
- ngOnInit() {
73
- this.initializeComponent();
74
- }
75
- /**
76
- * Initialize component
77
- */
78
- initializeComponent() {
79
- // Get page information from route
80
- this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
81
- const queryParams = params['query'];
82
- const queryData = generateObjectFromString(queryParams);
83
- this.pageId.set(queryData?.sypg_id || '');
84
- this.pageTitle.set(queryData?.sypg_title || '');
85
- if (this.pageId()) {
86
- this.loadControls();
87
- this.setupFormSubscriptions();
88
- this.setEntityIdFromAppState();
89
- }
90
- else {
91
- this.error.set('No page ID provided');
92
- }
93
- });
94
- }
95
- /**
96
- * Set entity ID from app state - auto-assigned internally
97
- */
98
- setEntityIdFromAppState() {
99
- const entityId = this.appState.getActiveEntityId();
100
- if (entityId) {
101
- this.controlForm.patchValue({
102
- sype_entity_id_syen: entityId
103
- });
104
- // Disable the entity field since it's auto-assigned
105
- this.controlForm.get('sype_entity_id_syen')?.disable();
106
- }
107
- }
108
- /**
109
- * Load controls from API
110
- */
111
- loadControls() {
112
- this.loading.set(true);
113
- this.error.set(null);
114
- const request = {
115
- sype_page_id_sypg: this.pageId()
116
- };
117
- this.controlsService.getControlList(request)
118
- .pipe(takeUntilDestroyed(this.destroyRef))
119
- .subscribe({
120
- next: (response) => {
121
- if (response.success) {
122
- this.controls.set(response.data || []);
123
- this.totalItems.set(response.total || 0);
124
- }
125
- else {
126
- this.error.set(response.message || 'Failed to load controls');
127
- }
128
- this.loading.set(false);
129
- },
130
- error: (error) => {
131
- console.error('Error loading controls:', error);
132
- this.error.set('Failed to load controls. Please try again.');
133
- this.loading.set(false);
134
- }
135
- });
136
- }
137
- /**
138
- * Setup form subscriptions
139
- */
140
- setupFormSubscriptions() {
141
- // Watch for form changes to enable/disable save button
142
- this.controlForm.valueChanges
143
- .pipe(takeUntilDestroyed(this.destroyRef))
144
- .subscribe(() => {
145
- // Form validation is handled by computed signals
146
- });
147
- }
148
- /**
149
- * Create new control
150
- */
151
- createControl() {
152
- const formValue = this.controlForm.getRawValue();
153
- const entityId = this.appState.getActiveEntityId();
154
- const newControl = {
155
- _id: '',
156
- sype_key: formValue.sype_key,
157
- sype_page_id_sypg: this.pageId(),
158
- sype_label: formValue.sype_label,
159
- sype_label_hide: formValue.sype_label_hide,
160
- sype_auto_complete: formValue.sype_auto_complete,
161
- sype_hide_helper_and_error_text: formValue.sype_hide_helper_and_error_text,
162
- sype_type: formValue.sype_type,
163
- sype_option_key: formValue.sype_option_key,
164
- sype_placeholder: formValue.sype_placeholder,
165
- sype_min_length: formValue.sype_min_length,
166
- sype_max_length: formValue.sype_max_length,
167
- sype_regex: formValue.sype_regex,
168
- sype_required: formValue.sype_required,
169
- sype_disabled: formValue.sype_disabled,
170
- sype_width: formValue.sype_width,
171
- sype_height: formValue.sype_height,
172
- sype_label_placement: formValue.sype_label_placement,
173
- sype_helper_text_collapse: formValue.sype_helper_text_collapse,
174
- sype_default: formValue.sype_default,
175
- sype_tooltip: formValue.sype_tooltip,
176
- sype_size: formValue.sype_size,
177
- sype_leading_icon: formValue.sype_leading_icon,
178
- sype_isactive: formValue.sype_isactive,
179
- sype_entity_id_syen: entityId || formValue.sype_entity_id_syen
180
- };
181
- this.loading.set(true);
182
- this.controlsService.createControl(newControl)
183
- .pipe(takeUntilDestroyed(this.destroyRef))
184
- .subscribe({
185
- next: (response) => {
186
- if (response.success) {
187
- this.resetForm();
188
- this.loadControls();
189
- console.log('Control created successfully');
190
- }
191
- else {
192
- console.error(response.message || 'Failed to create control');
193
- }
194
- this.loading.set(false);
195
- },
196
- error: (error) => {
197
- console.error('Error creating control:', error);
198
- console.error('Failed to create control. Please try again.');
199
- this.loading.set(false);
200
- }
201
- });
202
- }
203
- /**
204
- * Update existing control
205
- */
206
- updateControl() {
207
- if (!this.editingControlId()) {
208
- return;
209
- }
210
- const formValue = this.controlForm.getRawValue();
211
- const entityId = this.appState.getActiveEntityId();
212
- const updatedControl = {
213
- _id: this.editingControlId(),
214
- sype_key: formValue.sype_key,
215
- sype_page_id_sypg: this.pageId(),
216
- sype_label: formValue.sype_label,
217
- sype_label_hide: formValue.sype_label_hide,
218
- sype_auto_complete: Boolean(formValue.sype_auto_complete),
219
- sype_hide_helper_and_error_text: formValue.sype_hide_helper_and_error_text,
220
- sype_type: formValue.sype_type,
221
- sype_option_key: formValue.sype_option_key,
222
- sype_placeholder: formValue.sype_placeholder,
223
- sype_min_length: formValue.sype_min_length,
224
- sype_max_length: formValue.sype_max_length,
225
- sype_regex: formValue.sype_regex,
226
- sype_required: formValue.sype_required,
227
- sype_disabled: formValue.sype_disabled,
228
- sype_width: formValue.sype_width,
229
- sype_height: formValue.sype_height,
230
- sype_label_placement: formValue.sype_label_placement,
231
- sype_helper_text_collapse: formValue.sype_helper_text_collapse,
232
- sype_default: formValue.sype_default,
233
- sype_tooltip: formValue.sype_tooltip,
234
- sype_size: formValue.sype_size,
235
- sype_leading_icon: formValue.sype_leading_icon,
236
- sype_isactive: formValue.sype_isactive,
237
- sype_entity_id_syen: entityId || formValue.sype_entity_id_syen
238
- };
239
- this.loading.set(true);
240
- this.controlsService.updateControl(updatedControl)
241
- .pipe(takeUntilDestroyed(this.destroyRef))
242
- .subscribe({
243
- next: (response) => {
244
- if (response.success) {
245
- this.resetForm();
246
- this.loadControls();
247
- console.log('Control updated successfully');
248
- }
249
- else {
250
- console.error(response.message || 'Failed to update control');
251
- }
252
- this.loading.set(false);
253
- },
254
- error: (error) => {
255
- console.error('Error updating control:', error);
256
- console.error('Failed to update control. Please try again.');
257
- this.loading.set(false);
258
- }
259
- });
260
- }
261
- /**
262
- * Edit control
263
- */
264
- editControl(control) {
265
- this.isEditMode.set(true);
266
- this.editingControlId.set(control._id || null);
267
- this.retrievedControl.set(control);
268
- this.controlForm.patchValue({
269
- sype_key: control.sype_key,
270
- sype_label: control.sype_label,
271
- sype_label_hide: control.sype_label_hide,
272
- sype_auto_complete: control.sype_auto_complete ? true : false,
273
- sype_hide_helper_and_error_text: control.sype_hide_helper_and_error_text,
274
- sype_type: control.sype_type,
275
- sype_option_key: control.sype_option_key,
276
- sype_placeholder: control.sype_placeholder,
277
- sype_min_length: control.sype_min_length,
278
- sype_max_length: control.sype_max_length,
279
- sype_regex: control.sype_regex,
280
- sype_required: control.sype_required,
281
- sype_disabled: control.sype_disabled,
282
- sype_width: control.sype_width?.toString() || '',
283
- sype_height: control.sype_height?.toString() || '',
284
- sype_label_placement: control.sype_label_placement,
285
- sype_helper_text_collapse: control.sype_helper_text_collapse,
286
- sype_default: control.sype_default,
287
- sype_tooltip: control.sype_tooltip,
288
- sype_size: control.sype_size,
289
- sype_leading_icon: control.sype_leading_icon,
290
- sype_isactive: control.sype_isactive,
291
- sype_entity_id_syen: String(control.sype_entity_id_syen || '')
292
- });
293
- this.controlForm.markAsPristine();
294
- }
295
- /**
296
- * Delete control
297
- */
298
- deleteControl(control) {
299
- if (confirm(`Are you sure you want to delete the control "${control.sype_label}"?`)) {
300
- this.loading.set(true);
301
- this.controlsService.deleteControl(control._id || '')
302
- .pipe(takeUntilDestroyed(this.destroyRef))
303
- .subscribe({
304
- next: (response) => {
305
- if (response.success) {
306
- this.loadControls();
307
- console.log('Control deleted successfully');
308
- }
309
- else {
310
- console.error(response.message || 'Failed to delete control');
311
- }
312
- this.loading.set(false);
313
- },
314
- error: (error) => {
315
- console.error('Error deleting control:', error);
316
- console.error('Failed to delete control. Please try again.');
317
- this.loading.set(false);
318
- }
319
- });
320
- }
321
- }
322
- /**
323
- * Toggle control status
324
- */
325
- toggleControlStatus(control) {
326
- this.loading.set(true);
327
- this.controlsService.toggleControlStatus({ sype_id: control._id || '', sype_isactive: !control.sype_isactive })
328
- .pipe(takeUntilDestroyed(this.destroyRef))
329
- .subscribe({
330
- next: (response) => {
331
- if (response.success) {
332
- this.loadControls();
333
- console.log(`Control ${control.sype_isactive ? 'deactivated' : 'activated'} successfully`);
334
- }
335
- else {
336
- console.error(response.message || 'Failed to toggle control status');
337
- }
338
- this.loading.set(false);
339
- },
340
- error: (error) => {
341
- console.error('Error toggling control status:', error);
342
- console.error('Failed to toggle control status. Please try again.');
343
- this.loading.set(false);
344
- }
345
- });
346
- }
347
- /**
348
- * Save control (create or update)
349
- */
350
- saveControl() {
351
- if (this.isEditMode()) {
352
- this.updateControl();
353
- }
354
- else {
355
- this.createControl();
356
- }
357
- }
358
- /**
359
- * Cancel form
360
- */
361
- cancelForm() {
362
- this.resetForm();
363
- }
364
- /**
365
- * Go back to page list
366
- */
367
- goBack() {
368
- this.router.navigate(['/core/page']);
369
- }
370
- /**
371
- * Reset form
372
- */
373
- resetForm() {
374
- const entityId = this.appState.getActiveEntityId();
375
- this.controlForm.reset({
376
- sype_key: '',
377
- sype_label: '',
378
- sype_label_hide: false,
379
- sype_auto_complete: false,
380
- sype_hide_helper_and_error_text: false,
381
- sype_type: '',
382
- sype_option_key: '',
383
- sype_placeholder: '',
384
- sype_min_length: 0,
385
- sype_max_length: 20,
386
- sype_regex: '',
387
- sype_required: false,
388
- sype_disabled: false,
389
- sype_width: '',
390
- sype_height: '',
391
- sype_label_placement: 'floating',
392
- sype_helper_text_collapse: false,
393
- sype_default: '',
394
- sype_tooltip: '',
395
- sype_size: 'md',
396
- sype_leading_icon: '',
397
- sype_isactive: true,
398
- sype_entity_id_syen: entityId || ''
399
- });
400
- this.isEditMode.set(false);
401
- this.editingControlId.set(null);
402
- this.retrievedControl.set(null);
403
- this.controlForm.markAsPristine();
404
- this.controlForm.markAsUntouched();
405
- }
406
- /**
407
- * Mark form as touched to trigger validation display
408
- */
409
- markFormAsTouched() {
410
- Object.keys(this.controlForm.controls).forEach(key => {
411
- const control = this.controlForm.get(key);
412
- control?.markAsTouched();
413
- });
414
- }
415
- /**
416
- * Get dropdown items for actions
417
- */
418
- getActionDropdownItems(control) {
419
- return [
420
- {
421
- id: 'edit',
422
- label: 'Edit',
423
- icon: 'edit'
424
- },
425
- {
426
- id: 'toggle',
427
- label: control.sype_isactive ? 'Deactivate' : 'Activate',
428
- icon: control.sype_isactive ? 'block' : 'check_circle'
429
- },
430
- {
431
- id: 'delete',
432
- label: 'Delete',
433
- icon: 'delete'
434
- }
435
- ];
436
- }
437
- /**
438
- * Handle dropdown item click
439
- */
440
- onDropdownItemClick(item, control) {
441
- switch (item.id) {
442
- case 'edit':
443
- this.editControl(control);
444
- break;
445
- case 'toggle':
446
- this.toggleControlStatus(control);
447
- break;
448
- case 'delete':
449
- this.deleteControl(control);
450
- break;
451
- }
452
- }
453
- /**
454
- * Close all dropdowns
455
- */
456
- closeAllDropdowns() {
457
- // This method can be used to close dropdowns if needed
458
- }
459
- // New methods for the vertical layout
460
- selectControl(control) {
461
- this.selectedControlId.set(control._id || null);
462
- console.log('Selected control:', control);
463
- }
464
- trackByControlId(index, control) {
465
- return control._id || '';
466
- }
467
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
468
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: PageControlsComponent, isStandalone: true, selector: "cide-core-app-page-controls", ngImport: i0, template: "<!-- Page Controls Container -->\n<div class=\"page-controls-container\">\n <!-- Header Section -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"goBack()\"\n class=\"back-button\">\n <cide-ele-icon>arrow_back</cide-ele-icon>\n </button>\n <div class=\"title-section\">\n <cide-ele-icon class=\"title-icon\">settings</cide-ele-icon>\n <div>\n <h1 class=\"title\">Control Management</h1>\n <p class=\"subtitle\">Page: {{ pageTitle() }}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div class=\"error-message\" *ngIf=\"error()\">\n <cide-ele-icon>error</cide-ele-icon>\n <div>\n <h3>Error</h3>\n <p>{{ error() }}</p>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Form Section -->\n <div class=\"form-section\">\n <div class=\"form-header\">\n <cide-ele-icon>{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h3>{{ isEditMode() ? 'Edit Control' : 'Quick Add Control' }}</h3>\n </div>\n\n <!-- Form -->\n <form [formGroup]=\"controlForm\" (ngSubmit)=\"saveControl()\" class=\"control-form tw-overflow-y-auto\">\n <div class=\"form-grid\">\n \n <!-- Basic Information Section -->\n <!-- Control Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_key\"\n formControlName=\"sype_key\"\n placeholder=\"Enter control key\"\n label=\"Control Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Label -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_label\"\n formControlName=\"sype_label\"\n placeholder=\"Enter control label\"\n label=\"Control Label\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Type -->\n <div class=\"form-group\">\n <cide-ele-select\n id=\"sype_type\"\n formControlName=\"sype_type\"\n [options]=\"[\n { value: 'text', label: 'Text Input' },\n { value: 'textarea', label: 'Text Area' },\n { value: 'select', label: 'Select' },\n { value: 'checkbox', label: 'Checkbox' },\n { value: 'radio', label: 'Radio' },\n { value: 'date', label: 'Date' },\n { value: 'number', label: 'Number' },\n { value: 'email', label: 'Email' },\n { value: 'password', label: 'Password' },\n { value: 'file', label: 'File Upload' }\n ]\"\n label=\"Control Type\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <!-- Status - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_isactive\"\n type=\"checkbox\"\n formControlName=\"sype_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Placeholder -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_placeholder\"\n formControlName=\"sype_placeholder\"\n placeholder=\"Enter placeholder text\"\n label=\"Placeholder\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Auto Complete - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_auto_complete\"\n type=\"checkbox\"\n formControlName=\"sype_auto_complete\"\n label=\"Auto Complete\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Tooltip -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_tooltip\"\n formControlName=\"sype_tooltip\"\n placeholder=\"Enter tooltip text\"\n label=\"Tooltip\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Validation & Sizing Section -->\n <!-- Min/Max Length - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_min_length\"\n type=\"number\"\n formControlName=\"sype_min_length\"\n placeholder=\"0\"\n label=\"Min Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_max_length\"\n type=\"number\"\n formControlName=\"sype_max_length\"\n placeholder=\"20\"\n label=\"Max Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Size & Label Placement - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_size\"\n formControlName=\"sype_size\"\n label=\"Size\"\n size=\"xs\"\n [options]=\"[\n { value: 'xs', label: 'XS' },\n { value: 'sm', label: 'SM' },\n { value: 'md', label: 'MD' },\n { value: 'lg', label: 'LG' },\n { value: 'xl', label: 'XL' },\n { value: 'xxl', label: 'XXL' }\n ]\">\n </cide-ele-select>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_label_placement\"\n formControlName=\"sype_label_placement\"\n label=\"Label Placement\"\n size=\"xs\"\n [options]=\"[\n { value: 'left', label: 'Left' },\n { value: 'floating', label: 'Floating' },\n { value: 'fixed', label: 'Fixed' }\n ]\">\n </cide-ele-select>\n </div>\n </div>\n\n <!-- Width & Height - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_width\"\n type=\"text\"\n formControlName=\"sype_width\"\n placeholder=\"20px\"\n label=\"Width\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_height\"\n type=\"text\"\n formControlName=\"sype_height\"\n placeholder=\"20px\"\n label=\"Height\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Leading Icon -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_leading_icon\"\n formControlName=\"sype_leading_icon\"\n placeholder=\"Enter icon name\"\n label=\"Leading Icon\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Default Value -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_default\"\n formControlName=\"sype_default\"\n placeholder=\"Enter default value\"\n label=\"Default Value\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Regex Pattern -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_regex\"\n formControlName=\"sype_regex\"\n placeholder=\"Enter regex pattern\"\n label=\"Regex Pattern\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Option Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_option_key\"\n formControlName=\"sype_option_key\"\n placeholder=\"Enter option key\"\n label=\"Option Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Entity ID (Auto-assigned from AppState) - Hidden -->\n <div class=\"form-group\" style=\"display: none;\">\n <cide-ele-input\n id=\"sype_entity_id_syen\"\n formControlName=\"sype_entity_id_syen\"\n placeholder=\"Auto-assigned from system\"\n label=\"Entity ID (Auto-assigned)\"\n size=\"sm\"\n readonly>\n </cide-ele-input>\n </div>\n\n <!-- Control Options -->\n <div class=\"form-group full-width\">\n <h6 class=\"options-title\">Control Options</h6>\n <div class=\"options-grid\">\n \n <!-- Required -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_required\"\n type=\"checkbox\"\n formControlName=\"sype_required\"\n label=\"Required\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Disabled -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_disabled\"\n type=\"checkbox\"\n formControlName=\"sype_disabled\"\n label=\"Disabled\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Label -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_label_hide\"\n type=\"checkbox\"\n formControlName=\"sype_label_hide\"\n label=\"Hide Label\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Helper Text -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_hide_helper_and_error_text\"\n type=\"checkbox\"\n formControlName=\"sype_hide_helper_and_error_text\"\n label=\"Hide Helper Text\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Helper Text Collapse -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_helper_text_collapse\"\n type=\"checkbox\"\n formControlName=\"sype_helper_text_collapse\"\n label=\"Collapse Helper\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n </div>\n </div>\n\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button \n cideEleButton\n type=\"button\"\n variant=\"outline\"\n (click)=\"cancelForm()\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n <button \n cideEleButton\n type=\"submit\"\n variant=\"primary\"\n [disabled]=\"loading()\">\n {{ isEditMode() ? 'Update Control' : 'Create Control' }}\n </button>\n </div>\n </form>\n </div>\n\n <!-- Controls List Section -->\n <div class=\"controls-list-section\">\n <div class=\"controls-header\">\n <h3>Page Controls</h3>\n <p>Controls connected to this page</p>\n </div>\n \n <div class=\"controls-list\" *ngIf=\"!loading() && controls().length > 0\">\n <div \n class=\"control-item\" \n *ngFor=\"let control of controls(); trackBy: trackByControlId\"\n [class.selected]=\"selectedControlId() === control._id\"\n (click)=\"selectControl(control)\"\n (keyup.enter)=\"selectControl(control)\"\n (keyup.space)=\"selectControl(control)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Select control ' + (control.sype_label || control.sype_key)\">\n <div class=\"control-header\">\n <div class=\"control-icon\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n </div>\n <div class=\"control-info\">\n <h4>{{ control.sype_label || control.sype_key }}</h4>\n <p>{{ control.sype_tooltip || 'No tooltip' }}</p>\n <div class=\"control-meta\">\n <span class=\"control-type\">{{ control.sype_type }}</span>\n <span class=\"control-status\" [class.active]=\"control.sype_isactive\">\n {{ control.sype_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n <div class=\"control-actions\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"editControl(control); $event.stopPropagation()\">\n <cide-ele-icon>edit</cide-ele-icon>\n </button>\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"deleteControl(control); $event.stopPropagation()\">\n <cide-ele-icon>delete</cide-ele-icon>\n </button>\n </div>\n </div>\n \n \n </div>\n </div>\n\n <div class=\"controls-list-empty\" *ngIf=\"!loading() && controls().length === 0\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n <p>No controls available</p>\n <small>Create controls using the form on the left</small>\n </div>\n\n <div class=\"controls-list-loading\" *ngIf=\"loading()\">\n <cide-ele-icon class=\"spinning\">refresh</cide-ele-icon>\n <p>Loading controls...</p>\n </div>\n </div>\n </div>\n</div>\n\n ", styles: [".page-controls-container{@apply tw-flex tw-flex-col tw-h-full tw-bg-gray-50;}.header{@apply tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4;}.header-content{@apply tw-flex tw-items-center tw-justify-between;}.header-left{@apply tw-flex tw-items-center tw-space-x-4;}.back-button{@apply tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-text-gray-600 hover:tw-text-gray-900 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors;}.title-section{@apply tw-flex tw-items-center tw-space-x-3;}.title-icon{@apply tw-text-blue-600 tw-text-xl;}.title{@apply tw-text-xl tw-font-semibold tw-text-gray-900 tw-mb-0;}.subtitle{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.error-message{@apply tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md tw-p-4 tw-mx-6 tw-mt-4 tw-flex tw-items-start tw-space-x-3;}.error-message cide-ele-icon{@apply tw-text-red-500 tw-flex-shrink-0 tw-mt-0.5;}.error-message h3{@apply tw-text-red-800 tw-font-medium tw-mb-1;}.error-message p{@apply tw-text-red-700 tw-text-sm tw-mb-0;}.main-content{@apply tw-flex tw-flex-1 tw-gap-6 tw-p-6 tw-overflow-hidden;}.form-section{@apply tw-w-3/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.form-header{@apply tw-flex tw-items-center tw-space-x-3 tw-p-6 tw-border-b tw-border-gray-200;}.form-header cide-ele-icon{@apply tw-text-blue-600;}.form-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-0;}.control-form{@apply tw-flex tw-flex-col tw-flex-1 tw-p-6;}.form-grid{@apply tw-grid tw-grid-cols-2 tw-gap-4 tw-mb-6;}.form-group{@apply tw-space-y-1;}.form-group.full-width{@apply tw-col-span-2;}.form-group.compact-number,.form-group.compact-select,.form-group.compact-dimension{@apply tw-max-w-32;}.form-group.compact-number{@apply tw-min-w-20;}.form-group.compact-dimension{@apply tw-min-w-24;}.form-group.compact-select{@apply tw-min-w-28;}.form-group.form-group-row{@apply tw-col-span-2 tw-flex tw-gap-4;}.form-group-half{@apply tw-flex-1 tw-space-y-1;}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.options-title{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-3;}.options-grid{@apply tw-grid tw-grid-cols-3 tw-gap-3;}.option-item{@apply tw-flex tw-items-center tw-space-x-2;}.option-checkbox{@apply tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500 focus:tw-border-blue-500;}.option-item label{@apply tw-text-sm tw-text-gray-700 tw-cursor-pointer;}.form-actions{@apply tw-flex tw-justify-end tw-space-x-3 tw-pt-4 tw-border-t tw-border-gray-200 tw-mt-auto;}.controls-list-section{@apply tw-w-2/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.controls-header{@apply tw-p-6 tw-border-b tw-border-gray-200;}.controls-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-1;}.controls-header p{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.controls-list{@apply tw-flex-1 tw-overflow-y-auto tw-p-4;}.control-item{@apply tw-bg-gray-50 tw-border tw-border-gray-200 tw-rounded-lg tw-p-4 tw-mb-3 tw-cursor-pointer tw-transition-all tw-duration-200;}.control-item:hover{@apply tw-shadow-md tw-border-gray-300;}.control-item.selected{@apply tw-bg-blue-50 tw-border-blue-300 tw-shadow-md;}.control-item:focus{@apply tw-outline-none tw-ring-2 tw-ring-blue-500 tw-ring-offset-2;}.control-item:last-child{@apply tw-mb-0;}.control-header{@apply tw-flex tw-items-start tw-space-x-3;}.control-icon{@apply tw-flex-shrink-0 tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center;}.control-icon cide-ele-icon{@apply tw-text-blue-600;}.control-info{@apply tw-flex-1 tw-min-w-0;}.control-info h4{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-1 tw-truncate;}.control-info p{@apply tw-text-xs tw-text-gray-500 tw-mb-2 tw-truncate;}.control-meta{@apply tw-flex tw-items-center tw-space-x-2;}.control-type{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-800;}.control-status{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800;}.control-status.active{@apply tw-bg-green-100 tw-text-green-800;}.control-actions{@apply tw-flex tw-items-center tw-space-x-1 tw-opacity-0 tw-transition-opacity tw-duration-200;}.control-item:hover .control-actions,.control-item.selected .control-actions{@apply tw-opacity-100;}.controls-list-empty{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-empty cide-ele-icon{@apply tw-text-4xl tw-text-gray-300 tw-mb-4;}.controls-list-empty p{@apply tw-text-gray-500 tw-font-medium tw-mb-1;}.controls-list-empty small{@apply tw-text-gray-400;}.controls-list-loading{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-loading cide-ele-icon{@apply tw-text-2xl tw-text-blue-500 tw-mb-4;}.controls-list-loading p{@apply tw-text-gray-500;}.spinning{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 1024px){.main-content{@apply tw-flex-col;}.form-section{@apply tw-w-full;}.controls-list-section{@apply tw-w-full tw-max-h-96;}.form-grid{@apply tw-grid-cols-1;}.options-grid{@apply tw-grid-cols-2;}}@media (max-width: 640px){.main-content{@apply tw-p-4 tw-gap-4;}.form-grid{@apply tw-gap-3;}.form-actions{@apply tw-flex-col tw-space-x-0 tw-space-y-2;}.options-grid{@apply tw-grid-cols-1;}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }] }); }
469
- }
470
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageControlsComponent, decorators: [{
471
- type: Component,
472
- args: [{ selector: 'cide-core-app-page-controls', standalone: true, imports: [
473
- CommonModule,
474
- ReactiveFormsModule,
475
- FormsModule,
476
- CideEleButtonComponent,
477
- CideInputComponent,
478
- CideSelectComponent,
479
- CideIconComponent,
480
- CideEleDropdownComponent
481
- ], template: "<!-- Page Controls Container -->\n<div class=\"page-controls-container\">\n <!-- Header Section -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"goBack()\"\n class=\"back-button\">\n <cide-ele-icon>arrow_back</cide-ele-icon>\n </button>\n <div class=\"title-section\">\n <cide-ele-icon class=\"title-icon\">settings</cide-ele-icon>\n <div>\n <h1 class=\"title\">Control Management</h1>\n <p class=\"subtitle\">Page: {{ pageTitle() }}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div class=\"error-message\" *ngIf=\"error()\">\n <cide-ele-icon>error</cide-ele-icon>\n <div>\n <h3>Error</h3>\n <p>{{ error() }}</p>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Form Section -->\n <div class=\"form-section\">\n <div class=\"form-header\">\n <cide-ele-icon>{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h3>{{ isEditMode() ? 'Edit Control' : 'Quick Add Control' }}</h3>\n </div>\n\n <!-- Form -->\n <form [formGroup]=\"controlForm\" (ngSubmit)=\"saveControl()\" class=\"control-form tw-overflow-y-auto\">\n <div class=\"form-grid\">\n \n <!-- Basic Information Section -->\n <!-- Control Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_key\"\n formControlName=\"sype_key\"\n placeholder=\"Enter control key\"\n label=\"Control Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Label -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_label\"\n formControlName=\"sype_label\"\n placeholder=\"Enter control label\"\n label=\"Control Label\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Type -->\n <div class=\"form-group\">\n <cide-ele-select\n id=\"sype_type\"\n formControlName=\"sype_type\"\n [options]=\"[\n { value: 'text', label: 'Text Input' },\n { value: 'textarea', label: 'Text Area' },\n { value: 'select', label: 'Select' },\n { value: 'checkbox', label: 'Checkbox' },\n { value: 'radio', label: 'Radio' },\n { value: 'date', label: 'Date' },\n { value: 'number', label: 'Number' },\n { value: 'email', label: 'Email' },\n { value: 'password', label: 'Password' },\n { value: 'file', label: 'File Upload' }\n ]\"\n label=\"Control Type\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <!-- Status - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_isactive\"\n type=\"checkbox\"\n formControlName=\"sype_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Placeholder -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_placeholder\"\n formControlName=\"sype_placeholder\"\n placeholder=\"Enter placeholder text\"\n label=\"Placeholder\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Auto Complete - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_auto_complete\"\n type=\"checkbox\"\n formControlName=\"sype_auto_complete\"\n label=\"Auto Complete\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Tooltip -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_tooltip\"\n formControlName=\"sype_tooltip\"\n placeholder=\"Enter tooltip text\"\n label=\"Tooltip\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Validation & Sizing Section -->\n <!-- Min/Max Length - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_min_length\"\n type=\"number\"\n formControlName=\"sype_min_length\"\n placeholder=\"0\"\n label=\"Min Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_max_length\"\n type=\"number\"\n formControlName=\"sype_max_length\"\n placeholder=\"20\"\n label=\"Max Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Size & Label Placement - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_size\"\n formControlName=\"sype_size\"\n label=\"Size\"\n size=\"xs\"\n [options]=\"[\n { value: 'xs', label: 'XS' },\n { value: 'sm', label: 'SM' },\n { value: 'md', label: 'MD' },\n { value: 'lg', label: 'LG' },\n { value: 'xl', label: 'XL' },\n { value: 'xxl', label: 'XXL' }\n ]\">\n </cide-ele-select>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_label_placement\"\n formControlName=\"sype_label_placement\"\n label=\"Label Placement\"\n size=\"xs\"\n [options]=\"[\n { value: 'left', label: 'Left' },\n { value: 'floating', label: 'Floating' },\n { value: 'fixed', label: 'Fixed' }\n ]\">\n </cide-ele-select>\n </div>\n </div>\n\n <!-- Width & Height - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_width\"\n type=\"text\"\n formControlName=\"sype_width\"\n placeholder=\"20px\"\n label=\"Width\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_height\"\n type=\"text\"\n formControlName=\"sype_height\"\n placeholder=\"20px\"\n label=\"Height\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Leading Icon -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_leading_icon\"\n formControlName=\"sype_leading_icon\"\n placeholder=\"Enter icon name\"\n label=\"Leading Icon\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Default Value -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_default\"\n formControlName=\"sype_default\"\n placeholder=\"Enter default value\"\n label=\"Default Value\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Regex Pattern -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_regex\"\n formControlName=\"sype_regex\"\n placeholder=\"Enter regex pattern\"\n label=\"Regex Pattern\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Option Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_option_key\"\n formControlName=\"sype_option_key\"\n placeholder=\"Enter option key\"\n label=\"Option Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Entity ID (Auto-assigned from AppState) - Hidden -->\n <div class=\"form-group\" style=\"display: none;\">\n <cide-ele-input\n id=\"sype_entity_id_syen\"\n formControlName=\"sype_entity_id_syen\"\n placeholder=\"Auto-assigned from system\"\n label=\"Entity ID (Auto-assigned)\"\n size=\"sm\"\n readonly>\n </cide-ele-input>\n </div>\n\n <!-- Control Options -->\n <div class=\"form-group full-width\">\n <h6 class=\"options-title\">Control Options</h6>\n <div class=\"options-grid\">\n \n <!-- Required -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_required\"\n type=\"checkbox\"\n formControlName=\"sype_required\"\n label=\"Required\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Disabled -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_disabled\"\n type=\"checkbox\"\n formControlName=\"sype_disabled\"\n label=\"Disabled\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Label -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_label_hide\"\n type=\"checkbox\"\n formControlName=\"sype_label_hide\"\n label=\"Hide Label\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Helper Text -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_hide_helper_and_error_text\"\n type=\"checkbox\"\n formControlName=\"sype_hide_helper_and_error_text\"\n label=\"Hide Helper Text\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Helper Text Collapse -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_helper_text_collapse\"\n type=\"checkbox\"\n formControlName=\"sype_helper_text_collapse\"\n label=\"Collapse Helper\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n </div>\n </div>\n\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button \n cideEleButton\n type=\"button\"\n variant=\"outline\"\n (click)=\"cancelForm()\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n <button \n cideEleButton\n type=\"submit\"\n variant=\"primary\"\n [disabled]=\"loading()\">\n {{ isEditMode() ? 'Update Control' : 'Create Control' }}\n </button>\n </div>\n </form>\n </div>\n\n <!-- Controls List Section -->\n <div class=\"controls-list-section\">\n <div class=\"controls-header\">\n <h3>Page Controls</h3>\n <p>Controls connected to this page</p>\n </div>\n \n <div class=\"controls-list\" *ngIf=\"!loading() && controls().length > 0\">\n <div \n class=\"control-item\" \n *ngFor=\"let control of controls(); trackBy: trackByControlId\"\n [class.selected]=\"selectedControlId() === control._id\"\n (click)=\"selectControl(control)\"\n (keyup.enter)=\"selectControl(control)\"\n (keyup.space)=\"selectControl(control)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Select control ' + (control.sype_label || control.sype_key)\">\n <div class=\"control-header\">\n <div class=\"control-icon\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n </div>\n <div class=\"control-info\">\n <h4>{{ control.sype_label || control.sype_key }}</h4>\n <p>{{ control.sype_tooltip || 'No tooltip' }}</p>\n <div class=\"control-meta\">\n <span class=\"control-type\">{{ control.sype_type }}</span>\n <span class=\"control-status\" [class.active]=\"control.sype_isactive\">\n {{ control.sype_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n <div class=\"control-actions\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"editControl(control); $event.stopPropagation()\">\n <cide-ele-icon>edit</cide-ele-icon>\n </button>\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"deleteControl(control); $event.stopPropagation()\">\n <cide-ele-icon>delete</cide-ele-icon>\n </button>\n </div>\n </div>\n \n \n </div>\n </div>\n\n <div class=\"controls-list-empty\" *ngIf=\"!loading() && controls().length === 0\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n <p>No controls available</p>\n <small>Create controls using the form on the left</small>\n </div>\n\n <div class=\"controls-list-loading\" *ngIf=\"loading()\">\n <cide-ele-icon class=\"spinning\">refresh</cide-ele-icon>\n <p>Loading controls...</p>\n </div>\n </div>\n </div>\n</div>\n\n ", styles: [".page-controls-container{@apply tw-flex tw-flex-col tw-h-full tw-bg-gray-50;}.header{@apply tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4;}.header-content{@apply tw-flex tw-items-center tw-justify-between;}.header-left{@apply tw-flex tw-items-center tw-space-x-4;}.back-button{@apply tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-text-gray-600 hover:tw-text-gray-900 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors;}.title-section{@apply tw-flex tw-items-center tw-space-x-3;}.title-icon{@apply tw-text-blue-600 tw-text-xl;}.title{@apply tw-text-xl tw-font-semibold tw-text-gray-900 tw-mb-0;}.subtitle{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.error-message{@apply tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md tw-p-4 tw-mx-6 tw-mt-4 tw-flex tw-items-start tw-space-x-3;}.error-message cide-ele-icon{@apply tw-text-red-500 tw-flex-shrink-0 tw-mt-0.5;}.error-message h3{@apply tw-text-red-800 tw-font-medium tw-mb-1;}.error-message p{@apply tw-text-red-700 tw-text-sm tw-mb-0;}.main-content{@apply tw-flex tw-flex-1 tw-gap-6 tw-p-6 tw-overflow-hidden;}.form-section{@apply tw-w-3/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.form-header{@apply tw-flex tw-items-center tw-space-x-3 tw-p-6 tw-border-b tw-border-gray-200;}.form-header cide-ele-icon{@apply tw-text-blue-600;}.form-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-0;}.control-form{@apply tw-flex tw-flex-col tw-flex-1 tw-p-6;}.form-grid{@apply tw-grid tw-grid-cols-2 tw-gap-4 tw-mb-6;}.form-group{@apply tw-space-y-1;}.form-group.full-width{@apply tw-col-span-2;}.form-group.compact-number,.form-group.compact-select,.form-group.compact-dimension{@apply tw-max-w-32;}.form-group.compact-number{@apply tw-min-w-20;}.form-group.compact-dimension{@apply tw-min-w-24;}.form-group.compact-select{@apply tw-min-w-28;}.form-group.form-group-row{@apply tw-col-span-2 tw-flex tw-gap-4;}.form-group-half{@apply tw-flex-1 tw-space-y-1;}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.options-title{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-3;}.options-grid{@apply tw-grid tw-grid-cols-3 tw-gap-3;}.option-item{@apply tw-flex tw-items-center tw-space-x-2;}.option-checkbox{@apply tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500 focus:tw-border-blue-500;}.option-item label{@apply tw-text-sm tw-text-gray-700 tw-cursor-pointer;}.form-actions{@apply tw-flex tw-justify-end tw-space-x-3 tw-pt-4 tw-border-t tw-border-gray-200 tw-mt-auto;}.controls-list-section{@apply tw-w-2/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.controls-header{@apply tw-p-6 tw-border-b tw-border-gray-200;}.controls-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-1;}.controls-header p{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.controls-list{@apply tw-flex-1 tw-overflow-y-auto tw-p-4;}.control-item{@apply tw-bg-gray-50 tw-border tw-border-gray-200 tw-rounded-lg tw-p-4 tw-mb-3 tw-cursor-pointer tw-transition-all tw-duration-200;}.control-item:hover{@apply tw-shadow-md tw-border-gray-300;}.control-item.selected{@apply tw-bg-blue-50 tw-border-blue-300 tw-shadow-md;}.control-item:focus{@apply tw-outline-none tw-ring-2 tw-ring-blue-500 tw-ring-offset-2;}.control-item:last-child{@apply tw-mb-0;}.control-header{@apply tw-flex tw-items-start tw-space-x-3;}.control-icon{@apply tw-flex-shrink-0 tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center;}.control-icon cide-ele-icon{@apply tw-text-blue-600;}.control-info{@apply tw-flex-1 tw-min-w-0;}.control-info h4{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-1 tw-truncate;}.control-info p{@apply tw-text-xs tw-text-gray-500 tw-mb-2 tw-truncate;}.control-meta{@apply tw-flex tw-items-center tw-space-x-2;}.control-type{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-800;}.control-status{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800;}.control-status.active{@apply tw-bg-green-100 tw-text-green-800;}.control-actions{@apply tw-flex tw-items-center tw-space-x-1 tw-opacity-0 tw-transition-opacity tw-duration-200;}.control-item:hover .control-actions,.control-item.selected .control-actions{@apply tw-opacity-100;}.controls-list-empty{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-empty cide-ele-icon{@apply tw-text-4xl tw-text-gray-300 tw-mb-4;}.controls-list-empty p{@apply tw-text-gray-500 tw-font-medium tw-mb-1;}.controls-list-empty small{@apply tw-text-gray-400;}.controls-list-loading{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-loading cide-ele-icon{@apply tw-text-2xl tw-text-blue-500 tw-mb-4;}.controls-list-loading p{@apply tw-text-gray-500;}.spinning{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 1024px){.main-content{@apply tw-flex-col;}.form-section{@apply tw-w-full;}.controls-list-section{@apply tw-w-full tw-max-h-96;}.form-grid{@apply tw-grid-cols-1;}.options-grid{@apply tw-grid-cols-2;}}@media (max-width: 640px){.main-content{@apply tw-p-4 tw-gap-4;}.form-grid{@apply tw-gap-3;}.form-actions{@apply tw-flex-col tw-space-x-0 tw-space-y-2;}.options-grid{@apply tw-grid-cols-1;}}\n"] }]
482
- }] });
483
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb250cm9scy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvcGFnZS1tYW5hZ2VtZW50L2NvbXBvbmVudHMvcGFnZS1jb250cm9scy9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLWNvbnRyb2xzL3BhZ2UtY29udHJvbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUMvSixPQUFPLEVBQWUsd0JBQXdCLEVBQXlFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFrQm5KLE1BQU0sT0FB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LENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQWtCO1FBQ2hELE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs4R0ExZVUscUJBQXFCO2tHQUFyQixxQkFBcUIsdUZDM0JsQywwaGRBNGFDLDgzTEQ3WkcsWUFBWSwrUEFDWixtQkFBbUIsNHJCQUNuQixXQUFXLCtCQUNYLHNCQUFzQixrWEFDdEIsa0JBQWtCLDBiQUNsQixtQkFBbUIsbVlBQ25CLGlCQUFpQjs7MkZBTVIscUJBQXFCO2tCQWhCakMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsd0JBQXdCO3FCQUN6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgc2lnbmFsLCBjb21wdXRlZCwgRGVzdHJveVJlZiwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTm9uTnVsbGFibGVGb3JtQnVpbGRlciwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcblxyXG5pbXBvcnQgeyBQYWdlQ29udHJvbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZS1jb250cm9scy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwU3RhdGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnY2xvdWQtaWRlLWxheW91dCc7XHJcbmltcG9ydCB7IENpZGVFbGVCdXR0b25Db21wb25lbnQsIENpZGVJY29uQ29tcG9uZW50LCBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVTZWxlY3RDb21wb25lbnQsIENpZGVFbGVEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25JdGVtIH0gZnJvbSAnY2xvdWQtaWRlLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBjb250cm9sVHlwZSwgZ2VuZXJhdGVPYmplY3RGcm9tU3RyaW5nLCBJQ29yZVN5cGUsIE1QYWdlRWxlbWVudHMsIE1QYWdlRWxlbWVudHNJbnNlcnRVcGRhdGVQYXlsb2FkLCB0aGVtZVNpemUgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1jb3JlLWFwcC1wYWdlLWNvbnRyb2xzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENpZGVFbGVCdXR0b25Db21wb25lbnQsXHJcbiAgICBDaWRlSW5wdXRDb21wb25lbnQsXHJcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxyXG4gICAgQ2lkZUljb25Db21wb25lbnQsXHJcbiAgICBDaWRlRWxlRHJvcGRvd25Db21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VDb250cm9sc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gRGVwZW5kZW5jeSBpbmplY3Rpb25cclxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSBjb250cm9sc1NlcnZpY2UgPSBpbmplY3QoUGFnZUNvbnRyb2xzU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcHBTdGF0ZSA9IGluamVjdChBcHBTdGF0ZUhlbHBlclNlcnZpY2UpO1xyXG4gIHByaXZhdGUgZmIgPSBpbmplY3QoTm9uTnVsbGFibGVGb3JtQnVpbGRlcik7XHJcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcclxuXHJcblxyXG5cclxuICAvLyBNYWtlIE1hdGggYXZhaWxhYmxlIGluIHRlbXBsYXRlXHJcbiAgTWF0aCA9IE1hdGg7XHJcblxyXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnRcclxuICBjb250cm9scyA9IHNpZ25hbDxJQ29yZVN5cGVbXT4oW10pO1xyXG4gIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gIHNlbGVjdGVkSXRlbXMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcclxuICBzZWFyY2hUZXJtID0gc2lnbmFsKCcnKTtcclxuXHJcbiAgLy8gUGFnZSBpbmZvcm1hdGlvblxyXG4gIHBhZ2VJZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuICBwYWdlVGl0bGUgPSBzaWduYWw8c3RyaW5nPignJyk7XHJcblxyXG4gIC8vIEZvcm0gc3RhdGVcclxuICBpc0VkaXRNb2RlID0gc2lnbmFsKGZhbHNlKTtcclxuICBlZGl0aW5nQ29udHJvbElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gIHJldHJpZXZlZENvbnRyb2wgPSBzaWduYWw8SUNvcmVTeXBlIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIENvbnRyb2wgc2VsZWN0aW9uIGZvciBuZXcgbGF5b3V0XHJcbiAgc2VsZWN0ZWRDb250cm9sSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIFBhZ2luYXRpb24gc2lnbmFsc1xyXG4gIGN1cnJlbnRQYWdlID0gc2lnbmFsKDEpO1xyXG4gIHBhZ2VTaXplID0gc2lnbmFsKDEwKTtcclxuICB0b3RhbEl0ZW1zID0gc2lnbmFsKDApO1xyXG5cclxuICAvLyBNb2Rlcm4gcmVhY3RpdmUgZm9ybXMgd2l0aCBzaWduYWxzIC0gTm8gdmFsaWRhdG9ycyBmb3Igc2ltcGxpY2l0eVxyXG4gIGNvbnRyb2xGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICBzeXBlX2tleTogWycnXSxcclxuICAgIHN5cGVfbGFiZWw6IFsnJ10sXHJcbiAgICBzeXBlX2xhYmVsX2hpZGU6IFtmYWxzZV0sXHJcbiAgICBzeXBlX2F1dG9fY29tcGxldGU6IFtmYWxzZV0sIC8vIENoYW5nZWQgdG8gYm9vbGVhbiBmb3IgY2hlY2tib3hcclxuICAgIHN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQ6IFtmYWxzZV0sXHJcbiAgICBzeXBlX3R5cGU6IFsnJ10sIC8vIGNvbnRyb2xUeXBlXHJcbiAgICBzeXBlX29wdGlvbl9rZXk6IFsnJ10sXHJcbiAgICBzeXBlX3BsYWNlaG9sZGVyOiBbJyddLFxyXG4gICAgc3lwZV9taW5fbGVuZ3RoOiBbMF0sXHJcbiAgICBzeXBlX21heF9sZW5ndGg6IFsyMF0sXHJcbiAgICBzeXBlX3JlZ2V4OiBbJyddLFxyXG4gICAgc3lwZV9yZXF1aXJlZDogW2ZhbHNlXSxcclxuICAgIHN5cGVfZGlzYWJsZWQ6IFtmYWxzZV0sXHJcbiAgICBzeXBlX3dpZHRoOiBbJyddLCAvLyBDaGFuZ2VkIHRvIHN0cmluZyBmb3IgcHggdmFsdWVzIGxpa2UgXCIyMHB4XCJcclxuICAgIHN5cGVfaGVpZ2h0OiBbJyddLCAvLyBDaGFuZ2VkIHRvIHN0cmluZyBmb3IgcHggdmFsdWVzIGxpa2UgXCIyMHB4XCJcclxuICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiBbJ2xlZnQnIGFzICdmbG9hdGluZycgfCAnZml4ZWQnXSxcclxuICAgIHN5cGVfaGVscGVyX3RleHRfY29sbGFwc2U6IFtmYWxzZV0sXHJcbiAgICBzeXBlX2RlZmF1bHQ6IFsnJyBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXSxcclxuICAgIHN5cGVfdG9vbHRpcDogWycnXSxcclxuICAgIHN5cGVfc2l6ZTogWydzbScgYXMgdGhlbWVTaXplXSwgLy8gQ2hhbmdlZCBkZWZhdWx0IHRvIHNtYWxsXHJcbiAgICBzeXBlX2xlYWRpbmdfaWNvbjogWycnXSxcclxuICAgIHN5cGVfaXNhY3RpdmU6IFt0cnVlXSxcclxuICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IFsnJ11cclxuICB9KTtcclxuXHJcbiAgLy8gQ29tcHV0ZWQgdmFsdWVzXHJcbiAgaXNGb3JtRGlydHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbnRyb2xGb3JtLmRpcnR5KTtcclxuXHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemVDb21wb25lbnQoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgcGFnZSBpbmZvcm1hdGlvbiBmcm9tIHJvdXRlXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJhbXNbJ3F1ZXJ5J107XHJcbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IGdlbmVyYXRlT2JqZWN0RnJvbVN0cmluZyhxdWVyeVBhcmFtcyk7XHJcbiAgICAgIHRoaXMucGFnZUlkLnNldChxdWVyeURhdGE/LnN5cGdfaWQgfHwgJycpO1xyXG4gICAgICB0aGlzLnBhZ2VUaXRsZS5zZXQocXVlcnlEYXRhPy5zeXBnX3RpdGxlIHx8ICcnKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBhZ2VJZCgpKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkQ29udHJvbHMoKTtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnNldEVudGl0eUlkRnJvbUFwcFN0YXRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lcnJvci5zZXQoJ05vIHBhZ2UgSUQgcHJvdmlkZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZW50aXR5IElEIGZyb20gYXBwIHN0YXRlIC0gYXV0by1hc3NpZ25lZCBpbnRlcm5hbGx5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRFbnRpdHlJZEZyb21BcHBTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVudGl0eUlkID0gdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpO1xyXG4gICAgaWYgKGVudGl0eUlkKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgc3lwZV9lbnRpdHlfaWRfc3llbjogZW50aXR5SWRcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIERpc2FibGUgdGhlIGVudGl0eSBmaWVsZCBzaW5jZSBpdCdzIGF1dG8tYXNzaWduZWRcclxuICAgICAgdGhpcy5jb250cm9sRm9ybS5nZXQoJ3N5cGVfZW50aXR5X2lkX3N5ZW4nKT8uZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb250cm9scyBmcm9tIEFQSVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZENvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcclxuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3Q6IE1QYWdlRWxlbWVudHMgPSB7XHJcbiAgICAgIHN5cGVfcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29udHJvbHNTZXJ2aWNlLmdldENvbnRyb2xMaXN0KHJlcXVlc3QpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc2V0KHJlc3BvbnNlLmRhdGEgfHwgW10pO1xyXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMuc2V0KHJlc3BvbnNlLnRvdGFsIHx8IDApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2UubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgY29udHJvbHMnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBjb250cm9sczonLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCgnRmFpbGVkIHRvIGxvYWQgY29udHJvbHMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgZm9ybSBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk6IHZvaWQge1xyXG4gICAgLy8gV2F0Y2ggZm9yIGZvcm0gY2hhbmdlcyB0byBlbmFibGUvZGlzYWJsZSBzYXZlIGJ1dHRvblxyXG4gICAgdGhpcy5jb250cm9sRm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIEZvcm0gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGJ5IGNvbXB1dGVkIHNpZ25hbHNcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBuZXcgY29udHJvbFxyXG4gICAqL1xyXG4gIGNyZWF0ZUNvbnRyb2woKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jb250cm9sRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgY29uc3QgZW50aXR5SWQgPSB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCk7XHJcblxyXG4gICAgY29uc3QgbmV3Q29udHJvbDogTVBhZ2VFbGVtZW50c0luc2VydFVwZGF0ZVBheWxvYWQgPSB7XHJcbiAgICAgIF9pZDogJycsXHJcbiAgICAgIHN5cGVfa2V5OiBmb3JtVmFsdWUuc3lwZV9rZXksXHJcbiAgICAgIHN5cGVfcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxyXG4gICAgICBzeXBlX2xhYmVsOiBmb3JtVmFsdWUuc3lwZV9sYWJlbCxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBmb3JtVmFsdWUuc3lwZV9sYWJlbF9oaWRlLFxyXG4gICAgICBzeXBlX2F1dG9fY29tcGxldGU6IGZvcm1WYWx1ZS5zeXBlX2F1dG9fY29tcGxldGUsXHJcbiAgICAgIHN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQ6IGZvcm1WYWx1ZS5zeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0LFxyXG4gICAgICBzeXBlX3R5cGU6IGZvcm1WYWx1ZS5zeXBlX3R5cGUgYXMgY29udHJvbFR5cGUsXHJcbiAgICAgIHN5cGVfb3B0aW9uX2tleTogZm9ybVZhbHVlLnN5cGVfb3B0aW9uX2tleSxcclxuICAgICAgc3lwZV9wbGFjZWhvbGRlcjogZm9ybVZhbHVlLnN5cGVfcGxhY2Vob2xkZXIsXHJcbiAgICAgIHN5cGVfbWluX2xlbmd0aDogZm9ybVZhbHVlLnN5cGVfbWluX2xlbmd0aCxcclxuICAgICAgc3lwZV9tYXhfbGVuZ3RoOiBmb3JtVmFsdWUuc3lwZV9tYXhfbGVuZ3RoLFxyXG4gICAgICBzeXBlX3JlZ2V4OiBmb3JtVmFsdWUuc3lwZV9yZWdleCxcclxuICAgICAgc3lwZV9yZXF1aXJlZDogZm9ybVZhbHVlLnN5cGVfcmVxdWlyZWQsXHJcbiAgICAgIHN5cGVfZGlzYWJsZWQ6IGZvcm1WYWx1ZS5zeXBlX2Rpc2FibGVkLFxyXG4gICAgICBzeXBlX3dpZHRoOiBmb3JtVmFsdWUuc3lwZV93aWR0aCxcclxuICAgICAgc3lwZV9oZWlnaHQ6IGZvcm1WYWx1ZS5zeXBlX2hlaWdodCxcclxuICAgICAgc3lwZV9sYWJlbF9wbGFjZW1lbnQ6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsX3BsYWNlbWVudCxcclxuICAgICAgc3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZTogZm9ybVZhbHVlLnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UsXHJcbiAgICAgIHN5cGVfZGVmYXVsdDogZm9ybVZhbHVlLnN5cGVfZGVmYXVsdCxcclxuICAgICAgc3lwZV90b29sdGlwOiBmb3JtVmFsdWUuc3lwZV90b29sdGlwLFxyXG4gICAgICBzeXBlX3NpemU6IGZvcm1WYWx1ZS5zeXBlX3NpemUsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiBmb3JtVmFsdWUuc3lwZV9sZWFkaW5nX2ljb24sXHJcbiAgICAgIHN5cGVfaXNhY3RpdmU6IGZvcm1WYWx1ZS5zeXBlX2lzYWN0aXZlLFxyXG4gICAgICBzeXBlX2VudGl0eV9pZF9zeWVuOiBlbnRpdHlJZCB8fCBmb3JtVmFsdWUuc3lwZV9lbnRpdHlfaWRfc3llblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5jb250cm9sc1NlcnZpY2UuY3JlYXRlQ29udHJvbChuZXdDb250cm9sKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29udHJvbCBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgY29udHJvbDonLCBlcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGV4aXN0aW5nIGNvbnRyb2xcclxuICAgKi9cclxuICB1cGRhdGVDb250cm9sKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRpbmdDb250cm9sSWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jb250cm9sRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgY29uc3QgZW50aXR5SWQgPSB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZENvbnRyb2w6IE1QYWdlRWxlbWVudHNJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xyXG4gICAgICBfaWQ6IHRoaXMuZWRpdGluZ0NvbnRyb2xJZCgpISxcclxuICAgICAgc3lwZV9rZXk6IGZvcm1WYWx1ZS5zeXBlX2tleSxcclxuICAgICAgc3lwZV9wYWdlX2lkX3N5cGc6IHRoaXMucGFnZUlkKCksXHJcbiAgICAgIHN5cGVfbGFiZWw6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsLFxyXG4gICAgICBzeXBlX2xhYmVsX2hpZGU6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsX2hpZGUsXHJcbiAgICAgIHN5cGVfYXV0b19jb21wbGV0ZTogQm9vbGVhbihmb3JtVmFsdWUuc3lwZV9hdXRvX2NvbXBsZXRlKSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogZm9ybVZhbHVlLnN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQsXHJcbiAgICAgIHN5cGVfdHlwZTogZm9ybVZhbHVlLnN5cGVfdHlwZSBhcyBjb250cm9sVHlwZSxcclxuICAgICAgc3lwZV9vcHRpb25fa2V5OiBmb3JtVmFsdWUuc3lwZV9vcHRpb25fa2V5LFxyXG4gICAgICBzeXBlX3BsYWNlaG9sZGVyOiBmb3JtVmFsdWUuc3lwZV9wbGFjZWhvbGRlcixcclxuICAgICAgc3lwZV9taW5fbGVuZ3RoOiBmb3JtVmFsdWUuc3lwZV9taW5fbGVuZ3RoLFxyXG4gICAgICBzeXBlX21heF9sZW5ndGg6IGZvcm1WYWx1ZS5zeXBlX21heF9sZW5ndGgsXHJcbiAgICAgIHN5cGVfcmVnZXg6IGZvcm1WYWx1ZS5zeXBlX3JlZ2V4LFxyXG4gICAgICBzeXBlX3JlcXVpcmVkOiBmb3JtVmFsdWUuc3lwZV9yZXF1aXJlZCxcclxuICAgICAgc3lwZV9kaXNhYmxlZDogZm9ybVZhbHVlLnN5cGVfZGlzYWJsZWQsXHJcbiAgICAgIHN5cGVfd2lkdGg6IGZvcm1WYWx1ZS5zeXBlX3dpZHRoLFxyXG4gICAgICBzeXBlX2hlaWdodDogZm9ybVZhbHVlLnN5cGVfaGVpZ2h0LFxyXG4gICAgICBzeXBlX2xhYmVsX3BsYWNlbWVudDogZm9ybVZhbHVlLnN5cGVfbGFiZWxfcGxhY2VtZW50LFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBmb3JtVmFsdWUuc3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZSxcclxuICAgICAgc3lwZV9kZWZhdWx0OiBmb3JtVmFsdWUuc3lwZV9kZWZhdWx0LFxyXG4gICAgICBzeXBlX3Rvb2x0aXA6IGZvcm1WYWx1ZS5zeXBlX3Rvb2x0aXAsXHJcbiAgICAgIHN5cGVfc2l6ZTogZm9ybVZhbHVlLnN5cGVfc2l6ZSxcclxuICAgICAgc3lwZV9sZWFkaW5nX2ljb246IGZvcm1WYWx1ZS5zeXBlX2xlYWRpbmdfaWNvbixcclxuICAgICAgc3lwZV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5cGVfaXNhY3RpdmUsXHJcbiAgICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IGVudGl0eUlkIHx8IGZvcm1WYWx1ZS5zeXBlX2VudGl0eV9pZF9zeWVuXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2xzU2VydmljZS51cGRhdGVDb250cm9sKHVwZGF0ZWRDb250cm9sKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29udHJvbCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdXBkYXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdXBkYXRpbmcgY29udHJvbDonLCBlcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRWRpdCBjb250cm9sXHJcbiAgICovXHJcbiAgZWRpdENvbnRyb2woY29udHJvbDogSUNvcmVTeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRWRpdE1vZGUuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5lZGl0aW5nQ29udHJvbElkLnNldChjb250cm9sLl9pZCB8fCBudWxsKTtcclxuICAgIHRoaXMucmV0cmlldmVkQ29udHJvbC5zZXQoY29udHJvbCk7XHJcblxyXG4gICAgdGhpcy5jb250cm9sRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgc3lwZV9rZXk6IGNvbnRyb2wuc3lwZV9rZXksXHJcbiAgICAgIHN5cGVfbGFiZWw6IGNvbnRyb2wuc3lwZV9sYWJlbCxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBjb250cm9sLnN5cGVfbGFiZWxfaGlkZSxcclxuICAgICAgc3lwZV9hdXRvX2NvbXBsZXRlOiBjb250cm9sLnN5cGVfYXV0b19jb21wbGV0ZSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogY29udHJvbC5zeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0LFxyXG4gICAgICBzeXBlX3R5cGU6IGNvbnRyb2wuc3lwZV90eXBlLFxyXG4gICAgICBzeXBlX29wdGlvbl9rZXk6IGNvbnRyb2wuc3lwZV9vcHRpb25fa2V5LFxyXG4gICAgICBzeXBlX3BsYWNlaG9sZGVyOiBjb250cm9sLnN5cGVfcGxhY2Vob2xkZXIsXHJcbiAgICAgIHN5cGVfbWluX2xlbmd0aDogY29udHJvbC5zeXBlX21pbl9sZW5ndGgsXHJcbiAgICAgIHN5cGVfbWF4X2xlbmd0aDogY29udHJvbC5zeXBlX21heF9sZW5ndGgsXHJcbiAgICAgIHN5cGVfcmVnZXg6IGNvbnRyb2wuc3lwZV9yZWdleCxcclxuICAgICAgc3lwZV9yZXF1aXJlZDogY29udHJvbC5zeXBlX3JlcXVpcmVkLFxyXG4gICAgICBzeXBlX2Rpc2FibGVkOiBjb250cm9sLnN5cGVfZGlzYWJsZWQsXHJcbiAgICAgIHN5cGVfd2lkdGg6IGNvbnRyb2wuc3lwZV93aWR0aD8udG9TdHJpbmcoKSB8fCAnJyxcclxuICAgICAgc3lwZV9oZWlnaHQ6IGNvbnRyb2wuc3lwZV9oZWlnaHQ/LnRvU3RyaW5nKCkgfHwgJycsXHJcbiAgICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiBjb250cm9sLnN5cGVfbGFiZWxfcGxhY2VtZW50LFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBjb250cm9sLnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UsXHJcbiAgICAgIHN5cGVfZGVmYXVsdDogY29udHJvbC5zeXBlX2RlZmF1bHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbixcclxuICAgICAgc3lwZV90b29sdGlwOiBjb250cm9sLnN5cGVfdG9vbHRpcCxcclxuICAgICAgc3lwZV9zaXplOiBjb250cm9sLnN5cGVfc2l6ZSBhcyB0aGVtZVNpemUsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiBjb250cm9sLnN5cGVfbGVhZGluZ19pY29uLFxyXG4gICAgICBzeXBlX2lzYWN0aXZlOiBjb250cm9sLnN5cGVfaXNhY3RpdmUsXHJcbiAgICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IFN0cmluZyhjb250cm9sLnN5cGVfZW50aXR5X2lkX3N5ZW4gfHwgJycpXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGRlbGV0ZUNvbnRyb2woY29udHJvbDogSUNvcmVTeXBlKTogdm9pZCB7XHJcbiAgICBpZiAoY29uZmlybShgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgY29udHJvbCBcIiR7Y29udHJvbC5zeXBlX2xhYmVsfVwiP2ApKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuY29udHJvbHNTZXJ2aWNlLmRlbGV0ZUNvbnRyb2woY29udHJvbC5faWQgfHwgJycpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb250cm9sIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIGNvbnRyb2w6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbnRyb2wgc3RhdHVzXHJcbiAgICovXHJcbiAgdG9nZ2xlQ29udHJvbFN0YXR1cyhjb250cm9sOiBJQ29yZVN5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2xzU2VydmljZS50b2dnbGVDb250cm9sU3RhdHVzKHsgc3lwZV9pZDogY29udHJvbC5faWQgfHwgJycsIHN5cGVfaXNhY3RpdmU6ICFjb250cm9sLnN5cGVfaXNhY3RpdmUgfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYENvbnRyb2wgJHtjb250cm9sLnN5cGVfaXNhY3RpdmUgPyAnZGVhY3RpdmF0ZWQnIDogJ2FjdGl2YXRlZCd9IHN1Y2Nlc3NmdWxseWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdG9nZ2xlIGNvbnRyb2wgc3RhdHVzJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRvZ2dsaW5nIGNvbnRyb2wgc3RhdHVzOicsIGVycm9yKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byB0b2dnbGUgY29udHJvbCBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBjb250cm9sIChjcmVhdGUgb3IgdXBkYXRlKVxyXG4gICAqL1xyXG4gIHNhdmVDb250cm9sKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSgpKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29udHJvbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jcmVhdGVDb250cm9sKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYW5jZWwgZm9ybVxyXG4gICAqL1xyXG4gIGNhbmNlbEZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gYmFjayB0byBwYWdlIGxpc3RcclxuICAgKi9cclxuICBnb0JhY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jb3JlL3BhZ2UnXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBmb3JtXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNldEZvcm0oKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbnRpdHlJZCA9IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xGb3JtLnJlc2V0KHtcclxuICAgICAgc3lwZV9rZXk6ICcnLFxyXG4gICAgICBzeXBlX2xhYmVsOiAnJyxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBmYWxzZSxcclxuICAgICAgc3lwZV9hdXRvX2NvbXBsZXRlOiBmYWxzZSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogZmFsc2UsXHJcbiAgICAgIHN5cGVfdHlwZTogJycsXHJcbiAgICAgIHN5cGVfb3B0aW9uX2tleTogJycsXHJcbiAgICAgIHN5cGVfcGxhY2Vob2xkZXI6ICcnLFxyXG4gICAgICBzeXBlX21pbl9sZW5ndGg6IDAsXHJcbiAgICAgIHN5cGVfbWF4X2xlbmd0aDogMjAsXHJcbiAgICAgIHN5cGVfcmVnZXg6ICcnLFxyXG4gICAgICBzeXBlX3JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgc3lwZV9kaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIHN5cGVfd2lkdGg6ICcnLFxyXG4gICAgICBzeXBlX2hlaWdodDogJycsXHJcbiAgICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiAnZmxvYXRpbmcnLFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBmYWxzZSxcclxuICAgICAgc3lwZV9kZWZhdWx0OiAnJyBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuLFxyXG4gICAgICBzeXBlX3Rvb2x0aXA6ICcnLFxyXG4gICAgICBzeXBlX3NpemU6ICdtZCcsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiAnJyxcclxuICAgICAgc3lwZV9pc2FjdGl2ZTogdHJ1ZSxcclxuICAgICAgc3lwZV9lbnRpdHlfaWRfc3llbjogZW50aXR5SWQgfHwgJydcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pc0VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmVkaXRpbmdDb250cm9sSWQuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5yZXRyaWV2ZWRDb250cm9sLnNldChudWxsKTtcclxuICAgIHRoaXMuY29udHJvbEZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgIHRoaXMuY29udHJvbEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXJrIGZvcm0gYXMgdG91Y2hlZCB0byB0cmlnZ2VyIHZhbGlkYXRpb24gZGlzcGxheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFya0Zvcm1Bc1RvdWNoZWQoKTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xGb3JtLmdldChrZXkpO1xyXG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkcm9wZG93biBpdGVtcyBmb3IgYWN0aW9uc1xyXG4gICAqL1xyXG4gIGdldEFjdGlvbkRyb3Bkb3duSXRlbXMoY29udHJvbDogSUNvcmVTeXBlKTogRHJvcGRvd25JdGVtW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZWRpdCcsXHJcbiAgICAgICAgbGFiZWw6ICdFZGl0JyxcclxuICAgICAgICBpY29uOiAnZWRpdCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAndG9nZ2xlJyxcclxuICAgICAgICBsYWJlbDogY29udHJvbC5zeXBlX2lzYWN0aXZlID8gJ0RlYWN0aXZhdGUnIDogJ0FjdGl2YXRlJyxcclxuICAgICAgICBpY29uOiBjb250cm9sLnN5cGVfaXNhY3RpdmUgPyAnYmxvY2snIDogJ2NoZWNrX2NpcmNsZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZGVsZXRlJyxcclxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXHJcbiAgICAgICAgaWNvbjogJ2RlbGV0ZSdcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBkcm9wZG93biBpdGVtIGNsaWNrXHJcbiAgICovXHJcbiAgb25Ecm9wZG93bkl0ZW1DbGljayhpdGVtOiBEcm9wZG93bkl0ZW0sIGNvbnRyb2w6IElDb3JlU3lwZSk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICAgIGNhc2UgJ2VkaXQnOlxyXG4gICAgICAgIHRoaXMuZWRpdENvbnRyb2woY29udHJvbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RvZ2dsZSc6XHJcbiAgICAgICAgdGhpcy50b2dnbGVDb250cm9sU3RhdHVzKGNvbnRyb2wpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkZWxldGUnOlxyXG4gICAgICAgIHRoaXMuZGVsZXRlQ29udHJvbChjb250cm9sKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIGFsbCBkcm9wZG93bnNcclxuICAgKi9cclxuICBjbG9zZUFsbERyb3Bkb3ducygpOiB2b2lkIHtcclxuICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNsb3NlIGRyb3Bkb3ducyBpZiBuZWVkZWRcclxuICB9XHJcblxyXG4gIC8vIE5ldyBtZXRob2RzIGZvciB0aGUgdmVydGljYWwgbGF5b3V0XHJcbiAgc2VsZWN0Q29udHJvbChjb250cm9sOiBJQ29yZVN5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb250cm9sSWQuc2V0KGNvbnRyb2wuX2lkIHx8IG51bGwpO1xyXG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGNvbnRyb2w6JywgY29udHJvbCk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Q29udHJvbElkKGluZGV4OiBudW1iZXIsIGNvbnRyb2w6IElDb3JlU3lwZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY29udHJvbC5faWQgfHwgJyc7XHJcbiAgfVxyXG59ICIsIjwhLS0gUGFnZSBDb250cm9scyBDb250YWluZXIgLS0+XG48ZGl2IGNsYXNzPVwicGFnZS1jb250cm9scy1jb250YWluZXJcIj5cbiAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgIDxidXR0b24gXG4gICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgICAgIGNsYXNzPVwiYmFjay1idXR0b25cIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbj5hcnJvd19iYWNrPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXNlY3Rpb25cIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInRpdGxlLWljb25cIj5zZXR0aW5nczwvY2lkZS1lbGUtaWNvbj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGl0bGVcIj5Db250cm9sIE1hbmFnZW1lbnQ8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPlBhZ2U6IHt7IHBhZ2VUaXRsZSgpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XG4gIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJlcnJvcigpXCI+XG4gICAgPGNpZGUtZWxlLWljb24+ZXJyb3I8L2NpZGUtZWxlLWljb24+XG4gICAgPGRpdj5cbiAgICAgIDxoMz5FcnJvcjwvaDM+XG4gICAgICA8cD57eyBlcnJvcigpIH19PC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIE1haW4gQ29udGVudCBBcmVhIC0tPlxuICA8ZGl2IGNsYXNzPVwibWFpbi1jb250ZW50XCI+XG4gICAgPCEtLSBGb3JtIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XG4gICAgICAgIDxjaWRlLWVsZS1pY29uPnt7IGlzRWRpdE1vZGUoKSA/ICdlZGl0JyA6ICdhZGQnIH19PC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8aDM+e3sgaXNFZGl0TW9kZSgpID8gJ0VkaXQgQ29udHJvbCcgOiAnUXVpY2sgQWRkIENvbnRyb2wnIH19PC9oMz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZvcm0gLS0+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNvbnRyb2xGb3JtXCIgKG5nU3VibWl0KT1cInNhdmVDb250cm9sKClcIiBjbGFzcz1cImNvbnRyb2wtZm9ybSB0dy1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JpZFwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gQmFzaWMgSW5mb3JtYXRpb24gU2VjdGlvbiAtLT5cbiAgICAgICAgICA8IS0tIENvbnRyb2wgS2V5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2tleVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfa2V5XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBjb250cm9sIGtleVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQ29udHJvbCBLZXlcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENvbnRyb2wgTGFiZWwgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfbGFiZWxcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2xhYmVsXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBjb250cm9sIGxhYmVsXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDb250cm9sIExhYmVsXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBDb250cm9sIFR5cGUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3RcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX3R5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3R5cGVcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3RleHQnLCBsYWJlbDogJ1RleHQgSW5wdXQnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3RleHRhcmVhJywgbGFiZWw6ICdUZXh0IEFyZWEnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3NlbGVjdCcsIGxhYmVsOiAnU2VsZWN0JyB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdjaGVja2JveCcsIGxhYmVsOiAnQ2hlY2tib3gnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3JhZGlvJywgbGFiZWw6ICdSYWRpbycgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAnZGF0ZScsIGxhYmVsOiAnRGF0ZScgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbnVtYmVyJywgbGFiZWw6ICdOdW1iZXInIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAncGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJyB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdmaWxlJywgbGFiZWw6ICdGaWxlIFVwbG9hZCcgfVxuICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDb250cm9sIFR5cGVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgLSBDaGVja2JveCBhbGlnbmVkIHByb3Blcmx5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2lzYWN0aXZlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9pc2FjdGl2ZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQWN0aXZlIFN0YXR1c1wiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBwbGFjZWhvbGRlciB0ZXh0XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQXV0byBDb21wbGV0ZSAtIENoZWNrYm94IGFsaWduZWQgcHJvcGVybHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfYXV0b19jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfYXV0b19jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQXV0byBDb21wbGV0ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVG9vbHRpcCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV90b29sdGlwXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV90b29sdGlwXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0b29sdGlwIHRleHRcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlRvb2x0aXBcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFZhbGlkYXRpb24gJiBTaXppbmcgU2VjdGlvbiAtLT5cbiAgICAgICAgICA8IS0tIE1pbi9NYXggTGVuZ3RoIC0gU2lkZSBieSBzaWRlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1oYWxmXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9taW5fbGVuZ3RoXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX21pbl9sZW5ndGhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJNaW4gTGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtaGFsZlwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInN5cGVfbWF4X2xlbmd0aFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9tYXhfbGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjIwXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIk1heCBMZW5ndGhcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFNpemUgJiBMYWJlbCBQbGFjZW1lbnQgLSBTaWRlIGJ5IHNpZGUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWhhbGZcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9zaXplXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3NpemVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU2l6ZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAneHMnLCBsYWJlbDogJ1hTJyB9LFxuICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3NtJywgbGFiZWw6ICdTTScgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdtZCcsIGxhYmVsOiAnTUQnIH0sXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbGcnLCBsYWJlbDogJ0xHJyB9LFxuICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3hsJywgbGFiZWw6ICdYTCcgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICd4eGwnLCBsYWJlbDogJ1hYTCcgfVxuICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWhhbGZcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9sYWJlbF9wbGFjZW1lbnRcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfbGFiZWxfcGxhY2VtZW50XCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkxhYmVsIFBsYWNlbWVudFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbGVmdCcsIGxhYmVsOiAnTGVmdCcgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdmbG9hdGluZycsIGxhYmVsOiAnRmxvYXRpbmcnIH0sXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnZml4ZWQnLCBsYWJlbDogJ0ZpeGVkJyB9XG4gICAgICAgICAgICAgICAgXVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBXaWR0aCAmIEhlaWdodCAtIFNpZGUgYnkgc2lkZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtaGFsZlwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInN5cGVfd2lkdGhcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3dpZHRoXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjIwcHhcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiV2lkdGhcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1oYWxmXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9oZWlnaHRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2hlaWdodFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIyMHB4XCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkhlaWdodFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTGVhZGluZyBJY29uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2xlYWRpbmdfaWNvblwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfbGVhZGluZ19pY29uXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBpY29uIG5hbWVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIkxlYWRpbmcgSWNvblwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGVmYXVsdCBWYWx1ZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV9kZWZhdWx0XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9kZWZhdWx0XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZWZhdWx0IHZhbHVlXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IFZhbHVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZWdleCBQYXR0ZXJuIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX3JlZ2V4XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9yZWdleFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcmVnZXggcGF0dGVyblwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmVnZXggUGF0dGVyblwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gT3B0aW9uIEtleSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV9vcHRpb25fa2V5XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9vcHRpb25fa2V5XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBvcHRpb24ga2V5XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJPcHRpb24gS2V5XCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFbnRpdHkgSUQgKEF1dG8tYXNzaWduZWQgZnJvbSBBcHBTdGF0ZSkgLSBIaWRkZW4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2VudGl0eV9pZF9zeWVuXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9lbnRpdHlfaWRfc3llblwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQXV0by1hc3NpZ25lZCBmcm9tIHN5c3RlbVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRW50aXR5IElEIChBdXRvLWFzc2lnbmVkKVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5PlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ29udHJvbCBPcHRpb25zIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm9wdGlvbnMtdGl0bGVcIj5Db250cm9sIE9wdGlvbnM8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtZ3JpZFwiPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBSZXF1aXJlZCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgICAgICBpZD1cInN5cGVfcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIERpc2FibGVkIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGlkPVwic3lwZV9kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gSGlkZSBMYWJlbCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgICAgICBpZD1cInN5cGVfbGFiZWxfaGlkZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9sYWJlbF9oaWRlXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGlkZSBMYWJlbFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEhpZGUgSGVscGVyIFRleHQgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgICAgaWQ9XCJzeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGlkZSBIZWxwZXIgVGV4dFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEhlbHBlciBUZXh0IENvbGxhcHNlIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGlkPVwic3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkNvbGxhcHNlIEhlbHBlclwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRm9ybSgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICBjaWRlRWxlQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICAgIHt7IGlzRWRpdE1vZGUoKSA/ICdVcGRhdGUgQ29udHJvbCcgOiAnQ3JlYXRlIENvbnRyb2wnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250cm9scyBMaXN0IFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWxpc3Qtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWhlYWRlclwiPlxuICAgICAgICA8aDM+UGFnZSBDb250cm9sczwvaDM+XG4gICAgICAgIDxwPkNvbnRyb2xzIGNvbm5lY3RlZCB0byB0aGlzIHBhZ2U8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1saXN0XCIgKm5nSWY9XCIhbG9hZGluZygpICYmIGNvbnRyb2xzKCkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWl0ZW1cIiBcbiAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgY29udHJvbHMoKTsgdHJhY2tCeTogdHJhY2tCeUNvbnRyb2xJZFwiXG4gICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZENvbnRyb2xJZCgpID09PSBjb250cm9sLl9pZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDb250cm9sKGNvbnRyb2wpXCJcbiAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbGVjdENvbnRyb2woY29udHJvbClcIlxuICAgICAgICAgICAoa2V5dXAuc3BhY2UpPVwic2VsZWN0Q29udHJvbChjb250cm9sKVwiXG4gICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3QgY29udHJvbCAnICsgKGNvbnRyb2wuc3lwZV9sYWJlbCB8fCBjb250cm9sLnN5cGVfa2V5KVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtaWNvblwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbj5zZXR0aW5nc19pbnB1dF9jb21wb25lbnQ8L2NpZGUtZWxlLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWluZm9cIj5cbiAgICAgICAgICAgICAgPGg0Pnt7IGNvbnRyb2wuc3lwZV9sYWJlbCB8fCBjb250cm9sLnN5cGVfa2V5IH19PC9oND5cbiAgICAgICAgICAgICAgPHA+e3sgY29udHJvbC5zeXBlX3Rvb2x0aXAgfHwgJ05vIHRvb2x0aXAnIH19PC9wPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1tZXRhXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250cm9sLXR5cGVcIj57eyBjb250cm9sLnN5cGVfdHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtc3RhdHVzXCIgW2NsYXNzLmFjdGl2ZV09XCJjb250cm9sLnN5cGVfaXNhY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbnRyb2wuc3lwZV9pc2FjdGl2ZSA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICBjaWRlRWxlQnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29udHJvbChjb250cm9sKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24+ZWRpdDwvY2lkZS1lbGUtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29udHJvbChjb250cm9sKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24+ZGVsZXRlPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHMtbGlzdC1lbXB0eVwiICpuZ0lmPVwiIWxvYWRpbmcoKSAmJiBjb250cm9scygpLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8Y2lkZS1lbGUtaWNvbj5zZXR0aW5nc19pbnB1dF9jb21wb25lbnQ8L2NpZGUtZWxlLWljb24+XG4gICAgICAgIDxwPk5vIGNvbnRyb2xzIGF2YWlsYWJsZTwvcD5cbiAgICAgICAgPHNtYWxsPkNyZWF0ZSBjb250cm9scyB1c2luZyB0aGUgZm9ybSBvbiB0aGUgbGVmdDwvc21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWxpc3QtbG9hZGluZ1wiICpuZ0lmPVwibG9hZGluZygpXCI+XG4gICAgICAgIDxjaWRlLWVsZS1pY29uIGNsYXNzPVwic3Bpbm5pbmdcIj5yZWZyZXNoPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8cD5Mb2FkaW5nIGNvbnRyb2xzLi4uPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiAiXX0=