cloud-ide-admin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/cloud-ide-admin.mjs +5 -0
- package/esm2022/lib/admin-module/entity/create/cide-adm-entity.component.mjs +834 -0
- package/esm2022/lib/admin-module/entity/create/cide-adm-entity.service.mjs +79 -0
- package/esm2022/lib/admin-module/entity/create/country-select.service.mjs +33 -0
- package/esm2022/lib/admin-module/entity/create/currency-select.service.mjs +48 -0
- package/esm2022/lib/admin-module/entity/create/general-master-select.service.mjs +44 -0
- package/esm2022/lib/admin-module/entity/create/pin-code-select.service.mjs +60 -0
- package/esm2022/lib/admin-module/entity/create/user-select.service.mjs +58 -0
- package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.component.mjs +600 -0
- package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.service.mjs +52 -0
- package/esm2022/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.mjs +21 -0
- package/esm2022/lib/cide-adm-admin.component.mjs +29 -0
- package/esm2022/lib/cide-adm-admin.service.mjs +14 -0
- package/esm2022/lib/cloud-ide-admin.routes.mjs +38 -0
- package/esm2022/public-api.mjs +10 -0
- package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs +24 -0
- package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs.map +1 -0
- package/fesm2022/cloud-ide-admin.mjs +1867 -0
- package/fesm2022/cloud-ide-admin.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/admin-module/entity/create/cide-adm-entity.component.d.ts +73 -0
- package/lib/admin-module/entity/create/cide-adm-entity.service.d.ts +39 -0
- package/lib/admin-module/entity/create/country-select.service.d.ts +13 -0
- package/lib/admin-module/entity/create/currency-select.service.d.ts +19 -0
- package/lib/admin-module/entity/create/general-master-select.service.d.ts +24 -0
- package/lib/admin-module/entity/create/pin-code-select.service.d.ts +31 -0
- package/lib/admin-module/entity/create/user-select.service.d.ts +31 -0
- package/lib/admin-module/entity/list/cide-adm-entity-list.component.d.ts +94 -0
- package/lib/admin-module/entity/list/cide-adm-entity-list.service.d.ts +25 -0
- package/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.d.ts +9 -0
- package/lib/cide-adm-admin.component.d.ts +9 -0
- package/lib/cide-adm-admin.service.d.ts +6 -0
- package/lib/cloud-ide-admin.routes.d.ts +2 -0
- package/package.json +25 -0
- package/public-api.d.ts +6 -0
|
@@ -0,0 +1,834 @@
|
|
|
1
|
+
import { Component, signal, inject } from '@angular/core';
|
|
2
|
+
import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';
|
|
3
|
+
import { ActivatedRoute } from '@angular/router';
|
|
4
|
+
import { CideAdmEntityService } from './cide-adm-entity.service';
|
|
5
|
+
import { CideInputComponent, CideSelectComponent, CideEleTabComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
6
|
+
import { CideEleFileInputComponent, CideTextareaComponent } from 'cloud-ide-element';
|
|
7
|
+
import { GeneralMasterSelectService } from './general-master-select.service';
|
|
8
|
+
import { PinCodeSelectService } from './pin-code-select.service';
|
|
9
|
+
import { UserSelectService } from './user-select.service';
|
|
10
|
+
import { CurrencySelectService } from './currency-select.service';
|
|
11
|
+
import { CountrySelectService } from './country-select.service';
|
|
12
|
+
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
13
|
+
import { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/forms";
|
|
16
|
+
export class CideAdmEntityComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.entityTypes = signal([]);
|
|
19
|
+
this.currencies = signal([]);
|
|
20
|
+
this.users = signal([]);
|
|
21
|
+
this.postalCodes = signal([]);
|
|
22
|
+
this.photoIdDocuments = signal([]);
|
|
23
|
+
this.countries = signal([]);
|
|
24
|
+
// Store the full pin code data for auto-population
|
|
25
|
+
this.pinCodeDataMap = new Map();
|
|
26
|
+
this.loading = signal(false);
|
|
27
|
+
this.error = signal(null);
|
|
28
|
+
this.success = signal(null);
|
|
29
|
+
// Loading states for individual dropdowns
|
|
30
|
+
this.postalCodesLoading = signal(false);
|
|
31
|
+
this.usersLoading = signal(false);
|
|
32
|
+
this.countriesLoading = signal(false);
|
|
33
|
+
// Entity mode and ID
|
|
34
|
+
this.isEditMode = signal(false);
|
|
35
|
+
this.entityId = signal(null);
|
|
36
|
+
// Tab configuration
|
|
37
|
+
this.activeTab = signal('basic');
|
|
38
|
+
this.entityTabs = signal([
|
|
39
|
+
{ id: 'basic', label: 'Basic Information', icon: 'âšī¸' },
|
|
40
|
+
{ id: 'corporate', label: 'Corporate Address', icon: 'đĸ' },
|
|
41
|
+
{ id: 'contact', label: 'Contact Information', icon: 'đ§' },
|
|
42
|
+
{ id: 'registered', label: 'Registered Address', icon: 'đ ' },
|
|
43
|
+
{ id: 'documents', label: 'Documents & Media', icon: 'đ' }
|
|
44
|
+
]);
|
|
45
|
+
// Modern dependency injection using inject()
|
|
46
|
+
this.entityService = inject(CideAdmEntityService);
|
|
47
|
+
this.generalMasterService = inject(GeneralMasterSelectService);
|
|
48
|
+
this.pinCodeService = inject(PinCodeSelectService);
|
|
49
|
+
this.userService = inject(UserSelectService);
|
|
50
|
+
this.currencyService = inject(CurrencySelectService);
|
|
51
|
+
this.countryService = inject(CountrySelectService);
|
|
52
|
+
this.fb = inject(FormBuilder);
|
|
53
|
+
this.route = inject(ActivatedRoute);
|
|
54
|
+
this.destroy$ = new Subject();
|
|
55
|
+
this.entityForm = this.fb.group({
|
|
56
|
+
// Basic Information
|
|
57
|
+
syen_name: ['', [Validators.required]],
|
|
58
|
+
syen_entity_code: ['', [Validators.required, Validators.maxLength(40)]],
|
|
59
|
+
syen_entity_type_gmst: ['', [Validators.required]],
|
|
60
|
+
syen_udise_no: [''],
|
|
61
|
+
syen_affiliation_no: [''],
|
|
62
|
+
syen_isactive: [true],
|
|
63
|
+
// Corporate Address
|
|
64
|
+
syen_corporate_address: [''],
|
|
65
|
+
syen_corporate_city_sypin: [''],
|
|
66
|
+
syen_corporate_state_sypin: [''],
|
|
67
|
+
syen_corporate_country_syctr: [''],
|
|
68
|
+
syen_corporate_pin_sypin: [''],
|
|
69
|
+
// Contact Information
|
|
70
|
+
syen_corporate_contact_person_user: [''],
|
|
71
|
+
syen_corporate_phone: [''],
|
|
72
|
+
syen_corporate_phone_alt: [''],
|
|
73
|
+
syen_corporate_fax: [''],
|
|
74
|
+
syen_corporate_email: ['', [Validators.email]],
|
|
75
|
+
syen_corporate_email_alt: ['', [Validators.email]],
|
|
76
|
+
syen_website: ['', [Validators.pattern(/^https?:\/\/.+/)]],
|
|
77
|
+
syen_currency_sycr: [''],
|
|
78
|
+
// Registered Address
|
|
79
|
+
syen_registered_address: [''],
|
|
80
|
+
syen_registered_city_sypin: [''],
|
|
81
|
+
syen_registered_state_sypin: [''],
|
|
82
|
+
syen_registered_country_syctr: [''],
|
|
83
|
+
syen_registered_pin_sypin: [''],
|
|
84
|
+
syen_registered_contact_person_user: [''],
|
|
85
|
+
syen_registered_phone: [''],
|
|
86
|
+
syen_registered_email: ['', [Validators.email]],
|
|
87
|
+
syen_registered_fax: [''],
|
|
88
|
+
// Documents
|
|
89
|
+
syen_photo_id_cyfm: ['']
|
|
90
|
+
});
|
|
91
|
+
// Listen for postal code changes to auto-populate address fields
|
|
92
|
+
this.setupPostalCodeListeners();
|
|
93
|
+
}
|
|
94
|
+
ngOnInit() {
|
|
95
|
+
// Add global error handler to catch any unhandled errors
|
|
96
|
+
const errorHandler = (event) => {
|
|
97
|
+
console.error('đĨ GLOBAL ERROR:', event.error);
|
|
98
|
+
};
|
|
99
|
+
const rejectionHandler = (event) => {
|
|
100
|
+
console.error('đĨ UNHANDLED PROMISE REJECTION:', event.reason);
|
|
101
|
+
};
|
|
102
|
+
window.addEventListener('error', errorHandler);
|
|
103
|
+
window.addEventListener('unhandledrejection', rejectionHandler);
|
|
104
|
+
// Store handlers for cleanup
|
|
105
|
+
this.globalErrorHandler = errorHandler;
|
|
106
|
+
this.globalRejectionHandler = rejectionHandler;
|
|
107
|
+
// Check for entity ID in query parameters
|
|
108
|
+
this.checkForEntityId();
|
|
109
|
+
this.loadDropdowns();
|
|
110
|
+
}
|
|
111
|
+
ngOnDestroy() {
|
|
112
|
+
// Clean up global event listeners
|
|
113
|
+
if (this.globalErrorHandler) {
|
|
114
|
+
window.removeEventListener('error', this.globalErrorHandler);
|
|
115
|
+
}
|
|
116
|
+
if (this.globalRejectionHandler) {
|
|
117
|
+
window.removeEventListener('unhandledrejection', this.globalRejectionHandler);
|
|
118
|
+
}
|
|
119
|
+
// Clean up RxJS subscriptions
|
|
120
|
+
this.destroy$.next();
|
|
121
|
+
this.destroy$.complete();
|
|
122
|
+
}
|
|
123
|
+
// Check for entity ID in query parameters
|
|
124
|
+
checkForEntityId() {
|
|
125
|
+
console.log('đ Checking for entity ID in query parameters', this.route.params);
|
|
126
|
+
this.route.params.pipe(takeUntil(this.destroy$)).subscribe(params => {
|
|
127
|
+
console.log('đ Query params:', params);
|
|
128
|
+
// Check for entityId, id, or entity parameter
|
|
129
|
+
const queryParams = params['query'];
|
|
130
|
+
const queryData = generateObjectFromString(queryParams);
|
|
131
|
+
// If entityId is an object string (from generateStringFromObject), try to parse it
|
|
132
|
+
const entityId = queryData.syen_id;
|
|
133
|
+
if (entityId) {
|
|
134
|
+
console.log('đ Entity ID found in query params:', entityId);
|
|
135
|
+
this.entityId.set(entityId);
|
|
136
|
+
this.isEditMode.set(true);
|
|
137
|
+
this.loadEntityData(entityId);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log('đ No entity ID found - creating new entity');
|
|
141
|
+
this.isEditMode.set(false);
|
|
142
|
+
this.entityId.set(null);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Load entity data for editing
|
|
147
|
+
loadEntityData(entityId) {
|
|
148
|
+
this.loading.set(true);
|
|
149
|
+
this.error.set(null);
|
|
150
|
+
console.log('đĨ Loading entity data for ID:', entityId);
|
|
151
|
+
this.entityService.getEntityById(entityId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
152
|
+
next: (response) => {
|
|
153
|
+
console.log('â
Entity data loaded:', response);
|
|
154
|
+
if (response?.success && response?.data) {
|
|
155
|
+
// Handle both array and single object responses
|
|
156
|
+
const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
157
|
+
if (entityData) {
|
|
158
|
+
this.populateFormWithEntityData(entityData);
|
|
159
|
+
this.success.set('Entity data loaded successfully');
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
this.error.set('Entity data not found');
|
|
163
|
+
console.error('â Entity data not found in response:', response);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.error.set('Failed to load entity data');
|
|
168
|
+
console.error('â Entity data response invalid:', response);
|
|
169
|
+
}
|
|
170
|
+
this.loading.set(false);
|
|
171
|
+
},
|
|
172
|
+
error: (err) => {
|
|
173
|
+
console.error('â Failed to load entity data:', err);
|
|
174
|
+
let errorMessage = 'Failed to load entity data.';
|
|
175
|
+
if (err?.error?.message) {
|
|
176
|
+
errorMessage = err.error.message;
|
|
177
|
+
}
|
|
178
|
+
else if (err?.message) {
|
|
179
|
+
errorMessage = err.message;
|
|
180
|
+
}
|
|
181
|
+
else if (err?.status === 404) {
|
|
182
|
+
errorMessage = 'Entity not found.';
|
|
183
|
+
}
|
|
184
|
+
else if (err?.status === 500) {
|
|
185
|
+
errorMessage = 'Server error. Please try again later.';
|
|
186
|
+
}
|
|
187
|
+
this.error.set(errorMessage);
|
|
188
|
+
this.loading.set(false);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Populate form with entity data
|
|
193
|
+
populateFormWithEntityData(entityData) {
|
|
194
|
+
try {
|
|
195
|
+
console.log('đ Populating form with entity data:', entityData);
|
|
196
|
+
// Map the entity data to form controls - only use properties that exist in entityResponseData
|
|
197
|
+
const formData = {
|
|
198
|
+
// Basic Information
|
|
199
|
+
syen_name: entityData.syen_name || '',
|
|
200
|
+
syen_entity_code: entityData.syen_entity_code || '',
|
|
201
|
+
syen_entity_type_gmst: entityData.syen_entity_type_gmst || '',
|
|
202
|
+
syen_isactive: entityData.syen_isactive !== undefined ? entityData.syen_isactive : true,
|
|
203
|
+
// Contact Information (only properties that exist in entityResponseData)
|
|
204
|
+
syen_corporate_contact_person_user: entityData.syen_corporate_contact_person_user || '',
|
|
205
|
+
syen_corporate_phone: entityData.syen_corporate_phone || '',
|
|
206
|
+
syen_corporate_email: entityData.syen_corporate_email || '',
|
|
207
|
+
// Set default values for other fields since they're not in entityResponseData
|
|
208
|
+
syen_udise_no: entityData.syen_udise_no || '',
|
|
209
|
+
syen_affiliation_no: entityData.syen_affiliation_no || '',
|
|
210
|
+
syen_corporate_address: entityData.syen_corporate_address || '',
|
|
211
|
+
syen_corporate_city_sypin: entityData.syen_corporate_city_sypin || '',
|
|
212
|
+
syen_corporate_state_sypin: entityData.syen_corporate_state_sypin || '',
|
|
213
|
+
syen_corporate_country_syctr: entityData.syen_corporate_country_syctr || '',
|
|
214
|
+
syen_corporate_pin_sypin: entityData.syen_corporate_pin_sypin || '',
|
|
215
|
+
syen_corporate_phone_alt: entityData.syen_corporate_phone_alt || '',
|
|
216
|
+
syen_corporate_fax: entityData.syen_corporate_fax || '',
|
|
217
|
+
syen_corporate_email_alt: entityData.syen_corporate_email_alt || '',
|
|
218
|
+
syen_website: entityData.syen_website || '',
|
|
219
|
+
syen_currency_sycr: entityData.syen_currency_sycr || '',
|
|
220
|
+
syen_registered_address: entityData.syen_registered_address || '',
|
|
221
|
+
syen_registered_city_sypin: entityData.syen_registered_city_sypin || '',
|
|
222
|
+
syen_registered_state_sypin: entityData.syen_registered_state_sypin || '',
|
|
223
|
+
syen_registered_country_syctr: entityData.syen_registered_country_syctr || '',
|
|
224
|
+
syen_registered_pin_sypin: entityData.syen_registered_pin_sypin || '',
|
|
225
|
+
syen_registered_contact_person_user: entityData.syen_registered_contact_person_user || '',
|
|
226
|
+
syen_registered_phone: entityData.syen_registered_phone || '',
|
|
227
|
+
syen_registered_email: entityData.syen_registered_email || '',
|
|
228
|
+
syen_registered_fax: entityData.syen_registered_fax || '',
|
|
229
|
+
syen_photo_id_cyfm: entityData.syen_photo_id_cyfm || ''
|
|
230
|
+
};
|
|
231
|
+
// Patch the form with the entity data
|
|
232
|
+
this.entityForm.patchValue(formData, { emitEvent: false });
|
|
233
|
+
console.log('â
Form populated successfully');
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.error('đĨ Error populating form with entity data:', error);
|
|
237
|
+
this.error.set('Error loading entity data into form');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Setup listeners for postal code changes
|
|
241
|
+
setupPostalCodeListeners() {
|
|
242
|
+
// Corporate postal code listener
|
|
243
|
+
this.entityForm.get('syen_corporate_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
|
|
244
|
+
if (pinCodeId) {
|
|
245
|
+
this.populateAddressFromPinCode(pinCodeId, 'corporate');
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
// Registered postal code listener
|
|
249
|
+
this.entityForm.get('syen_registered_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
|
|
250
|
+
if (pinCodeId) {
|
|
251
|
+
this.populateAddressFromPinCode(pinCodeId, 'registered');
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Auto-populate address fields based on selected postal code
|
|
256
|
+
populateAddressFromPinCode(pinCodeId, addressType) {
|
|
257
|
+
const pinCodeData = this.pinCodeDataMap.get(pinCodeId);
|
|
258
|
+
console.log('đ Pin Code Data:', pinCodeData);
|
|
259
|
+
if (!pinCodeData) {
|
|
260
|
+
console.warn(`Pin code data not found for ID: ${pinCodeId}`);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const prefix = addressType === 'corporate' ? 'syen_corporate' : 'syen_registered';
|
|
264
|
+
// Populate city, state, and country fields
|
|
265
|
+
this.entityForm.patchValue({
|
|
266
|
+
[`${prefix}_city_sypin`]: pinCodeData.sypin_district || '',
|
|
267
|
+
[`${prefix}_state_sypin`]: pinCodeData.sypin_state_name || '',
|
|
268
|
+
[`${prefix}_country_syctr`]: pinCodeData.sypin_country_id_syctr || ''
|
|
269
|
+
}, { emitEvent: false });
|
|
270
|
+
console.log(`đ Auto-populated ${addressType} address from pin code:`, {
|
|
271
|
+
city: pinCodeData.sypin_district,
|
|
272
|
+
state: pinCodeData.sypin_state_name,
|
|
273
|
+
country: pinCodeData.sypin_country_id_syctr
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
loadDropdowns() {
|
|
277
|
+
try {
|
|
278
|
+
console.log('đ Loading dropdowns...');
|
|
279
|
+
// Load entity types via general master service
|
|
280
|
+
this.generalMasterService.getGeneralMasterByCode('core_entity_type').subscribe({
|
|
281
|
+
next: (response) => {
|
|
282
|
+
try {
|
|
283
|
+
console.log('â
Entity types response:', response);
|
|
284
|
+
const types = this.transformGeneralMasterToDropdown(response);
|
|
285
|
+
this.entityTypes.set(types);
|
|
286
|
+
console.log('đ Loaded entity types:', types.length);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
console.error('đĨ Entity types transform error:', error);
|
|
290
|
+
this.entityTypes.set([]);
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
error: (err) => {
|
|
294
|
+
console.error('â Failed to load entity types:', err);
|
|
295
|
+
this.entityTypes.set([]);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// Load currencies via currency service
|
|
299
|
+
this.currencyService.getAllCurrencies({}).subscribe({
|
|
300
|
+
next: (response) => {
|
|
301
|
+
try {
|
|
302
|
+
console.log('â
Currencies response:', response);
|
|
303
|
+
const currencies = this.transformCurrencyToDropdown(response);
|
|
304
|
+
this.currencies.set(currencies);
|
|
305
|
+
console.log('đ° Loaded currencies:', currencies.length);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.error('đĨ Currencies transform error:', error);
|
|
309
|
+
this.currencies.set([]);
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
error: (err) => {
|
|
313
|
+
console.error('â Failed to load currencies:', err);
|
|
314
|
+
this.currencies.set([]);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
// Load users via user service
|
|
318
|
+
this.userService.getAllUsers().subscribe({
|
|
319
|
+
next: (response) => {
|
|
320
|
+
try {
|
|
321
|
+
console.log('â
Users response:', response);
|
|
322
|
+
const users = this.transformUserToDropdown(response);
|
|
323
|
+
this.users.set(users);
|
|
324
|
+
console.log('đĨ Loaded users:', users.length);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
console.error('đĨ Users transform error:', error);
|
|
328
|
+
this.users.set([]);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
error: (err) => {
|
|
332
|
+
console.error('â Failed to load users:', err);
|
|
333
|
+
this.users.set([]);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
// Load postal codes via pin code service
|
|
337
|
+
this.pinCodeService.getAllPostalCodes().subscribe({
|
|
338
|
+
next: (response) => {
|
|
339
|
+
try {
|
|
340
|
+
console.log('â
Postal codes response:', response);
|
|
341
|
+
const postalCodes = this.transformPinCodeToDropdown(response);
|
|
342
|
+
this.postalCodes.set(postalCodes);
|
|
343
|
+
console.log('đŽ Loaded postal codes:', postalCodes.length);
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
console.error('đĨ Postal codes transform error:', error);
|
|
347
|
+
this.postalCodes.set([]);
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
error: (err) => {
|
|
351
|
+
console.error('â Failed to load postal codes:', err);
|
|
352
|
+
this.postalCodes.set([]);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
// Load photo ID documents via general master service
|
|
356
|
+
this.generalMasterService.getGeneralMasterByCode('core_photo_id_document').subscribe({
|
|
357
|
+
next: (response) => {
|
|
358
|
+
try {
|
|
359
|
+
console.log('â
Photo ID documents response:', response);
|
|
360
|
+
const documents = this.transformGeneralMasterToDropdown(response);
|
|
361
|
+
this.photoIdDocuments.set(documents);
|
|
362
|
+
console.log('đ Loaded photo ID documents:', documents.length);
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.error('đĨ Photo ID documents transform error:', error);
|
|
366
|
+
this.photoIdDocuments.set([]);
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
error: (err) => {
|
|
370
|
+
console.error('â Failed to load photo ID documents:', err);
|
|
371
|
+
// Fallback to static data
|
|
372
|
+
this.photoIdDocuments.set([
|
|
373
|
+
{ value: 'passport', label: 'Passport' },
|
|
374
|
+
{ value: 'license', label: 'Driver License' },
|
|
375
|
+
{ value: 'national_id', label: 'National ID' },
|
|
376
|
+
{ value: 'voter_id', label: 'Voter ID' },
|
|
377
|
+
{ value: 'other', label: 'Other' }
|
|
378
|
+
]);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
// Load countries via country service
|
|
382
|
+
this.countryService.getAllCountries({}).subscribe({
|
|
383
|
+
next: (response) => {
|
|
384
|
+
try {
|
|
385
|
+
console.log('â
Countries response:', response);
|
|
386
|
+
const countries = this.transformCountryToDropdown(response);
|
|
387
|
+
this.countries.set(countries);
|
|
388
|
+
console.log('đ Loaded countries:', countries.length);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
console.error('đĨ Countries transform error:', error);
|
|
392
|
+
this.countries.set([]);
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
error: (err) => {
|
|
396
|
+
console.error('â Failed to load countries:', err);
|
|
397
|
+
this.countries.set([]);
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
console.error('đĨ LOADDROPDOWNS EXCEPTION:', error);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Helper method to transform general master response to dropdown options
|
|
406
|
+
transformGeneralMasterToDropdown(response) {
|
|
407
|
+
if (!response?.success || !response?.data) {
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
let dataArray = [];
|
|
411
|
+
// Handle different response structures - all general master data is in core_general_master
|
|
412
|
+
if (Array.isArray(response.data)) {
|
|
413
|
+
dataArray = response.data;
|
|
414
|
+
}
|
|
415
|
+
return dataArray.map((item, index) => {
|
|
416
|
+
return {
|
|
417
|
+
// API response already includes value and label fields
|
|
418
|
+
value: item.value || item._id || `value_${index}`,
|
|
419
|
+
label: item.label || item.sygms_title || 'Untitled'
|
|
420
|
+
};
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
// Helper method to transform currency response to dropdown options
|
|
424
|
+
transformCurrencyToDropdown(response) {
|
|
425
|
+
if (!response?.success || !response?.data) {
|
|
426
|
+
return [];
|
|
427
|
+
}
|
|
428
|
+
console.log('đ Currency Response:', response);
|
|
429
|
+
// Handle different response structures
|
|
430
|
+
let dataArray = [];
|
|
431
|
+
if (Array.isArray(response.data)) {
|
|
432
|
+
dataArray = response.data;
|
|
433
|
+
}
|
|
434
|
+
return dataArray.map((item) => {
|
|
435
|
+
return {
|
|
436
|
+
value: item._id,
|
|
437
|
+
label: `${item.sycr_code} - ${item.sycr_name} (${item.sycr_symbol})`
|
|
438
|
+
};
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
// Helper method to transform user response to dropdown options
|
|
442
|
+
transformUserToDropdown(response) {
|
|
443
|
+
if (!response?.success || !response?.data) {
|
|
444
|
+
return [];
|
|
445
|
+
}
|
|
446
|
+
let dataArray = [];
|
|
447
|
+
// Handle different response structures
|
|
448
|
+
if (response.data.auth_user_mst) {
|
|
449
|
+
dataArray = response.data.auth_user_mst;
|
|
450
|
+
}
|
|
451
|
+
else if (Array.isArray(response.data)) {
|
|
452
|
+
dataArray = response.data;
|
|
453
|
+
}
|
|
454
|
+
return dataArray.map((item) => {
|
|
455
|
+
return {
|
|
456
|
+
value: item._id || "",
|
|
457
|
+
label: item?.user_fullname || ""
|
|
458
|
+
};
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
// Helper method to transform pin code response to dropdown options
|
|
462
|
+
transformPinCodeToDropdown(response) {
|
|
463
|
+
if (!response?.success || !response?.data) {
|
|
464
|
+
return [];
|
|
465
|
+
}
|
|
466
|
+
let dataArray = [];
|
|
467
|
+
// Handle different response structures
|
|
468
|
+
if ('core_pin_code' in response.data && response.data.core_pin_code) {
|
|
469
|
+
dataArray = response.data.core_pin_code;
|
|
470
|
+
}
|
|
471
|
+
// Clear the data map and rebuild it
|
|
472
|
+
this.pinCodeDataMap.clear();
|
|
473
|
+
return dataArray.map((item) => {
|
|
474
|
+
const pinCodeId = String(item._id);
|
|
475
|
+
// Store the full pin code data for auto-population
|
|
476
|
+
this.pinCodeDataMap.set(pinCodeId, item);
|
|
477
|
+
// API response already includes value and label fields
|
|
478
|
+
return {
|
|
479
|
+
value: pinCodeId,
|
|
480
|
+
label: `${item.sypin_pincode} - ${item.sypin_office_name || 'Unknown Office'}`
|
|
481
|
+
};
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
// Helper method to transform country response to dropdown options
|
|
485
|
+
transformCountryToDropdown(response) {
|
|
486
|
+
try {
|
|
487
|
+
if (!response?.success || !response?.data) {
|
|
488
|
+
console.warn('â ī¸ Country response missing success or data:', response);
|
|
489
|
+
return [];
|
|
490
|
+
}
|
|
491
|
+
console.log('đ Country Response:', response);
|
|
492
|
+
let dataArray = [];
|
|
493
|
+
// Handle different response structures
|
|
494
|
+
if (Array.isArray(response.data)) {
|
|
495
|
+
dataArray = response.data;
|
|
496
|
+
}
|
|
497
|
+
else if (response.data) {
|
|
498
|
+
dataArray = response.data;
|
|
499
|
+
}
|
|
500
|
+
console.log('đ Country data array length:', dataArray.length);
|
|
501
|
+
return dataArray.map((item) => {
|
|
502
|
+
return {
|
|
503
|
+
value: item._id || "",
|
|
504
|
+
label: `${item.syctr_country_iso_name || 'Unknown'} (${item.syctr_country_iso_code_two_char || 'XX'})`
|
|
505
|
+
};
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
console.error('đĨ COUNTRY TRANSFORM EXCEPTION:', error);
|
|
510
|
+
return [];
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
// Helper method to get form control
|
|
514
|
+
getControl(controlName) {
|
|
515
|
+
return this.entityForm.get(controlName);
|
|
516
|
+
}
|
|
517
|
+
// Handle postal code search with debouncing
|
|
518
|
+
onPostalCodeSearch(event) {
|
|
519
|
+
try {
|
|
520
|
+
console.log('đ POSTAL CODE SEARCH EVENT:', event);
|
|
521
|
+
// Set loading state
|
|
522
|
+
this.postalCodesLoading.set(true);
|
|
523
|
+
const payload = {
|
|
524
|
+
sypin_pincode: event.query || "",
|
|
525
|
+
sypin_id: event.value || ""
|
|
526
|
+
};
|
|
527
|
+
console.log('đ POSTAL CODE PAYLOAD:', payload);
|
|
528
|
+
this.pinCodeService.searchPinCodes(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
529
|
+
next: (response) => {
|
|
530
|
+
console.log('â
POSTAL CODE SEARCH SUCCESS:', response);
|
|
531
|
+
const postalCodes = this.transformPinCodeToDropdown(response);
|
|
532
|
+
this.postalCodes.set(postalCodes);
|
|
533
|
+
console.log('đŽ Updated postal codes count:', postalCodes.length);
|
|
534
|
+
},
|
|
535
|
+
error: (err) => {
|
|
536
|
+
console.error('â POSTAL CODE SEARCH ERROR:', err);
|
|
537
|
+
this.postalCodes.set([]);
|
|
538
|
+
},
|
|
539
|
+
complete: () => {
|
|
540
|
+
// Clear loading state
|
|
541
|
+
this.postalCodesLoading.set(false);
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
catch (error) {
|
|
546
|
+
console.error('đĨ POSTAL CODE SEARCH EXCEPTION:', error);
|
|
547
|
+
this.postalCodes.set([]);
|
|
548
|
+
this.postalCodesLoading.set(false);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
// Handle user search
|
|
552
|
+
onUserSearch(event) {
|
|
553
|
+
try {
|
|
554
|
+
console.log('đ USER SEARCH EVENT:', event);
|
|
555
|
+
// Set loading state
|
|
556
|
+
this.usersLoading.set(true);
|
|
557
|
+
const payload = {
|
|
558
|
+
user_fullname: event?.query || "",
|
|
559
|
+
user_id: event?.value || "",
|
|
560
|
+
};
|
|
561
|
+
console.log('đ USER SEARCH PAYLOAD:', payload);
|
|
562
|
+
this.userService.searchUsersByFullname(payload).subscribe({
|
|
563
|
+
next: (response) => {
|
|
564
|
+
console.log('â
USER SEARCH SUCCESS:', response);
|
|
565
|
+
const users = this.transformUserToDropdown(response);
|
|
566
|
+
this.users.set(users);
|
|
567
|
+
console.log('đĨ Updated users count:', users.length);
|
|
568
|
+
},
|
|
569
|
+
error: (err) => {
|
|
570
|
+
console.error('â USER SEARCH ERROR:', err);
|
|
571
|
+
this.users.set([]);
|
|
572
|
+
},
|
|
573
|
+
complete: () => {
|
|
574
|
+
// Clear loading state
|
|
575
|
+
this.usersLoading.set(false);
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
catch (error) {
|
|
580
|
+
console.error('đĨ USER SEARCH EXCEPTION:', error);
|
|
581
|
+
this.users.set([]);
|
|
582
|
+
this.usersLoading.set(false);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
// Handle country search
|
|
586
|
+
onCountrySearch(event) {
|
|
587
|
+
try {
|
|
588
|
+
console.log('đ COUNTRY SEARCH EVENT:', event);
|
|
589
|
+
// Set loading state
|
|
590
|
+
this.countriesLoading.set(true);
|
|
591
|
+
const payload = {
|
|
592
|
+
query: event.query,
|
|
593
|
+
syctr_id: event.value,
|
|
594
|
+
};
|
|
595
|
+
console.log('đ COUNTRY SEARCH PAYLOAD:', payload);
|
|
596
|
+
this.countryService.getAllCountries(payload).subscribe({
|
|
597
|
+
next: (response) => {
|
|
598
|
+
console.log('â
COUNTRY SEARCH SUCCESS:', response);
|
|
599
|
+
const countries = this.transformCountryToDropdown(response);
|
|
600
|
+
this.countries.set(countries);
|
|
601
|
+
console.log('đ Updated countries count:', countries.length);
|
|
602
|
+
},
|
|
603
|
+
error: (err) => {
|
|
604
|
+
console.error('â COUNTRY SEARCH ERROR:', err);
|
|
605
|
+
this.countries.set([]);
|
|
606
|
+
},
|
|
607
|
+
complete: () => {
|
|
608
|
+
// Clear loading state
|
|
609
|
+
this.countriesLoading.set(false);
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
console.error('đĨ COUNTRY SEARCH EXCEPTION:', error);
|
|
615
|
+
this.countries.set([]);
|
|
616
|
+
this.countriesLoading.set(false);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
// Handle postal code selection
|
|
620
|
+
onPostalCodeSelection(event) {
|
|
621
|
+
let pinCodeId = '';
|
|
622
|
+
if (typeof event === 'string') {
|
|
623
|
+
pinCodeId = event;
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
const target = event.target;
|
|
627
|
+
pinCodeId = target?.value || '';
|
|
628
|
+
}
|
|
629
|
+
console.log('đ Postal Code Selected:', pinCodeId);
|
|
630
|
+
// The auto-population is handled by the form value change listeners
|
|
631
|
+
// This method can be used for additional logic if needed
|
|
632
|
+
}
|
|
633
|
+
// Check if a field has an error
|
|
634
|
+
hasError(controlName, errorType) {
|
|
635
|
+
const control = this.getControl(controlName);
|
|
636
|
+
if (!control)
|
|
637
|
+
return false;
|
|
638
|
+
if (errorType) {
|
|
639
|
+
return control.hasError(errorType) && (control.dirty || control.touched);
|
|
640
|
+
}
|
|
641
|
+
return control.invalid && (control.dirty || control.touched);
|
|
642
|
+
}
|
|
643
|
+
// Get error message for a field
|
|
644
|
+
getErrorMessage(controlName) {
|
|
645
|
+
const control = this.getControl(controlName);
|
|
646
|
+
if (!control || !control.errors)
|
|
647
|
+
return '';
|
|
648
|
+
const fieldName = controlName.replace('syen_', '').replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
|
|
649
|
+
if (control.hasError('required')) {
|
|
650
|
+
return `${fieldName} is required`;
|
|
651
|
+
}
|
|
652
|
+
if (control.hasError('maxlength')) {
|
|
653
|
+
return `Maximum length is ${control.errors['maxlength'].requiredLength} characters`;
|
|
654
|
+
}
|
|
655
|
+
if (control.hasError('email')) {
|
|
656
|
+
return 'Please enter a valid email address';
|
|
657
|
+
}
|
|
658
|
+
if (control.hasError('pattern')) {
|
|
659
|
+
return 'Please enter a valid URL starting with http:// or https://';
|
|
660
|
+
}
|
|
661
|
+
return 'Invalid input';
|
|
662
|
+
}
|
|
663
|
+
// Get form validation summary
|
|
664
|
+
getFormValidationSummary() {
|
|
665
|
+
const errors = [];
|
|
666
|
+
Object.keys(this.entityForm.controls).forEach(key => {
|
|
667
|
+
const control = this.entityForm.get(key);
|
|
668
|
+
if (control && control.invalid && (control.dirty || control.touched)) {
|
|
669
|
+
errors.push(this.getErrorMessage(key));
|
|
670
|
+
}
|
|
671
|
+
});
|
|
672
|
+
return errors;
|
|
673
|
+
}
|
|
674
|
+
// Check if form is valid
|
|
675
|
+
get isFormValid() {
|
|
676
|
+
return this.entityForm.valid;
|
|
677
|
+
}
|
|
678
|
+
// Get current mode for display
|
|
679
|
+
get currentMode() {
|
|
680
|
+
return this.isEditMode() ? 'Edit' : 'Create';
|
|
681
|
+
}
|
|
682
|
+
// Get current entity ID for display
|
|
683
|
+
get currentEntityId() {
|
|
684
|
+
return this.entityId();
|
|
685
|
+
}
|
|
686
|
+
onFileChange(event) {
|
|
687
|
+
if (event && event.length > 0) {
|
|
688
|
+
this.logoFile = event[0];
|
|
689
|
+
console.log('īŋŊīŋŊ Logo File Selected:', this.logoFile.name);
|
|
690
|
+
}
|
|
691
|
+
else {
|
|
692
|
+
this.logoFile = undefined;
|
|
693
|
+
console.log('đ No logo file selected.');
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
onTabChange(tab) {
|
|
697
|
+
this.activeTab.set(tab.id);
|
|
698
|
+
}
|
|
699
|
+
onSubmit() {
|
|
700
|
+
if (this.entityForm.valid) {
|
|
701
|
+
this.loading.set(true);
|
|
702
|
+
this.error.set(null);
|
|
703
|
+
this.success.set(null);
|
|
704
|
+
const formData = this.entityForm.value;
|
|
705
|
+
const isEdit = this.isEditMode();
|
|
706
|
+
const entityId = this.entityId();
|
|
707
|
+
console.log(`đĸ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'}: Form data:`, formData);
|
|
708
|
+
// Validate required fields before submission
|
|
709
|
+
const requiredFields = ['syen_name', 'syen_entity_code', 'syen_entity_type_gmst'];
|
|
710
|
+
const missingFields = requiredFields.filter(field => !formData[field]);
|
|
711
|
+
if (missingFields.length > 0) {
|
|
712
|
+
this.error.set(`Missing required fields: ${missingFields.join(', ')}`);
|
|
713
|
+
this.loading.set(false);
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
// Add entity ID to form data if in edit mode
|
|
717
|
+
if (isEdit && entityId) {
|
|
718
|
+
formData._id = entityId;
|
|
719
|
+
}
|
|
720
|
+
const saveOperation = this.entityService.saveUpdateEntity(formData);
|
|
721
|
+
saveOperation.pipe(takeUntil(this.destroy$))
|
|
722
|
+
.subscribe({
|
|
723
|
+
next: (response) => {
|
|
724
|
+
console.log(`â
ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} SUCCESS:`, response);
|
|
725
|
+
if (response?.success) {
|
|
726
|
+
const successMessage = isEdit
|
|
727
|
+
? 'Entity updated successfully!'
|
|
728
|
+
: 'Entity created successfully!';
|
|
729
|
+
this.success.set(successMessage);
|
|
730
|
+
// Update the entity ID if it's a new entity
|
|
731
|
+
if (!isEdit && response?.data) {
|
|
732
|
+
const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
733
|
+
if (entityData?._id) {
|
|
734
|
+
this.entityId.set(entityData._id);
|
|
735
|
+
this.isEditMode.set(true);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
// Optionally redirect to list or stay on form
|
|
739
|
+
// this.router.navigate(['/admin/entities']);
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
this.error.set(response?.message || `Failed to ${isEdit ? 'update' : 'create'} entity. Please try again.`);
|
|
743
|
+
}
|
|
744
|
+
this.loading.set(false);
|
|
745
|
+
},
|
|
746
|
+
error: (err) => {
|
|
747
|
+
console.error(`â ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} ERROR:`, err);
|
|
748
|
+
let errorMessage = `Failed to ${isEdit ? 'update' : 'save'} entity settings.`;
|
|
749
|
+
if (err?.error?.message) {
|
|
750
|
+
errorMessage = err.error.message;
|
|
751
|
+
}
|
|
752
|
+
else if (err?.message) {
|
|
753
|
+
errorMessage = err.message;
|
|
754
|
+
}
|
|
755
|
+
else if (err?.status === 400) {
|
|
756
|
+
errorMessage = 'Invalid data provided. Please check your input.';
|
|
757
|
+
}
|
|
758
|
+
else if (err?.status === 404 && isEdit) {
|
|
759
|
+
errorMessage = 'Entity not found. It may have been deleted.';
|
|
760
|
+
}
|
|
761
|
+
else if (err?.status === 409) {
|
|
762
|
+
errorMessage = 'Entity with this code already exists. Please use a different code.';
|
|
763
|
+
}
|
|
764
|
+
else if (err?.status === 500) {
|
|
765
|
+
errorMessage = 'Server error. Please try again later.';
|
|
766
|
+
}
|
|
767
|
+
this.error.set(errorMessage);
|
|
768
|
+
this.loading.set(false);
|
|
769
|
+
}
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
// Mark all fields as touched to show validation errors
|
|
774
|
+
this.entityForm.markAllAsTouched();
|
|
775
|
+
const validationErrors = this.getFormValidationSummary();
|
|
776
|
+
console.warn('â ī¸ FORM VALIDATION ERRORS:', validationErrors);
|
|
777
|
+
this.error.set(`Please fix the following errors: ${validationErrors.join(', ')}`);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
onReset() {
|
|
781
|
+
// Clear logo file
|
|
782
|
+
this.logoFile = undefined;
|
|
783
|
+
// Reset form to initial values
|
|
784
|
+
this.entityForm.reset({
|
|
785
|
+
syen_name: '',
|
|
786
|
+
syen_entity_type_gmst: '',
|
|
787
|
+
syen_entity_code: '',
|
|
788
|
+
syen_udise_no: '',
|
|
789
|
+
syen_affiliation_no: '',
|
|
790
|
+
syen_isactive: true,
|
|
791
|
+
syen_corporate_address: '',
|
|
792
|
+
syen_corporate_pin_sypin: '',
|
|
793
|
+
syen_corporate_city_sypin: '',
|
|
794
|
+
syen_corporate_state_sypin: '',
|
|
795
|
+
syen_corporate_country_syctr: '',
|
|
796
|
+
syen_corporate_contact_person_user: '',
|
|
797
|
+
syen_corporate_phone: '',
|
|
798
|
+
syen_corporate_phone_alt: '',
|
|
799
|
+
syen_corporate_fax: '',
|
|
800
|
+
syen_corporate_email: '',
|
|
801
|
+
syen_corporate_email_alt: '',
|
|
802
|
+
syen_website: '',
|
|
803
|
+
syen_currency_sycr: '',
|
|
804
|
+
syen_registered_address: '',
|
|
805
|
+
syen_registered_pin_sypin: '',
|
|
806
|
+
syen_registered_city_sypin: '',
|
|
807
|
+
syen_registered_state_sypin: '',
|
|
808
|
+
syen_registered_country_syctr: '',
|
|
809
|
+
syen_registered_contact_person_user: '',
|
|
810
|
+
syen_registered_phone: '',
|
|
811
|
+
syen_registered_fax: '',
|
|
812
|
+
syen_registered_email: '',
|
|
813
|
+
syen_photo_id_cyfm: ''
|
|
814
|
+
});
|
|
815
|
+
this.success.set(null);
|
|
816
|
+
this.error.set(null);
|
|
817
|
+
console.log('đ Form reset completed');
|
|
818
|
+
}
|
|
819
|
+
static { this.Éĩfac = i0.ÉĩÉĩngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, deps: [], target: i0.ÉĩÉĩFactoryTarget.Component }); }
|
|
820
|
+
static { this.Éĩcmp = i0.ÉĩÉĩngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideAdmEntityComponent, isStandalone: true, selector: "cide-adm-entity", ngImport: i0, template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}.grid.lg-grid-4{grid-template-columns:repeat(4,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-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}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ÉĩNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleFileInputComponent, selector: "cide-ele-file-input", inputs: ["label", "accept", "multiple", "disabled", "helperText", "errorText"], outputs: ["fileChange"] }, { kind: "component", type: CideEleTabComponent, selector: "cide-ele-tab", inputs: ["tabs", "activeTabId", "size", "variant", "fullWidth", "disabled"], outputs: ["tabChange"] }, { 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"] }] }); }
|
|
821
|
+
}
|
|
822
|
+
i0.ÉĩÉĩngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, decorators: [{
|
|
823
|
+
type: Component,
|
|
824
|
+
args: [{ selector: 'cide-adm-entity', standalone: true, imports: [
|
|
825
|
+
ReactiveFormsModule,
|
|
826
|
+
CideInputComponent,
|
|
827
|
+
CideSelectComponent,
|
|
828
|
+
CideTextareaComponent,
|
|
829
|
+
CideEleFileInputComponent,
|
|
830
|
+
CideEleTabComponent,
|
|
831
|
+
CideEleButtonComponent
|
|
832
|
+
], template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}.grid.lg-grid-4{grid-template-columns:repeat(4,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-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}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"] }]
|
|
833
|
+
}], ctorParameters: () => [] });
|
|
834
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lkZS1hZG0tZW50aXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1hZG1pbi9zcmMvbGliL2FkbWluLW1vZHVsZS9lbnRpdHkvY3JlYXRlL2NpZGUtYWRtLWVudGl0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtYWRtaW4vc3JjL2xpYi9hZG1pbi1tb2R1bGUvZW50aXR5L2NyZWF0ZS9jaWRlLWFkbS1lbnRpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBVyxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixD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QyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7OEdBNTRCVSxzQkFBc0I7a0dBQXRCLHNCQUFzQiwyRUN6Q25DLGt1ZUE4WU8sdW5VRGhYSCxtQkFBbUIsODJCQUNuQixrQkFBa0IsMGJBQ2xCLG1CQUFtQixtWUFDbkIscUJBQXFCLDBVQUNyQix5QkFBeUIseUtBQ3pCLG1CQUFtQiw4SkFDbkIsc0JBQXNCOzsyRkFLYixzQkFBc0I7a0JBZmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLHFCQUFxQjt3QkFDckIseUJBQXlCO3dCQUN6QixtQkFBbUI7d0JBQ25CLHNCQUFzQjtxQkFDdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIHNpZ25hbCwgT25Jbml0LCBpbmplY3QsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENpZGVBZG1FbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi9jaWRlLWFkbS1lbnRpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVTZWxlY3RDb21wb25lbnQsIENpZGVFbGVUYWJDb21wb25lbnQsIFRhYkl0ZW0sIENpZGVFbGVCdXR0b25Db21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlRWxlRmlsZUlucHV0Q29tcG9uZW50LCBDaWRlVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmFsTWFzdGVyU2VsZWN0U2VydmljZSB9IGZyb20gJy4vZ2VuZXJhbC1tYXN0ZXItc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGluQ29kZVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL3Bpbi1jb2RlLXNlbGVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLXNlbGVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1cnJlbmN5U2VsZWN0U2VydmljZSB9IGZyb20gJy4vY3VycmVuY3ktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291bnRyeVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL2NvdW50cnktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VsZWN0LCBJVXNlciwgdXNlclNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSwgcGluQ29kZVNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSwgY3VycmVuY3lMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Y3IsIGNvdW50cnlMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Y3RyLCBJQ29yZVN5cGluLCBzZWxlY3RTZWFyY2hUeXBlLCBNUGluQ29kZVNlbGVjdCwgTVN5Y3RyTGlzdCwgTVVzZXJTZWxlY3QsIGVudGl0eUNvbnRyb2xsZXJSZXNwb25zZSwgZW50aXR5UmVzcG9uc2VEYXRhLCBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcsIGdlbmVyYWxNYXN0ZXJMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Z21zIH0gZnJvbSAnY2xvdWQtaWRlLWxtcy1tb2RlbCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuXG5pbnRlcmZhY2UgRHJvcGRvd25PcHRpb24ge1xuICB2YWx1ZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG4vLyBJbnRlcmZhY2UgZm9yIHBpbiBjb2RlIGRhdGEgc3RydWN0dXJlIHdpdGggYWRkaXRpb25hbCBmaWVsZHNcbmludGVyZmFjZSBQaW5Db2RlRGF0YSBleHRlbmRzIElDb3JlU3lwaW4ge1xuICB2YWx1ZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NpZGUtYWRtLWVudGl0eScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENpZGVJbnB1dENvbXBvbmVudCxcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxuICAgIENpZGVUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBDaWRlRWxlRmlsZUlucHV0Q29tcG9uZW50LFxuICAgIENpZGVFbGVUYWJDb21wb25lbnQsXG4gICAgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2lkZS1hZG0tZW50aXR5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NpZGUtYWRtLWVudGl0eS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUFkbUVudGl0eUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gUmVhY3RpdmUgZm9ybVxuICBlbnRpdHlGb3JtOiBGb3JtR3JvdXA7XG5cbiAgZW50aXR5VHlwZXMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBjdXJyZW5jaWVzID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcbiAgdXNlcnMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBwb3N0YWxDb2RlcyA9IHNpZ25hbDxEcm9wZG93bk9wdGlvbltdPihbXSk7XG4gIHBob3RvSWREb2N1bWVudHMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBjb3VudHJpZXMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuXG4gIC8vIFN0b3JlIHRoZSBmdWxsIHBpbiBjb2RlIGRhdGEgZm9yIGF1dG8tcG9wdWxhdGlvblxuICBwcml2YXRlIHBpbkNvZGVEYXRhTWFwID0gbmV3IE1hcDxzdHJpbmcsIFBpbkNvZGVEYXRhPigpO1xuICBcbiAgLy8gU3RvcmUgbG9nbyBmaWxlIGZvciB1cGxvYWRcbiAgcHJpdmF0ZSBsb2dvRmlsZT86IEZpbGU7XG5cbiAgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBzdWNjZXNzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExvYWRpbmcgc3RhdGVzIGZvciBpbmRpdmlkdWFsIGRyb3Bkb3duc1xuICBwb3N0YWxDb2Rlc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICB1c2Vyc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBjb3VudHJpZXNMb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBFbnRpdHkgbW9kZSBhbmQgSURcbiAgaXNFZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIGVudGl0eUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRhYiBjb25maWd1cmF0aW9uXG4gIGFjdGl2ZVRhYiA9IHNpZ25hbCgnYmFzaWMnKTtcbiAgZW50aXR5VGFicyA9IHNpZ25hbDxUYWJJdGVtW10+KFtcbiAgICB7IGlkOiAnYmFzaWMnLCBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJywgaWNvbjogJ+KEue+4jycgfSxcbiAgICB7IGlkOiAnY29ycG9yYXRlJywgbGFiZWw6ICdDb3Jwb3JhdGUgQWRkcmVzcycsIGljb246ICfwn4+iJyB9LFxuICAgIHsgaWQ6ICdjb250YWN0JywgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJywgaWNvbjogJ/Cfk6cnIH0sXG4gICAgeyBpZDogJ3JlZ2lzdGVyZWQnLCBsYWJlbDogJ1JlZ2lzdGVyZWQgQWRkcmVzcycsIGljb246ICfwn4+gJyB9LFxuICAgIHsgaWQ6ICdkb2N1bWVudHMnLCBsYWJlbDogJ0RvY3VtZW50cyAmIE1lZGlhJywgaWNvbjogJ/Cfk4QnIH1cbiAgXSk7XG5cbiAgLy8gTW9kZXJuIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHVzaW5nIGluamVjdCgpXG4gIHByaXZhdGUgZW50aXR5U2VydmljZSA9IGluamVjdChDaWRlQWRtRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgZ2VuZXJhbE1hc3RlclNlcnZpY2UgPSBpbmplY3QoR2VuZXJhbE1hc3RlclNlbGVjdFNlcnZpY2UpO1xuICBwcml2YXRlIHBpbkNvZGVTZXJ2aWNlID0gaW5qZWN0KFBpbkNvZGVTZWxlY3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VsZWN0U2VydmljZSk7XG4gIHByaXZhdGUgY3VycmVuY3lTZXJ2aWNlID0gaW5qZWN0KEN1cnJlbmN5U2VsZWN0U2VydmljZSk7XG4gIHByaXZhdGUgY291bnRyeVNlcnZpY2UgPSBpbmplY3QoQ291bnRyeVNlbGVjdFNlcnZpY2UpO1xuICBwcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZ2xvYmFsRXJyb3JIYW5kbGVyPzogKGV2ZW50OiBFcnJvckV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGdsb2JhbFJlamVjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmVudGl0eUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIEJhc2ljIEluZm9ybWF0aW9uXG4gICAgICBzeWVuX25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHN5ZW5fZW50aXR5X2NvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDQwKV1dLFxuICAgICAgc3llbl9lbnRpdHlfdHlwZV9nbXN0OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzeWVuX3VkaXNlX25vOiBbJyddLFxuICAgICAgc3llbl9hZmZpbGlhdGlvbl9ubzogWycnXSxcbiAgICAgIHN5ZW5faXNhY3RpdmU6IFt0cnVlXSxcblxuICAgICAgLy8gQ29ycG9yYXRlIEFkZHJlc3NcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2FkZHJlc3M6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jaXR5X3N5cGluOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfc3RhdGVfc3lwaW46IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGluX3N5cGluOiBbJyddLFxuXG4gICAgICAvLyBDb250YWN0IEluZm9ybWF0aW9uXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmU6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9waG9uZV9hbHQ6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9mYXg6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogWycnLCBbVmFsaWRhdG9ycy5lbWFpbF1dLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfZW1haWxfYWx0OiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsXV0sXG4gICAgICBzeWVuX3dlYnNpdGU6IFsnJywgW1ZhbGlkYXRvcnMucGF0dGVybigvXmh0dHBzPzpcXC9cXC8uKy8pXV0sXG4gICAgICBzeWVuX2N1cnJlbmN5X3N5Y3I6IFsnJ10sXG5cbiAgICAgIC8vIFJlZ2lzdGVyZWQgQWRkcmVzc1xuICAgICAgc3llbl9yZWdpc3RlcmVkX2FkZHJlc3M6IFsnJ10sXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY2l0eV9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jb3VudHJ5X3N5Y3RyOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jb250YWN0X3BlcnNvbl91c2VyOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX3Bob25lOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX2VtYWlsOiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsXV0sXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfZmF4OiBbJyddLFxuXG4gICAgICAvLyBEb2N1bWVudHNcbiAgICAgIHN5ZW5fcGhvdG9faWRfY3lmbTogWycnXVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBwb3N0YWwgY29kZSBjaGFuZ2VzIHRvIGF1dG8tcG9wdWxhdGUgYWRkcmVzcyBmaWVsZHNcbiAgICB0aGlzLnNldHVwUG9zdGFsQ29kZUxpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gQWRkIGdsb2JhbCBlcnJvciBoYW5kbGVyIHRvIGNhdGNoIGFueSB1bmhhbmRsZWQgZXJyb3JzXG4gICAgY29uc3QgZXJyb3JIYW5kbGVyID0gKGV2ZW50OiBFcnJvckV2ZW50KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEdMT0JBTCBFUlJPUjonLCBldmVudC5lcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlamVjdGlvbkhhbmRsZXIgPSAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBVTkhBTkRMRUQgUFJPTUlTRSBSRUpFQ1RJT046JywgZXZlbnQucmVhc29uKTtcbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JIYW5kbGVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgcmVqZWN0aW9uSGFuZGxlcik7XG5cbiAgICAvLyBTdG9yZSBoYW5kbGVycyBmb3IgY2xlYW51cFxuICAgIHRoaXMuZ2xvYmFsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgIHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlciA9IHJlamVjdGlvbkhhbmRsZXI7XG5cbiAgICAvLyBDaGVjayBmb3IgZW50aXR5IElEIGluIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB0aGlzLmNoZWNrRm9yRW50aXR5SWQoKTtcbiAgICBcbiAgICB0aGlzLmxvYWREcm9wZG93bnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIGdsb2JhbCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAodGhpcy5nbG9iYWxFcnJvckhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuZ2xvYmFsRXJyb3JIYW5kbGVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgUnhKUyBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVudGl0eSBJRCBpbiBxdWVyeSBwYXJhbWV0ZXJzXG4gIHByaXZhdGUgY2hlY2tGb3JFbnRpdHlJZCgpIHtcbiAgICBjb25zb2xlLmxvZygn8J+UjSBDaGVja2luZyBmb3IgZW50aXR5IElEIGluIHF1ZXJ5IHBhcmFtZXRlcnMnLCB0aGlzLnJvdXRlLnBhcmFtcyk7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gUXVlcnkgcGFyYW1zOicsIHBhcmFtcyk7XG4gICAgICAvLyBDaGVjayBmb3IgZW50aXR5SWQsIGlkLCBvciBlbnRpdHkgcGFyYW1ldGVyXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHBhcmFtc1sncXVlcnknXTtcbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IGdlbmVyYXRlT2JqZWN0RnJvbVN0cmluZyhxdWVyeVBhcmFtcyk7XG5cbiAgICAgIC8vIElmIGVudGl0eUlkIGlzIGFuIG9iamVjdCBzdHJpbmcgKGZyb20gZ2VuZXJhdGVTdHJpbmdGcm9tT2JqZWN0KSwgdHJ5IHRvIHBhcnNlIGl0XG4gICAgICBjb25zdCBlbnRpdHlJZCA9IHF1ZXJ5RGF0YS5zeWVuX2lkO1xuICAgICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIEVudGl0eSBJRCBmb3VuZCBpbiBxdWVyeSBwYXJhbXM6JywgZW50aXR5SWQpO1xuICAgICAgICB0aGlzLmVudGl0eUlkLnNldChlbnRpdHlJZCk7XG4gICAgICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZEVudGl0eURhdGEoZW50aXR5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CfhpUgTm8gZW50aXR5IElEIGZvdW5kIC0gY3JlYXRpbmcgbmV3IGVudGl0eScpO1xuICAgICAgICB0aGlzLmlzRWRpdE1vZGUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5lbnRpdHlJZC5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBMb2FkIGVudGl0eSBkYXRhIGZvciBlZGl0aW5nXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoZW50aXR5SWQ6IHN0cmluZykge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG5cbiAgICBjb25zb2xlLmxvZygn8J+TpSBMb2FkaW5nIGVudGl0eSBkYXRhIGZvciBJRDonLCBlbnRpdHlJZCk7XG5cbiAgICB0aGlzLmVudGl0eVNlcnZpY2UuZ2V0RW50aXR5QnlJZChlbnRpdHlJZCkucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogZW50aXR5Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinIUgRW50aXR5IGRhdGEgbG9hZGVkOicsIHJlc3BvbnNlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZT8uZGF0YSkge1xuICAgICAgICAgIC8vIEhhbmRsZSBib3RoIGFycmF5IGFuZCBzaW5nbGUgb2JqZWN0IHJlc3BvbnNlc1xuICAgICAgICAgIGNvbnN0IGVudGl0eURhdGEgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpID8gcmVzcG9uc2UuZGF0YVswXSA6IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgaWYgKGVudGl0eURhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtV2l0aEVudGl0eURhdGEoZW50aXR5RGF0YSk7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3Muc2V0KCdFbnRpdHkgZGF0YSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdFbnRpdHkgZGF0YSBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFbnRpdHkgZGF0YSBub3QgZm91bmQgaW4gcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCgnRmFpbGVkIHRvIGxvYWQgZW50aXR5IGRhdGEnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRW50aXR5IGRhdGEgcmVzcG9uc2UgaW52YWxpZDonLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIGVudGl0eSBkYXRhOicsIGVycik7XG4gICAgICAgIFxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIGVudGl0eSBkYXRhLic7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXJyPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5lcnJvci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRW50aXR5IG5vdCBmb3VuZC4nO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnU2VydmVyIGVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUG9wdWxhdGUgZm9ybSB3aXRoIGVudGl0eSBkYXRhXG4gIHByaXZhdGUgcG9wdWxhdGVGb3JtV2l0aEVudGl0eURhdGEoZW50aXR5RGF0YTogZW50aXR5UmVzcG9uc2VEYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5OdIFBvcHVsYXRpbmcgZm9ybSB3aXRoIGVudGl0eSBkYXRhOicsIGVudGl0eURhdGEpO1xuXG4gICAgICAvLyBNYXAgdGhlIGVudGl0eSBkYXRhIHRvIGZvcm0gY29udHJvbHMgLSBvbmx5IHVzZSBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZW50aXR5UmVzcG9uc2VEYXRhXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICAgICAgc3llbl9uYW1lOiBlbnRpdHlEYXRhLnN5ZW5fbmFtZSB8fCAnJyxcbiAgICAgICAgc3llbl9lbnRpdHlfY29kZTogZW50aXR5RGF0YS5zeWVuX2VudGl0eV9jb2RlIHx8ICcnLFxuICAgICAgICBzeWVuX2VudGl0eV90eXBlX2dtc3Q6IGVudGl0eURhdGEuc3llbl9lbnRpdHlfdHlwZV9nbXN0IHx8ICcnLFxuICAgICAgICBzeWVuX2lzYWN0aXZlOiBlbnRpdHlEYXRhLnN5ZW5faXNhY3RpdmUgIT09IHVuZGVmaW5lZCA/IGVudGl0eURhdGEuc3llbl9pc2FjdGl2ZSA6IHRydWUsXG5cbiAgICAgICAgLy8gQ29udGFjdCBJbmZvcm1hdGlvbiAob25seSBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZW50aXR5UmVzcG9uc2VEYXRhKVxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyOiBlbnRpdHlEYXRhLnN5ZW5fY29ycG9yYXRlX2NvbnRhY3RfcGVyc29uX3VzZXIgfHwgJycsXG4gICAgICAgIHN5ZW5fY29ycG9yYXRlX3Bob25lOiBlbnRpdHlEYXRhLnN5ZW5fY29ycG9yYXRlX3Bob25lIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9lbWFpbCB8fCAnJyxcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG90aGVyIGZpZWxkcyBzaW5jZSB0aGV5J3JlIG5vdCBpbiBlbnRpdHlSZXNwb25zZURhdGFcbiAgICAgICAgc3llbl91ZGlzZV9ubzogZW50aXR5RGF0YS5zeWVuX3VkaXNlX25vIHx8ICcnLFxuICAgICAgICBzeWVuX2FmZmlsaWF0aW9uX25vOiBlbnRpdHlEYXRhLnN5ZW5fYWZmaWxpYXRpb25fbm8gfHwgJycsXG4gICAgICAgIHN5ZW5fY29ycG9yYXRlX2FkZHJlc3M6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfYWRkcmVzcyB8fCAnJyxcbiAgICAgICAgc3llbl9jb3Jwb3JhdGVfY2l0eV9zeXBpbjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9jaXR5X3N5cGluIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9jb3Jwb3JhdGVfY291bnRyeV9zeWN0cjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9waW5fc3lwaW46IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfcGluX3N5cGluIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9waG9uZV9hbHQ6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfcGhvbmVfYWx0IHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9mYXg6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfZmF4IHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbF9hbHQ6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfZW1haWxfYWx0IHx8ICcnLFxuICAgICAgICBzeWVuX3dlYnNpdGU6IGVudGl0eURhdGEuc3llbl93ZWJzaXRlIHx8ICcnLFxuICAgICAgICBzeWVuX2N1cnJlbmN5X3N5Y3I6IGVudGl0eURhdGEuc3llbl9jdXJyZW5jeV9zeWNyIHx8ICcnLFxuICAgICAgICBzeWVuX3JlZ2lzdGVyZWRfYWRkcmVzczogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfYWRkcmVzcyB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NpdHlfc3lwaW46IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NpdHlfc3lwaW4gfHwgJycgICAgICxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX3N0YXRlX3N5cGluOiBlbnRpdHlEYXRhLnN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NvdW50cnlfc3ljdHI6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NvdW50cnlfc3ljdHIgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9waW5fc3lwaW46IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXI6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXIgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9waG9uZTogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfcGhvbmUgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9lbWFpbDogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfZW1haWwgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9mYXg6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2ZheCB8fCAnJyxcbiAgICAgICAgc3llbl9waG90b19pZF9jeWZtOiBlbnRpdHlEYXRhLnN5ZW5fcGhvdG9faWRfY3lmbSB8fCAnJ1xuICAgICAgfTtcblxuICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgZW50aXR5IGRhdGFcbiAgICAgIHRoaXMuZW50aXR5Rm9ybS5wYXRjaFZhbHVlKGZvcm1EYXRhLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCfinIUgRm9ybSBwb3B1bGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgRXJyb3IgcG9wdWxhdGluZyBmb3JtIHdpdGggZW50aXR5IGRhdGE6JywgZXJyb3IpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoJ0Vycm9yIGxvYWRpbmcgZW50aXR5IGRhdGEgaW50byBmb3JtJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgbGlzdGVuZXJzIGZvciBwb3N0YWwgY29kZSBjaGFuZ2VzXG4gIHByaXZhdGUgc2V0dXBQb3N0YWxDb2RlTGlzdGVuZXJzKCkge1xuICAgIC8vIENvcnBvcmF0ZSBwb3N0YWwgY29kZSBsaXN0ZW5lclxuICAgIHRoaXMuZW50aXR5Rm9ybS5nZXQoJ3N5ZW5fY29ycG9yYXRlX3Bpbl9zeXBpbicpPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHBpbkNvZGVJZCA9PiB7XG4gICAgICBpZiAocGluQ29kZUlkKSB7XG4gICAgICAgIHRoaXMucG9wdWxhdGVBZGRyZXNzRnJvbVBpbkNvZGUocGluQ29kZUlkLCAnY29ycG9yYXRlJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmVkIHBvc3RhbCBjb2RlIGxpc3RlbmVyXG4gICAgdGhpcy5lbnRpdHlGb3JtLmdldCgnc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbicpPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHBpbkNvZGVJZCA9PiB7XG4gICAgICBpZiAocGluQ29kZUlkKSB7XG4gICAgICAgIHRoaXMucG9wdWxhdGVBZGRyZXNzRnJvbVBpbkNvZGUocGluQ29kZUlkLCAncmVnaXN0ZXJlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQXV0by1wb3B1bGF0ZSBhZGRyZXNzIGZpZWxkcyBiYXNlZCBvbiBzZWxlY3RlZCBwb3N0YWwgY29kZVxuICBwcml2YXRlIHBvcHVsYXRlQWRkcmVzc0Zyb21QaW5Db2RlKHBpbkNvZGVJZDogc3RyaW5nLCBhZGRyZXNzVHlwZTogJ2NvcnBvcmF0ZScgfCAncmVnaXN0ZXJlZCcpIHtcbiAgICBjb25zdCBwaW5Db2RlRGF0YSA9IHRoaXMucGluQ29kZURhdGFNYXAuZ2V0KHBpbkNvZGVJZCk7XG4gICAgY29uc29sZS5sb2coJ/CflI0gUGluIENvZGUgRGF0YTonLCBwaW5Db2RlRGF0YSk7XG4gICAgaWYgKCFwaW5Db2RlRGF0YSkge1xuICAgICAgY29uc29sZS53YXJuKGBQaW4gY29kZSBkYXRhIG5vdCBmb3VuZCBmb3IgSUQ6ICR7cGluQ29kZUlkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NUeXBlID09PSAnY29ycG9yYXRlJyA/ICdzeWVuX2NvcnBvcmF0ZScgOiAnc3llbl9yZWdpc3RlcmVkJztcblxuICAgIC8vIFBvcHVsYXRlIGNpdHksIHN0YXRlLCBhbmQgY291bnRyeSBmaWVsZHNcbiAgICB0aGlzLmVudGl0eUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBbYCR7cHJlZml4fV9jaXR5X3N5cGluYF06IHBpbkNvZGVEYXRhLnN5cGluX2Rpc3RyaWN0IHx8ICcnLFxuICAgICAgW2Ake3ByZWZpeH1fc3RhdGVfc3lwaW5gXTogcGluQ29kZURhdGEuc3lwaW5fc3RhdGVfbmFtZSB8fCAnJyxcbiAgICAgIFtgJHtwcmVmaXh9X2NvdW50cnlfc3ljdHJgXTogcGluQ29kZURhdGEuc3lwaW5fY291bnRyeV9pZF9zeWN0ciB8fCAnJ1xuICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDwn5ONIEF1dG8tcG9wdWxhdGVkICR7YWRkcmVzc1R5cGV9IGFkZHJlc3MgZnJvbSBwaW4gY29kZTpgLCB7XG4gICAgICBjaXR5OiBwaW5Db2RlRGF0YS5zeXBpbl9kaXN0cmljdCxcbiAgICAgIHN0YXRlOiBwaW5Db2RlRGF0YS5zeXBpbl9zdGF0ZV9uYW1lLFxuICAgICAgY291bnRyeTogcGluQ29kZURhdGEuc3lwaW5fY291bnRyeV9pZF9zeWN0clxuICAgIH0pO1xuICB9XG5cbiAgbG9hZERyb3Bkb3ducygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coJ/CfmoAgTG9hZGluZyBkcm9wZG93bnMuLi4nKTtcblxuICAgICAgLy8gTG9hZCBlbnRpdHkgdHlwZXMgdmlhIGdlbmVyYWwgbWFzdGVyIHNlcnZpY2VcbiAgICAgIHRoaXMuZ2VuZXJhbE1hc3RlclNlcnZpY2UuZ2V0R2VuZXJhbE1hc3RlckJ5Q29kZSgnY29yZV9lbnRpdHlfdHlwZScpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIEVudGl0eSB0eXBlcyByZXNwb25zZTonLCByZXNwb25zZSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMudHJhbnNmb3JtR2VuZXJhbE1hc3RlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQodHlwZXMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk4sgTG9hZGVkIGVudGl0eSB0eXBlczonLCB0eXBlcy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEVudGl0eSB0eXBlcyB0cmFuc2Zvcm0gZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgZW50aXR5IHR5cGVzOicsIGVycik7XG4gICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBjdXJyZW5jaWVzIHZpYSBjdXJyZW5jeSBzZXJ2aWNlXG4gICAgICB0aGlzLmN1cnJlbmN5U2VydmljZS5nZXRBbGxDdXJyZW5jaWVzKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBDdXJyZW5jaWVzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbmNpZXMgPSB0aGlzLnRyYW5zZm9ybUN1cnJlbmN5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmNpZXMuc2V0KGN1cnJlbmNpZXMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkrAgTG9hZGVkIGN1cnJlbmNpZXM6JywgY3VycmVuY2llcy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEN1cnJlbmNpZXMgdHJhbnNmb3JtIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY2llcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgY3VycmVuY2llczonLCBlcnIpO1xuICAgICAgICAgIHRoaXMuY3VycmVuY2llcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCB1c2VycyB2aWEgdXNlciBzZXJ2aWNlXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEFsbFVzZXJzKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgVXNlcnMgcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLnRyYW5zZm9ybVVzZXJUb0Ryb3Bkb3duKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMuc2V0KHVzZXJzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5GlIExvYWRlZCB1c2VyczonLCB1c2Vycy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIFVzZXJzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnVzZXJzLnNldChbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCB1c2VyczonLCBlcnIpO1xuICAgICAgICAgIHRoaXMudXNlcnMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvYWQgcG9zdGFsIGNvZGVzIHZpYSBwaW4gY29kZSBzZXJ2aWNlXG4gICAgICB0aGlzLnBpbkNvZGVTZXJ2aWNlLmdldEFsbFBvc3RhbENvZGVzKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgUG9zdGFsIGNvZGVzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RhbENvZGVzID0gdGhpcy50cmFuc2Zvcm1QaW5Db2RlVG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChwb3N0YWxDb2Rlcyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TriBMb2FkZWQgcG9zdGFsIGNvZGVzOicsIHBvc3RhbENvZGVzLmxlbmd0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgUG9zdGFsIGNvZGVzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCBwb3N0YWwgY29kZXM6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIHBob3RvIElEIGRvY3VtZW50cyB2aWEgZ2VuZXJhbCBtYXN0ZXIgc2VydmljZVxuICAgICAgdGhpcy5nZW5lcmFsTWFzdGVyU2VydmljZS5nZXRHZW5lcmFsTWFzdGVyQnlDb2RlKCdjb3JlX3Bob3RvX2lkX2RvY3VtZW50Jykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgUGhvdG8gSUQgZG9jdW1lbnRzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50cyA9IHRoaXMudHJhbnNmb3JtR2VuZXJhbE1hc3RlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5waG90b0lkRG9jdW1lbnRzLnNldChkb2N1bWVudHMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk4QgTG9hZGVkIHBob3RvIElEIGRvY3VtZW50czonLCBkb2N1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcign8J+SpSBQaG90byBJRCBkb2N1bWVudHMgdHJhbnNmb3JtIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMucGhvdG9JZERvY3VtZW50cy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgcGhvdG8gSUQgZG9jdW1lbnRzOicsIGVycik7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gc3RhdGljIGRhdGFcbiAgICAgICAgICB0aGlzLnBob3RvSWREb2N1bWVudHMuc2V0KFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICdwYXNzcG9ydCcsIGxhYmVsOiAnUGFzc3BvcnQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnbGljZW5zZScsIGxhYmVsOiAnRHJpdmVyIExpY2Vuc2UnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnbmF0aW9uYWxfaWQnLCBsYWJlbDogJ05hdGlvbmFsIElEJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJ3ZvdGVyX2lkJywgbGFiZWw6ICdWb3RlciBJRCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICdvdGhlcicsIGxhYmVsOiAnT3RoZXInIH1cbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvYWQgY291bnRyaWVzIHZpYSBjb3VudHJ5IHNlcnZpY2VcbiAgICAgIHRoaXMuY291bnRyeVNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBDb3VudHJpZXMgcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy50cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllcy5zZXQoY291bnRyaWVzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn4yNIExvYWRlZCBjb3VudHJpZXM6JywgY291bnRyaWVzLmxlbmd0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgQ291bnRyaWVzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgY291bnRyaWVzOicsIGVycik7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgTE9BRERST1BET1dOUyBFWENFUFRJT046JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gdHJhbnNmb3JtIGdlbmVyYWwgbWFzdGVyIHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1HZW5lcmFsTWFzdGVyVG9Ecm9wZG93bihyZXNwb25zZTogZ2VuZXJhbE1hc3Rlckxpc3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZT8uZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCBkYXRhQXJyYXk6IElDb3JlU3lnbXNbXSA9IFtdO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCByZXNwb25zZSBzdHJ1Y3R1cmVzIC0gYWxsIGdlbmVyYWwgbWFzdGVyIGRhdGEgaXMgaW4gY29yZV9nZW5lcmFsX21hc3RlclxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBJQ29yZVN5Z21zLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBBUEkgcmVzcG9uc2UgYWxyZWFkeSBpbmNsdWRlcyB2YWx1ZSBhbmQgbGFiZWwgZmllbGRzXG4gICAgICAgIHZhbHVlOiAoaXRlbSBhcyB7IHZhbHVlPzogc3RyaW5nIH0pLnZhbHVlIHx8IGl0ZW0uX2lkIHx8IGB2YWx1ZV8ke2luZGV4fWAsXG4gICAgICAgIGxhYmVsOiAoaXRlbSBhcyB7IGxhYmVsPzogc3RyaW5nIH0pLmxhYmVsIHx8IGl0ZW0uc3lnbXNfdGl0bGUgfHwgJ1VudGl0bGVkJ1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gdHJhbnNmb3JtIGN1cnJlbmN5IHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1DdXJyZW5jeVRvRHJvcGRvd24ocmVzcG9uc2U6IGN1cnJlbmN5TGlzdENvbnRyb2xsZXJSZXNwb25zZSk6IERyb3Bkb3duT3B0aW9uW10ge1xuICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ/CflI0gQ3VycmVuY3kgUmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCByZXNwb25zZSBzdHJ1Y3R1cmVzXG4gICAgbGV0IGRhdGFBcnJheTogSUNvcmVTeWNyW10gPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBJQ29yZVN5Y3IpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBpdGVtLl9pZCxcbiAgICAgICAgbGFiZWw6IGAke2l0ZW0uc3ljcl9jb2RlfSAtICR7aXRlbS5zeWNyX25hbWV9ICgke2l0ZW0uc3ljcl9zeW1ib2x9KWBcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSB1c2VyIHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Vc2VyVG9Ecm9wZG93bihyZXNwb25zZTogdXNlclNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSk6IERyb3Bkb3duT3B0aW9uW10ge1xuICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IGRhdGFBcnJheTogKENvbW1vblNlbGVjdCAmIElVc2VyKVtdID0gW107XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICBpZiAocmVzcG9uc2UuZGF0YS5hdXRoX3VzZXJfbXN0KSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhLmF1dGhfdXNlcl9tc3Q7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBDb21tb25TZWxlY3QgJiBJVXNlcikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGl0ZW0uX2lkIHx8IFwiXCIsXG4gICAgICAgIGxhYmVsOiBpdGVtPy51c2VyX2Z1bGxuYW1lIHx8IFwiXCJcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSBwaW4gY29kZSByZXNwb25zZSB0byBkcm9wZG93biBvcHRpb25zXG4gIHByaXZhdGUgdHJhbnNmb3JtUGluQ29kZVRvRHJvcGRvd24ocmVzcG9uc2U6IHBpbkNvZGVTZWxlY3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZT8uZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgZGF0YUFycmF5OiBQaW5Db2RlRGF0YVtdID0gW107XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICBpZiAoJ2NvcmVfcGluX2NvZGUnIGluIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5jb3JlX3Bpbl9jb2RlKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhLmNvcmVfcGluX2NvZGU7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGRhdGEgbWFwIGFuZCByZWJ1aWxkIGl0XG4gICAgdGhpcy5waW5Db2RlRGF0YU1hcC5jbGVhcigpO1xuXG4gICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoKGl0ZW06IFBpbkNvZGVEYXRhKSA9PiB7XG4gICAgICBjb25zdCBwaW5Db2RlSWQgPSBTdHJpbmcoaXRlbS5faWQpO1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgcGluIGNvZGUgZGF0YSBmb3IgYXV0by1wb3B1bGF0aW9uXG4gICAgICB0aGlzLnBpbkNvZGVEYXRhTWFwLnNldChwaW5Db2RlSWQsIGl0ZW0pO1xuXG4gICAgICAvLyBBUEkgcmVzcG9uc2UgYWxyZWFkeSBpbmNsdWRlcyB2YWx1ZSBhbmQgbGFiZWwgZmllbGRzXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogcGluQ29kZUlkLFxuICAgICAgICBsYWJlbDogYCR7aXRlbS5zeXBpbl9waW5jb2RlfSAtICR7aXRlbS5zeXBpbl9vZmZpY2VfbmFtZSB8fCAnVW5rbm93biBPZmZpY2UnfWBcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSBjb3VudHJ5IHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZTogY291bnRyeUxpc3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhcmVzcG9uc2U/LmRhdGEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gQ291bnRyeSByZXNwb25zZSBtaXNzaW5nIHN1Y2Nlc3Mgb3IgZGF0YTonLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ/CflI0gQ291bnRyeSBSZXNwb25zZTonLCByZXNwb25zZSk7XG5cbiAgICAgIGxldCBkYXRhQXJyYXk6IElDb3JlU3ljdHJbXSA9IFtdO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgIGRhdGFBcnJheSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgZGF0YUFycmF5ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ/CflI0gQ291bnRyeSBkYXRhIGFycmF5IGxlbmd0aDonLCBkYXRhQXJyYXkubGVuZ3RoKTtcblxuICAgICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoKGl0ZW06IElDb3JlU3ljdHIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogaXRlbS5faWQgfHwgXCJcIixcbiAgICAgICAgICBsYWJlbDogYCR7aXRlbS5zeWN0cl9jb3VudHJ5X2lzb19uYW1lIHx8ICdVbmtub3duJ30gKCR7aXRlbS5zeWN0cl9jb3VudHJ5X2lzb19jb2RlX3R3b19jaGFyIHx8ICdYWCd9KWBcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIENPVU5UUlkgVFJBTlNGT1JNIEVYQ0VQVElPTjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgZm9ybSBjb250cm9sXG4gIGdldENvbnRyb2woY29udHJvbE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudGl0eUZvcm0uZ2V0KGNvbnRyb2xOYW1lKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBwb3N0YWwgY29kZSBzZWFyY2ggd2l0aCBkZWJvdW5jaW5nXG4gIG9uUG9zdGFsQ29kZVNlYXJjaChldmVudDogc2VsZWN0U2VhcmNoVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBQT1NUQUwgQ09ERSBTRUFSQ0ggRVZFTlQ6JywgZXZlbnQpO1xuXG4gICAgICAvLyBTZXQgbG9hZGluZyBzdGF0ZVxuICAgICAgdGhpcy5wb3N0YWxDb2Rlc0xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICBjb25zdCBwYXlsb2FkOiBNUGluQ29kZVNlbGVjdCA9IHtcbiAgICAgICAgc3lwaW5fcGluY29kZTogZXZlbnQucXVlcnkgfHwgXCJcIixcbiAgICAgICAgc3lwaW5faWQ6IGV2ZW50LnZhbHVlIGFzIHN0cmluZyB8fCBcIlwiXG4gICAgICB9O1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gUE9TVEFMIENPREUgUEFZTE9BRDonLCBwYXlsb2FkKTtcblxuICAgICAgdGhpcy5waW5Db2RlU2VydmljZS5zZWFyY2hQaW5Db2RlcyhwYXlsb2FkKS5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ+KchSBQT1NUQUwgQ09ERSBTRUFSQ0ggU1VDQ0VTUzonLCByZXNwb25zZSk7XG4gICAgICAgICAgY29uc3QgcG9zdGFsQ29kZXMgPSB0aGlzLnRyYW5zZm9ybVBpbkNvZGVUb0Ryb3Bkb3duKHJlc3BvbnNlKTtcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChwb3N0YWxDb2Rlcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/Cfk64gVXBkYXRlZCBwb3N0YWwgY29kZXMgY291bnQ6JywgcG9zdGFsQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgUE9TVEFMIENPREUgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy5wb3N0YWxDb2Rlcy5zZXQoW10pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBQT1NUQUwgQ09ERSBTRUFSQ0ggRVhDRVBUSU9OOicsIGVycm9yKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZXMuc2V0KFtdKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHVzZXIgc2VhcmNoXG4gIG9uVXNlclNlYXJjaChldmVudDogc2VsZWN0U2VhcmNoVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBVU0VSIFNFQVJDSCBFVkVOVDonLCBldmVudCk7XG4gICAgICBcbiAgICAgIC8vIFNldCBsb2FkaW5nIHN0YXRlXG4gICAgICB0aGlzLnVzZXJzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFBhcnRpYWw8TVVzZXJTZWxlY3Q+ID0ge1xuICAgICAgICB1c2VyX2Z1bGxuYW1lOiBldmVudD8ucXVlcnkgfHwgXCJcIixcbiAgICAgICAgdXNlcl9pZDogZXZlbnQ/LnZhbHVlIGFzIHN0cmluZyB8fCBcIlwiLFxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gVVNFUiBTRUFSQ0ggUEFZTE9BRDonLCBwYXlsb2FkKTtcblxuICAgICAgdGhpcy51c2VyU2VydmljZS5zZWFyY2hVc2Vyc0J5RnVsbG5hbWUocGF5bG9hZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ+KchSBVU0VSIFNFQVJDSCBTVUNDRVNTOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICBjb25zdCB1c2VycyA9IHRoaXMudHJhbnNmb3JtVXNlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgIHRoaXMudXNlcnMuc2V0KHVzZXJzKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygn8J+RpSBVcGRhdGVkIHVzZXJzIGNvdW50OicsIHVzZXJzLmxlbmd0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIFVTRVIgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy51c2Vycy5zZXQoW10pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICB0aGlzLnVzZXJzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBVU0VSIFNFQVJDSCBFWENFUFRJT046JywgZXJyb3IpO1xuICAgICAgdGhpcy51c2Vycy5zZXQoW10pO1xuICAgICAgdGhpcy51c2Vyc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgY291bnRyeSBzZWFyY2hcbiAgb25Db3VudHJ5U2VhcmNoKGV2ZW50OiBzZWxlY3RTZWFyY2hUeXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIENPVU5UUlkgU0VBUkNIIEVWRU5UOicsIGV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGxvYWRpbmcgc3RhdGVcbiAgICAgIHRoaXMuY291bnRyaWVzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFBhcnRpYWw8TVN5Y3RyTGlzdD4gPSB7XG4gICAgICAgIHF1ZXJ5OiBldmVudC5xdWVyeSxcbiAgICAgICAgc3ljdHJfaWQ6IGV2ZW50LnZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIENPVU5UUlkgU0VBUkNIIFBBWUxPQUQ6JywgcGF5bG9hZCk7XG5cbiAgICAgIHRoaXMuY291bnRyeVNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgQ09VTlRSWSBTRUFSQ0ggU1VDQ0VTUzonLCByZXNwb25zZSk7XG4gICAgICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy50cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KGNvdW50cmllcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/CfjI0gVXBkYXRlZCBjb3VudHJpZXMgY291bnQ6JywgY291bnRyaWVzLmxlbmd0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIENPVU5UUlkgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgdGhpcy5jb3VudHJpZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIENPVU5UUlkgU0VBUkNIIEVYQ0VQVElPTjonLCBlcnJvcik7XG4gICAgICB0aGlzLmNvdW50cmllcy5zZXQoW10pO1xuICAgICAgdGhpcy5jb3VudHJpZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHBvc3RhbCBjb2RlIHNlbGVjdGlvblxuICBvblBvc3RhbENvZGVTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50IHwgc3RyaW5nKSB7XG4gICAgbGV0IHBpbkNvZGVJZCA9ICcnO1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwaW5Db2RlSWQgPSBldmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgcGluQ29kZUlkID0gdGFyZ2V0Py52YWx1ZSB8fCAnJztcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ/Cfk40gUG9zdGFsIENvZGUgU2VsZWN0ZWQ6JywgcGluQ29kZUlkKTtcbiAgICAvLyBUaGUgYXV0by1wb3B1bGF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGZvcm0gdmFsdWUgY2hhbmdlIGxpc3RlbmVyc1xuICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhZGRpdGlvbmFsIGxvZ2ljIGlmIG5lZWRlZFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSBmaWVsZCBoYXMgYW4gZXJyb3JcbiAgaGFzRXJyb3IoY29udHJvbE5hbWU6IHN0cmluZywgZXJyb3JUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Q29udHJvbChjb250cm9sTmFtZSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoZXJyb3JUeXBlKSB7XG4gICAgICByZXR1cm4gY29udHJvbC5oYXNFcnJvcihlcnJvclR5cGUpICYmIChjb250cm9sLmRpcnR5IHx8IGNvbnRyb2wudG91Y2hlZCk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sLmludmFsaWQgJiYgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKTtcbiAgfVxuXG4gIC8vIEdldCBlcnJvciBtZXNzYWdlIGZvciBhIGZpZWxkXG4gIGdldEVycm9yTWVzc2FnZShjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRDb250cm9sKGNvbnRyb2xOYW1lKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wuZXJyb3JzKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBmaWVsZE5hbWUgPSBjb250cm9sTmFtZS5yZXBsYWNlKCdzeWVuXycsICcnKS5yZXBsYWNlKC9fL2csICcgJykucmVwbGFjZSgvXFxiXFx3L2csIGwgPT4gbC50b1VwcGVyQ2FzZSgpKTtcblxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGROYW1lfSBpcyByZXF1aXJlZGA7XG4gICAgfVxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgICAgcmV0dXJuIGBNYXhpbXVtIGxlbmd0aCBpcyAke2NvbnRyb2wuZXJyb3JzWydtYXhsZW5ndGgnXS5yZXF1aXJlZExlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgfVxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdlbWFpbCcpKSB7XG4gICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgIH1cbiAgICBpZiAoY29udHJvbC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCBzdGFydGluZyB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nO1xuICAgIH1cbiAgICByZXR1cm4gJ0ludmFsaWQgaW5wdXQnO1xuICB9XG5cbiAgLy8gR2V0IGZvcm0gdmFsaWRhdGlvbiBzdW1tYXJ5XG4gIGdldEZvcm1WYWxpZGF0aW9uU3VtbWFyeSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZW50aXR5Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZW50aXR5Rm9ybS5nZXQoa2V5KTtcbiAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGtleSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvLyBDaGVjayBpZiBmb3JtIGlzIHZhbGlkXG4gIGdldCBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlGb3JtLnZhbGlkO1xuICB9XG5cbiAgLy8gR2V0IGN1cnJlbnQgbW9kZSBmb3IgZGlzcGxheVxuICBnZXQgY3VycmVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRNb2RlKCkgPyAnRWRpdCcgOiAnQ3JlYXRlJztcbiAgfVxuXG4gIC8vIEdldCBjdXJyZW50IGVudGl0eSBJRCBmb3IgZGlzcGxheVxuICBnZXQgY3VycmVudEVudGl0eUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVudGl0eUlkKCk7XG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IEZpbGVMaXN0IHwgbnVsbCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZ29GaWxlID0gZXZlbnRbMF07XG4gICAgICBjb25zb2xlLmxvZygn77+977+9IExvZ28gRmlsZSBTZWxlY3RlZDonLCB0aGlzLmxvZ29GaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ29GaWxlID0gdW5kZWZpbmVkO1xuICAgICAgY29uc29sZS5sb2coJ/Cfk4QgTm8gbG9nbyBmaWxlIHNlbGVjdGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogVGFiSXRlbSkge1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCh0YWIuaWQpO1xuICB9XG5cbiAgb25TdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuZW50aXR5Rm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zdWNjZXNzLnNldChudWxsKTtcblxuICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmVudGl0eUZvcm0udmFsdWU7XG4gICAgICBjb25zdCBpc0VkaXQgPSB0aGlzLmlzRWRpdE1vZGUoKTtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gdGhpcy5lbnRpdHlJZCgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhg8J+PoiBFTlRJVFkgJHtpc0VkaXQgPyAnVVBEQVRFJyA6ICdDUkVBVEUnfTogRm9ybSBkYXRhOmAsIGZvcm1EYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBzdWJtaXNzaW9uXG4gICAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IFsnc3llbl9uYW1lJywgJ3N5ZW5fZW50aXR5X2NvZGUnLCAnc3llbl9lbnRpdHlfdHlwZV9nbXN0J107XG4gICAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gcmVxdWlyZWRGaWVsZHMuZmlsdGVyKGZpZWxkID0+ICFmb3JtRGF0YVtmaWVsZF0pO1xuICAgICAgXG4gICAgICBpZiAobWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KGBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBlbnRpdHkgSUQgdG8gZm9ybSBkYXRhIGlmIGluIGVkaXQgbW9kZVxuICAgICAgaWYgKGlzRWRpdCAmJiBlbnRpdHlJZCkge1xuICAgICAgICBmb3JtRGF0YS5faWQgPSBlbnRpdHlJZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiA9IHRoaXMuZW50aXR5U2VydmljZS5zYXZlVXBkYXRlRW50aXR5KGZvcm1EYXRhKTtcblxuICAgICAgc2F2ZU9wZXJhdGlvbi5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIEVOVElUWSAke2lzRWRpdCA/ICdVUERBVEUnIDogJ0NSRUFURSd9IFNVQ0NFU1M6YCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc01lc3NhZ2UgPSBpc0VkaXQgXG4gICAgICAgICAgICAgICAgPyAnRW50aXR5IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScgXG4gICAgICAgICAgICAgICAgOiAnRW50aXR5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICAgICAgICAgIHRoaXMuc3VjY2Vzcy5zZXQoc3VjY2Vzc01lc3NhZ2UpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBlbnRpdHkgSUQgaWYgaXQncyBhIG5ldyBlbnRpdHlcbiAgICAgICAgICAgICAgaWYgKCFpc0VkaXQgJiYgcmVzcG9uc2U/LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEYXRhID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSA/IHJlc3BvbnNlLmRhdGFbMF0gOiByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlEYXRhPy5faWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5SWQuc2V0KGVudGl0eURhdGEuX2lkKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlZGlyZWN0IHRvIGxpc3Qgb3Igc3RheSBvbiBmb3JtXG4gICAgICAgICAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2VudGl0aWVzJ10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2U/Lm1lc3NhZ2UgfHwgYEZhaWxlZCB0byAke2lzRWRpdCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSd9IGVudGl0eS4gUGxlYXNlIHRyeSBhZ2Fpbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYOKdjCBFTlRJVFkgJHtpc0VkaXQgPyAnVVBEQVRFJyA6ICdDUkVBVEUnfSBFUlJPUjpgLCBlcnIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCB0byAke2lzRWRpdCA/ICd1cGRhdGUnIDogJ3NhdmUnfSBlbnRpdHkgc2V0dGluZ3MuYDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGVycj8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyLmVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZSkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyPy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnSW52YWxpZCBkYXRhIHByb3ZpZGVkLiBQbGVhc2UgY2hlY2sgeW91ciBpbnB1dC4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gNDA0ICYmIGlzRWRpdCkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRW50aXR5IG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0VudGl0eSB3aXRoIHRoaXMgY29kZSBhbHJlYWR5IGV4aXN0cy4gUGxlYXNlIHVzZSBhIGRpZmZlcmVudCBjb2RlLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1NlcnZlciBlcnJvci4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayBhbGwgZmllbGRzIGFzIHRvdWNoZWQgdG8gc2hvdyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgdGhpcy5lbnRpdHlGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIFxuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHRoaXMuZ2V0Rm9ybVZhbGlkYXRpb25TdW1tYXJ5KCk7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBGT1JNIFZBTElEQVRJT04gRVJST1JTOicsIHZhbGlkYXRpb25FcnJvcnMpO1xuICAgICAgXG4gICAgICB0aGlzLmVycm9yLnNldChgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczogJHt2YWxpZGF0aW9uRXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgb25SZXNldCgpIHtcbiAgICAvLyBDbGVhciBsb2dvIGZpbGVcbiAgICB0aGlzLmxvZ29GaWxlID0gdW5kZWZpbmVkO1xuICAgIFxuICAgIC8vIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLmVudGl0eUZvcm0ucmVzZXQoe1xuICAgICAgc3llbl9uYW1lOiAnJyxcbiAgICAgIHN5ZW5fZW50aXR5X3R5cGVfZ21zdDogJycsXG4gICAgICBzeWVuX2VudGl0eV9jb2RlOiAnJyxcbiAgICAgIHN5ZW5fdWRpc2Vfbm86ICcnLFxuICAgICAgc3llbl9hZmZpbGlhdGlvbl9ubzogJycsXG4gICAgICBzeWVuX2lzYWN0aXZlOiB0cnVlLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfYWRkcmVzczogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9waW5fc3lwaW46ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfY2l0eV9zeXBpbjogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbjogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyOiAnJyxcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2NvbnRhY3RfcGVyc29uX3VzZXI6ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmU6ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmVfYWx0OiAnJyxcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2ZheDogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbF9hbHQ6ICcnLFxuICAgICAgc3llbl93ZWJzaXRlOiAnJyxcbiAgICAgIHN5ZW5fY3VycmVuY3lfc3ljcjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfYWRkcmVzczogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfcGluX3N5cGluOiAnJyxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jaXR5X3N5cGluOiAnJyxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY291bnRyeV9zeWN0cjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY29udGFjdF9wZXJzb25fdXNlcjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfcGhvbmU6ICcnLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX2ZheDogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfZW1haWw6ICcnLFxuICAgICAgc3llbl9waG90b19pZF9jeWZtOiAnJ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuc3VjY2Vzcy5zZXQobnVsbCk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgY29uc29sZS5sb2coJ/CflIQgRm9ybSByZXNldCBjb21wbGV0ZWQnKTtcbiAgfVxufSAiLCI8IS0tIFxuICBEWU5BTUlDIEdSSUQgU1lTVEVNIEZFQVRVUkVTOlxuICBcbiAgQmFzaWMgR3JpZHM6IGdyaWQtMSwgZ3JpZC0yLCBncmlkLTMsIGdyaWQtNCwgZ3JpZC01LCBncmlkLTZcbiAgXG4gIEF1dG8tZml0IEdyaWRzOiBncmlkLWF1dG8tZml0LXNtL21kL2xnL3hsIChkeW5hbWljIGNvbHVtbnMgYmFzZWQgb24gY29udGVudClcbiAgQXV0by1maWxsIEdyaWRzOiBncmlkLWF1dG8tZmlsbC1zbS9tZC9sZyAoYWx3YXlzIGZpbGwgYXZhaWxhYmxlIHNwYWNlKVxuICBcbiAgQ3VzdG9tIFJhdGlvczogZ3JpZC1yYXRpby0xLTIsIGdyaWQtcmF0aW8tMi0xLCBncmlkLXJhdGlvLTEtMywgZ3JpZC1yYXRpby0zLTEsIGV0Yy5cbiAgRnJhY3Rpb25hbDogZ3JpZC1xdWFydGVyLXRocmVlLCBncmlkLXRoaXJkLXR3bywgZ3JpZC1oYWxmLWhhbGZcbiAgXG4gIEdhcCBDb250cm9sOiBnYXAteHMsIGdhcC1zbSwgZ2FwLW1kLCBnYXAtbGcsIGdhcC14bFxuICBTcGVjaWZpYyBHYXBzOiByb3ctZ2FwLXhzL3NtL21kL2xnLCBjb2wtZ2FwLXhzL3NtL21kL2xnXG4gIFxuICBBbGlnbm1lbnQ6IGFsaWduLXN0YXJ0L2NlbnRlci9lbmQvc3RyZXRjaCwganVzdGlmeS1zdGFydC9jZW50ZXIvZW5kL3N0cmV0Y2hcbiAgXG4gIFJlc3BvbnNpdmU6IHhsLWdyaWQtKiwgbGctZ3JpZC0qLCBtZC1ncmlkLSosIHNtLWdyaWQtKiwgeHMtZ3JpZC0qXG4gIFxuICBHcmlkIEl0ZW1zOiBzcGFuLTEvMi8zLzQvNS82L2Z1bGwsIHJvdy1zcGFuLSosIHN0YXJ0LSosIGVuZC0qXG4gIEl0ZW0gQWxpZ25tZW50OiBzZWxmLXN0YXJ0L2NlbnRlci9lbmQvc3RyZXRjaCwganVzdGlmeS1zZWxmLSpcbiAgXG4gIFNwZWNpYWw6IGdyaWQtZGVuc2UgKGF1dG8tZmlsbHMgZ2FwcyksIGdyaWQtbWFzb25yeSAobWFzb25yeSBsYXlvdXQpXG4tLT5cblxuPGRpdiBjbGFzcz1cImVudGl0eS1mb3JtLWNvbnRhaW5lclwiPlxuICA8Zm9ybSBjbGFzcz1cImVudGl0eS1mb3JtXCIgW2Zvcm1Hcm91cF09XCJlbnRpdHlGb3JtXCIgW2NsYXNzLmxvYWRpbmddPVwibG9hZGluZygpXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhlYWRlclwiPlxuICAgICAgPGgyIGNsYXNzPVwiZm9ybS10aXRsZVwiPkNyZWF0ZSBOZXcgRW50aXR5PC9oMj5cbiAgICAgIDxwIGNsYXNzPVwiZm9ybS1zdWJ0aXRsZVwiPkFkZCBhIG5ldyBlZHVjYXRpb25hbCBpbnN0aXR1dGlvbiB0byB0aGUgc3lzdGVtPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdWNjZXNzIGFuZCBFcnJvciBNZXNzYWdlcyAtLT5cbiAgICBAaWYgKHN1Y2Nlc3MoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImFsZXJ0LWljb25cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk01IDEzbDQgNEwxOSA3XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAge3sgc3VjY2VzcygpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChlcnJvcigpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZXJyb3JcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImFsZXJ0LWljb25cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAge3sgZXJyb3IoKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBUYWIgTmF2aWdhdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS10YWJzXCI+XG4gICAgICA8Y2lkZS1lbGUtdGFiIFxuICAgICAgICBbdGFic109XCJlbnRpdHlUYWJzKClcIlxuICAgICAgICBbYWN0aXZlVGFiSWRdPVwiYWN0aXZlVGFiKClcIlxuICAgICAgICBzaXplPVwibWRcIlxuICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICh0YWJDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jaWRlLWVsZS10YWI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiXG4gICAgICAgICBbY2xhc3MubG9hZGluZ109XCJsb2FkaW5nKClcIj5cbiAgICAgIEBzd2l0Y2ggKGFjdGl2ZVRhYigpKSB7XG4gICAgICAgIFxuICAgICAgICBAY2FzZSAoJ2Jhc2ljJykge1xuICAgICAgICAgIDwhLS0gQmFzaWMgSW5mb3JtYXRpb24gU2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWF1dG8tZml0LW1kIGdhcC1tZCBsZy1ncmlkLTIgbWQtZ3JpZC0xXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc3Bhbi0yIG1kLXNwYW4tZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGlkPVwic3llbl9uYW1lXCIgXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkluc3RpdHV0aW9uIE5hbWVcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fbmFtZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGZ1bGwgaW5zdGl0dXRpb24gbmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5zdGl0dXRpb24gQ29kZVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fZW50aXR5X2NvZGVcIlxuICAgICAgICAgICAgICAgIGlkPVwic3llbl9lbnRpdHlfY29kZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB1bmlxdWUgY29kZSAobWF4IDQwIGNoYXJhY3RlcnMpXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1yYXRpby0yLTEtMSBnYXAtbWQgbGctZ3JpZC0zIG1kLWdyaWQtMiBzbS1ncmlkLTFcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkVudGl0eSBUeXBlXCIgXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZW50aXR5VHlwZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fZW50aXR5X3R5cGVfZ21zdFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZW50aXR5IHR5cGVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJVRElTRSBOdW1iZXJcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3VkaXNlX25vXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIFVESVNFIG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiQWZmaWxpYXRpb24gTnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9hZmZpbGlhdGlvbl9ub1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhZmZpbGlhdGlvbiBudW1iZXJcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLXNtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2lzYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94LXRleHRcIj5BY3RpdmUgU3RhdHVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC1kZXNjcmlwdGlvblwiPkVuYWJsZSB0aGlzIGVudGl0eSBmb3Igc3lzdGVtIG9wZXJhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBjYXNlICgnY29ycG9yYXRlJykge1xuICAgICAgICAgIDwhLS0gQ29ycG9yYXRlIEFkZHJlc3MgU2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLW1kXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc3Bhbi1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLXRleHRhcmVhIFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDb3Jwb3JhdGUgQWRkcmVzc1wiIFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9jb3Jwb3JhdGVfYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNvbXBsZXRlIGNvcnBvcmF0ZSBhZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLXRleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWF1dG8tZml0LXNtIGdhcC1sZyB4bC1ncmlkLTQgbGctZ3JpZC0zIG1kLWdyaWQtMiBzbS1ncmlkLTEgYWxpZ24tZW5kXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQb3N0YWwgQ29kZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicG9zdGFsQ29kZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX3Bpbl9zeXBpblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgcG9zdGFsIGNvZGVcIlxuICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cInBvc3RhbENvZGVzTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uUG9zdGFsQ29kZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uUG9zdGFsQ29kZVNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiQ2l0eVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2NpdHlfc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgY2l0eVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU3RhdGVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBzdGF0ZVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkNvdW50cnlcIiBcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb3VudHJpZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2NvdW50cnlfc3ljdHJcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvdW50cnlcIlxuICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImNvdW50cmllc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvbkNvdW50cnlTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGNhc2UgKCdjb250YWN0Jykge1xuICAgICAgICAgIDwhLS0gQ29udGFjdCBJbmZvcm1hdGlvbiBTZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcmF0aW8tMy0xIGdhcC1sZyBtZC1ncmlkLTIgc20tZ3JpZC0xIGp1c3RpZnktc3RyZXRjaFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGp1c3RpZnktc2VsZi1zdHJldGNoXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiUHJpbWFyeSBDb250YWN0IFBlcnNvblwiXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1c2VycygpXCIgXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbnRhY3QgcGVyc29uXCJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidXNlcnNMb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblVzZXJTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0ganVzdGlmeS1zZWxmLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtc2VsZWN0IFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDdXJyZW5jeVwiIFxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY3VycmVuY2llcygpXCIgXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2N1cnJlbmN5X3N5Y3JcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1hdXRvLWZpbGwtbWQgZ2FwLW1kIGNvbC1nYXAtbGcgcm93LWdhcC1zbSB4bC1ncmlkLTMgbGctZ3JpZC0yIG1kLWdyaWQtMSBncmlkLWRlbnNlXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlByaW1hcnkgUGhvbmVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9waG9uZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBwaG9uZSBudW1iZXJcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkFsdGVybmF0ZSBQaG9uZVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX3Bob25lX2FsdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbHRlcm5hdGUgcGhvbmVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkZheCBOdW1iZXJcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9mYXhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZmF4IG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcmF0aW8tMS0yLTEgZ2FwLXhsIGxnLWdyaWQtMyBtZC1ncmlkLTIgc20tZ3JpZC0xIGFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiUHJpbWFyeSBFbWFpbFwiIFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9jb3Jwb3JhdGVfZW1haWxcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcHJpbWFyeSBlbWFpbFwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBzcGFuLTIgbGctc3Bhbi0xIHNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiV2Vic2l0ZSBVUkxcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fd2Vic2l0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgd2Vic2l0ZSBVUkxcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc2VsZi1zdHJldGNoXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJBbHRlcm5hdGUgRW1haWxcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2VtYWlsX2FsdFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbHRlcm5hdGUgZW1haWxcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGNhc2UgKCdyZWdpc3RlcmVkJykge1xuICAgICAgICAgIDwhLS0gUmVnaXN0ZXJlZCBBZGRyZXNzIFNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC0xXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS10ZXh0YXJlYSBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgQWRkcmVzc1wiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9hZGRyZXNzXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNvbXBsZXRlIHJlZ2lzdGVyZWQgYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiM1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtNFwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtc2VsZWN0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiUmVnaXN0ZXJlZCBQb3N0YWwgQ29kZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicG9zdGFsQ29kZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9waW5fc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHBvc3RhbCBjb2RlXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJwb3N0YWxDb2Rlc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblBvc3RhbENvZGVTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBvc3RhbENvZGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgQ2l0eVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9jaXR5X3N5cGluXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNpdHlcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgU3RhdGVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3JlZ2lzdGVyZWRfc3RhdGVfc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3RhdGVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIENvdW50cnlcIiBcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb3VudHJpZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9jb3VudHJ5X3N5Y3RyXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb3VudHJ5XCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJjb3VudHJpZXNMb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25Db3VudHJ5U2VhcmNoKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC0zXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIENvbnRhY3QgUGVyc29uXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1c2VycygpXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXJcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbnRhY3QgcGVyc29uXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJ1c2Vyc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblVzZXJTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgUGhvbmVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3JlZ2lzdGVyZWRfcGhvbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGhvbmUgbnVtYmVyXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIEVtYWlsXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9yZWdpc3RlcmVkX2VtYWlsXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZW1haWxcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgQGlmIChoYXNFcnJvcignc3llbl9yZWdpc3RlcmVkX2VtYWlsJykpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPnt7IGdldEVycm9yTWVzc2FnZSgnc3llbl9yZWdpc3RlcmVkX2VtYWlsJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtMVwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIEZheFwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9mYXhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZmF4IG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAY2FzZSAoJ2RvY3VtZW50cycpIHtcbiAgICAgICAgICA8IS0tIERvY3VtZW50cyBTZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDwhLS0gUGhvdG8gSUQgRG9jdW1lbnQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLW1kXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQaG90byBJRCBEb2N1bWVudFwiIFxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInBob3RvSWREb2N1bWVudHMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcGhvdG9faWRfY3lmbVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgcGhvdG8gSUQgZG9jdW1lbnRcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBMb2dvIFVwbG9hZCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcXVhcnRlci10aHJlZSBnYXAtbGcgbWQtZ3JpZC0xIGFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHNlbGYtY2VudGVyIGp1c3RpZnktc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIExvZ28gcHJldmlldyBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEyMHB4OyBoZWlnaHQ6IDEyMHB4OyBib3JkZXI6IDJweCBkYXNoZWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czogOHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgY29sb3I6ICM5Y2EzYWY7IGZvbnQtc2l6ZTogMC44NzVyZW07IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgIExvZ28gUHJldmlld1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBzZWxmLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtZmlsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiVXBsb2FkIExvZ29cIiBcbiAgICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIiBcbiAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiIFxuICAgICAgICAgICAgICAgICAgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgaW5zdGl0dXRpb24gbG9nbyBvciBpbWFnZVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtZmlsZS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiIFxuICAgICAgICAoY2xpY2spPVwib25SZXNldCgpXCIgXG4gICAgICAgIGxlZnRJY29uPVwicmVmcmVzaFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgUmVzZXQgRm9ybVxuICAgICAgPC9idXR0b24+XG4gICAgICBcbiAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCIgXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKCkgfHwgZW50aXR5Rm9ybS5pbnZhbGlkXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZygpXCJcbiAgICAgICAgbGVmdEljb249XCJjaGVja1wiPlxuICAgICAgICBDcmVhdGUgRW50aXR5XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+ICJdfQ==
|