tango-app-ui-manage-billing 3.3.14 → 3.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs +39 -5
  2. package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +3 -3
  3. package/esm2022/lib/components/billing-tabs/billing-tabs.component.mjs +20 -6
  4. package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +31 -5
  5. package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +16 -6
  6. package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +17 -3
  7. package/esm2022/lib/components/plans-subscription/payments-subscription.component.mjs +7 -3
  8. package/esm2022/lib/components/tango-manage-billing/credit-note/credit-note.component.mjs +2 -1
  9. package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +3 -3
  10. package/esm2022/lib/components/tango-manage-billing/one-time-fee/one-time-fee.component.mjs +2 -1
  11. package/esm2022/lib/components/tango-manage-billing/payment-statuschange/payment-statuschange.component.mjs +2 -2
  12. package/fesm2022/tango-app-ui-manage-billing.mjs +131 -27
  13. package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
  14. package/lib/components/billing-groups/billing-group-form/billing-group-form.component.d.ts +2 -0
  15. package/lib/components/billing-tabs/billing-tabs.component.d.ts +4 -2
  16. package/lib/components/brand-invoices/brand-invoices.component.d.ts +2 -0
  17. package/lib/components/daily-pricing/daily-pricing.component.d.ts +1 -0
  18. package/lib/components/invoice-preview/invoice-preview.component.d.ts +1 -0
  19. package/lib/components/plans-subscription/payments-subscription.component.d.ts +1 -0
  20. package/package.json +1 -1
@@ -21,6 +21,9 @@ export class BillingGroupFormComponent {
21
21
  submitted;
22
22
  filterData = [];
23
23
  subscribedStoreList = [];
24
+ // Group currently being edited — captured before this.groupId is cleared, so
25
+ // selected-first ordering can read its selected stores.
26
+ editingGroupId = '';
24
27
  filterCountries = [];
25
28
  filterStates = [];
26
29
  filterCities = [];
@@ -101,7 +104,8 @@ export class BillingGroupFormComponent {
101
104
  this.getClientProducts();
102
105
  }
103
106
  ngAfterViewInit() {
104
- this.getSubscribedStores({ getFilters: true });
107
+ // Initial store load is triggered from getBillingGroups() (after the
108
+ // selected stores are patched in) so selected-first ordering works.
105
109
  this.searchInput.valueChanges.pipe(takeUntil(this.destroy$), debounceTime(1000), distinctUntilChanged()).subscribe((val) => {
106
110
  if (val === null || val === undefined)
107
111
  return;
@@ -125,6 +129,9 @@ export class BillingGroupFormComponent {
125
129
  res.data.forEach((group) => {
126
130
  this.patchFormItem({ ...group });
127
131
  });
132
+ // Remember which group is being edited so selected-first ordering can
133
+ // read its stores even after this.groupId is cleared below.
134
+ this.editingGroupId = this.groupId || this.billingGroups.controls[0]?.get('_id')?.value || '';
128
135
  setTimeout(() => {
129
136
  if (this.groupId) {
130
137
  this.billingGroups.controls.forEach((control, idx) => {
@@ -143,6 +150,14 @@ export class BillingGroupFormComponent {
143
150
  }
144
151
  }, 0);
145
152
  }
153
+ // Load the store list AFTER groups are patched so the selected storeIds
154
+ // are available for the backend selected-first ordering. (getFilters on
155
+ // this first call to also populate the country/state/city filters.)
156
+ this.getSubscribedStores({ getFilters: true });
157
+ },
158
+ error: () => {
159
+ // Still load stores even if groups fail, so the section isn't empty.
160
+ this.getSubscribedStores({ getFilters: true });
146
161
  }
147
162
  });
148
163
  }
@@ -286,7 +301,13 @@ export class BillingGroupFormComponent {
286
301
  country: this.filterCountries,
287
302
  state: this.filterStates,
288
303
  city: this.filterCities,
289
- getFilters: getFilters
304
+ getFilters: getFilters,
305
+ // Backend resolves this group's selected stores, tags each row with
306
+ // isSelected and floats selected stores to the top across all pages.
307
+ groupId: this.editingGroupId || this.groupId || this.billingGroups?.controls?.[0]?.get('_id')?.value || '',
308
+ // Also send the live selection (covers a brand-new unsaved group whose
309
+ // stores aren't yet persisted to the billing doc).
310
+ selectedStoreIds: this.selectedStoreIdsForSort()
290
311
  };
291
312
  for (const key in data) {
292
313
  if (data.hasOwnProperty(key)) {
@@ -311,6 +332,7 @@ export class BillingGroupFormComponent {
311
332
  }
312
333
  }
313
334
  this.totalItems = res?.data?.pageInfo?.count || 0;
335
+ // Backend returns selected stores first (selected-first ordering).
314
336
  this.subscribedStoreList = res?.data?.data || [];
315
337
  },
316
338
  error: (e) => {
@@ -360,6 +382,18 @@ export class BillingGroupFormComponent {
360
382
  isStoreSelectedInGroup(formArrayIndex, storeId) {
361
383
  return this.billingGroups.at(formArrayIndex).get('stores')?.value.includes(storeId);
362
384
  }
385
+ // Selected storeIds sent to the backend so it can sort selected stores first.
386
+ // Read straight from the live form (the same source as the checkboxes), so it
387
+ // always matches the UI. The shared store list is rendered per group, so we
388
+ // union every group's selection — for a single-group edit this is exactly
389
+ // that group's stores; for multi-group it floats anything selected anywhere.
390
+ selectedStoreIdsForSort() {
391
+ const ids = new Set();
392
+ (this.billingGroups?.controls || []).forEach(g => {
393
+ (g.get('stores')?.value || []).forEach((s) => ids.add(s));
394
+ });
395
+ return [...ids];
396
+ }
363
397
  isAllStoresSelectedInGroup(formArrayIndex) {
364
398
  return this.subscribedStoreList.every(item => this.billingGroups.at(formArrayIndex).get('stores')?.value.includes(item.storeId)) && this.subscribedStoreList.length;
365
399
  }
@@ -664,11 +698,11 @@ export class BillingGroupFormComponent {
664
698
  });
665
699
  }
666
700
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BillingService }, { token: i3.NgbActiveModal }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
667
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate in advance\r\n </label>\r\n </div>\r\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\r\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\r\n <select class=\"form-select\" formControlName=\"advancePeriod\">\r\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"text-muted small mt-1\">\r\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\r\n clips the Billing Method dropdown options panel. The table\r\n only has two columns, so horizontal scroll isn't needed. -->\r\n <table class=\"table table-sm bottom-border billing-method-table\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-edit-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate in advance\r\n </label>\r\n </div>\r\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\r\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\r\n <select class=\"form-select\" formControlName=\"advancePeriod\">\r\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"text-muted small mt-1\">\r\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
701
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"modal-body\">\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\n <div class=\"header\">\n Update Billing Information\n </div>\n <div>\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\n class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>Add Billing Group</button>\n </div>\n</div>\n\n\n<form [formGroup]=\"billingForm\">\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\n [closeOthers]=\"true\">\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\n <div class=\"d-flex\" ngbAccordionHeader>\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\n class=\"cursor-pointer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <div class=\"divider\"></div>\n </button>\n </div>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody class=\"ps-0 pe-0\">\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\n <div class=\"tab row row-cols-3 g-0 mb-5\">\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'basic-info')\"\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\n class=\"item\">Basic Info</div>\n </div>\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'store-selection')\"\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\n class=\"item\">Store Selection</div>\n </div>\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'settings')\"\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\n class=\"item\">Settings</div>\n </div>\n </div>\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\n formControlName=\"groupName\"\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\n Group name is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\n Group tag is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\n formControlName=\"registeredCompanyName\"\n style=\"text-transform: uppercase;\"\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\n Registered company name is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"gst\" class=\"form-label\">GST</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\n GST is required.\n </small>\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\n Looking up registered address\u2026\n </small>\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\n Registered address auto-filled. Edit if needed.\n </small>\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\n No registered address found for this GSTIN. Enter manually.\n </small>\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\n Address lookup failed. Enter manually.\n </small>\n </div>\n <div class=\"col-12 mb-5 sub-header\">\n Address Details\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\n formControlName=\"addressLineOne\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\n formControlName=\"addressLineTwo\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"city\" class=\"form-label\">City</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\n City is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"state\" class=\"form-label\">State/province</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\n formControlName=\"state\"\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\n State is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"country\" class=\"form-label\">Country</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\n Country is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\n formControlName=\"pinCode\"\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\n Pin code is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\n formControlName=\"placeOfSupply\" readonly\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\n Place of supply is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"po\" class=\"form-label\">PO</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\n Purchase order is required.\n </small>\n </div>\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\n <div class=\"row\">\n <div class=\"col-10\">\n <div class=\"search-input\">\n <span class=\"icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\n fill=\"black\" fill-opacity=\"0.54\" />\n </svg>\n </span>\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\n placeholder=\"Search Store\" autocomplete=\"off\" />\n </div>\n\n </div>\n <div class=\"col-2\">\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\n </div>\n </div>\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\n <div class=\"table-responsive store-table\">\n <table class=\"table bottom-border\">\n <thead>\n <tr>\n <th>\n <div class=\"d-flex align-items-center\">\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\n [disabled]=\"group.get('isPrimary')?.value\"\n (change)=\"onSelectAllStores($event, i)\"\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n <span>Store Name</span>\n </label>\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n stroke=\"#667085\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th>Store Id\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Products</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscribedStoreList\">\n <td>\n <div class=\"d-flex align-items-center\">\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\n [disabled]=\"group.get('isPrimary')?.value\"\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\n <div class=\"store-name\">\n {{data?.storeName}}\n </div>\n </div>\n </td>\n <td>\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\n </td>\n\n <td>\n <div class=\"products\">\n <ng-container *ngFor=\"let product of data?.product\">\n <span *ngIf=\"product === 'tangoTraffic'\"\n class=\"chip me-2 mb-2\">Traffic</span>\n <span *ngIf=\"product === 'tangoZone'\"\n class=\"chip me-2 mb-2\">Zone</span>\n <span *ngIf=\"product === 'tangoTrax'\"\n class=\"chip me-2 mb-2\">Trax</span>\n </ng-container>\n\n </div>\n </td>\n\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div> \n </ng-container>\n\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\"\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n \n </ng-container>\n\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\n <div class=\"shimmer-card w-100\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Pricing Method</label>\n <div class=\"mt-3\">\n <div class=\"mb-3\">\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'prorate-' + i\" value=\"prorate\">\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\n Prorate \u2014 bill for actual working days\n </label>\n </div>\n <div>\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'flat-' + i\" value=\"flat\">\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\n Flat \u2014 bill for the whole month\n </label>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Advance Invoice</label>\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <div class=\"mt-3\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'advanceInvoice_' + i\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\n Generate in advance\n </label>\n </div>\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n <div class=\"text-muted small mt-1\">\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\n clips the Billing Method dropdown options panel. The table\n only has two columns, so horizontal scroll isn't needed. -->\n <table class=\"table table-sm bottom-border billing-method-table\">\n <thead>\n <tr>\n <th>Product</th>\n <th>Billing Method</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let prod of subscribedProducts\">\n <td>\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\n </td>\n <td>\n <lib-reactive-select\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\n [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"billingMethodOptions\">\n </lib-reactive-select>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\n class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control\">\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeEmailChip(email, i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\n viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\n id=\"emailValue\">\n </div>\n </div>\n <small class=\"invalid-inp\"\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\n Invoice email is required\n </small>\n </div>\n <div class=\"col-md-12 col-lg-12 mb-5\">\n <div class=\"row\">\n <div class=\"col-12 mb-5\">\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex\">\n <div class=\"me-4\">\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"yes\" [value]=\"true\">\n <label class=\"form-check-label me-2\" for=\"yes\">\n Yes\n </label>\n </div>\n <div>\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"no\" [value]=\"false\">\n <label class=\"form-check-label me-2\" for=\"no\">\n No\n </label>\n </div>\n </div>\n </div>\n\n\n </div>\n\n </div>\n </div>\n\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\n <span class=\"me-4\">\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\n </span>\n\n <span\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\n </span>\n\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\n <ng-container>\n <div class=\"tab row row-cols-2 g-0 mb-5\">\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'basic-info')\"\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\n Basic\n Info</div>\n </div>\n\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'settings')\"\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\n Settings\n </div>\n </div>\n </div>\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-12 mb-5\">\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\n formControlName=\"registeredCompanyName\"\n style=\"text-transform: uppercase;\"\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\n Registered company name is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"gst\" class=\"form-label\">GST</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\n Registered company name is required.\n </small>\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\n Looking up registered address\u2026\n </small>\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\n Registered address auto-filled. Edit if needed.\n </small>\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\n No registered address found for this GSTIN. Enter manually.\n </small>\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\n Address lookup failed. Enter manually.\n </small>\n </div>\n <div class=\"col-12 mb-5 sub-header\">\n Address Details\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\n formControlName=\"addressLineOne\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\n formControlName=\"addressLineTwo\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"city\" class=\"form-label\">City</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\n City is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"state\" class=\"form-label\">State/province</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\n State is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"country\" class=\"form-label\">Country</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\n Country is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\n formControlName=\"pinCode\"\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\n Pin code is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\n formControlName=\"placeOfSupply\" readonly\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\n Place of supply is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"po\" class=\"form-label\">PO</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\n Purchase order is required.\n </small>\n </div>\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Pricing Method</label>\n <div class=\"mt-3\">\n <div class=\"mb-3\">\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\n Prorate \u2014 bill for actual working days\n </label>\n </div>\n <div>\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'flat-edit-' + i\" value=\"flat\">\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\n Flat \u2014 bill for the whole month\n </label>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Advance Invoice</label>\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <div class=\"mt-3\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'advanceInvoiceSingle_' + i\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\n Generate in advance\n </label>\n </div>\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n <div class=\"text-muted small mt-1\">\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\n <div class=\"table-responsive\">\n <table class=\"table table-sm bottom-border\">\n <thead>\n <tr>\n <th>Product</th>\n <th>Billing Method</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let prod of subscribedProducts\">\n <td>\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\n </td>\n <td>\n <lib-reactive-select\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\n [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"billingMethodOptions\">\n </lib-reactive-select>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\n class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control\">\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeEmailChip(email, i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\n viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\n id=\"emailValue\">\n </div>\n </div>\n <small class=\"invalid-inp\"\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\n Invoice email is required\n </small>\n </div>\n <div class=\"col-md-12 col-lg-12 mb-5\">\n <div class=\"row\">\n <div class=\"col-12 mb-5\">\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex\">\n <div class=\"me-4\">\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"yes\" [value]=\"true\">\n <label class=\"form-check-label me-2\" for=\"yes\">\n Yes\n </label>\n </div>\n <div>\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"no\" [value]=\"false\">\n <label class=\"form-check-label me-2\" for=\"no\">\n No\n </label>\n </div>\n </div>\n </div>\n\n\n </div>\n\n </div>\n </div>\n\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\n <span class=\"me-4\">\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\n </span>\n\n <span\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\n </span>\n\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\n </span>\n\n </div>\n </ng-container>\n\n\n </ng-container>\n </ng-container>\n\n</form>\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
668
702
  }
669
703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, decorators: [{
670
704
  type: Component,
671
- args: [{ selector: 'lib-billing-group-form', template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate in advance\r\n </label>\r\n </div>\r\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\r\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\r\n <select class=\"form-select\" formControlName=\"advancePeriod\">\r\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"text-muted small mt-1\">\r\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\r\n clips the Billing Method dropdown options panel. The table\r\n only has two columns, so horizontal scroll isn't needed. -->\r\n <table class=\"table table-sm bottom-border billing-method-table\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-edit-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate in advance\r\n </label>\r\n </div>\r\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\r\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\r\n <select class=\"form-select\" formControlName=\"advancePeriod\">\r\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"text-muted small mt-1\">\r\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
705
+ args: [{ selector: 'lib-billing-group-form', template: "<div class=\"modal-body\">\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\n <div class=\"header\">\n Update Billing Information\n </div>\n <div>\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\n class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>Add Billing Group</button>\n </div>\n</div>\n\n\n<form [formGroup]=\"billingForm\">\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\n [closeOthers]=\"true\">\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\n <div class=\"d-flex\" ngbAccordionHeader>\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\n class=\"cursor-pointer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <div class=\"divider\"></div>\n </button>\n </div>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody class=\"ps-0 pe-0\">\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\n <div class=\"tab row row-cols-3 g-0 mb-5\">\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'basic-info')\"\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\n class=\"item\">Basic Info</div>\n </div>\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'store-selection')\"\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\n class=\"item\">Store Selection</div>\n </div>\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'settings')\"\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\n class=\"item\">Settings</div>\n </div>\n </div>\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\n formControlName=\"groupName\"\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\n Group name is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\n Group tag is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\n formControlName=\"registeredCompanyName\"\n style=\"text-transform: uppercase;\"\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\n Registered company name is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"gst\" class=\"form-label\">GST</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\n GST is required.\n </small>\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\n Looking up registered address\u2026\n </small>\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\n Registered address auto-filled. Edit if needed.\n </small>\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\n No registered address found for this GSTIN. Enter manually.\n </small>\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\n Address lookup failed. Enter manually.\n </small>\n </div>\n <div class=\"col-12 mb-5 sub-header\">\n Address Details\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\n formControlName=\"addressLineOne\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\n formControlName=\"addressLineTwo\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"city\" class=\"form-label\">City</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\n City is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"state\" class=\"form-label\">State/province</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\n formControlName=\"state\"\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\n State is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"country\" class=\"form-label\">Country</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\n Country is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\n formControlName=\"pinCode\"\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\n Pin code is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\n formControlName=\"placeOfSupply\" readonly\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\n Place of supply is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"po\" class=\"form-label\">PO</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\n Purchase order is required.\n </small>\n </div>\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\n <div class=\"row\">\n <div class=\"col-10\">\n <div class=\"search-input\">\n <span class=\"icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\n viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\n fill=\"black\" fill-opacity=\"0.54\" />\n </svg>\n </span>\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\n placeholder=\"Search Store\" autocomplete=\"off\" />\n </div>\n\n </div>\n <div class=\"col-2\">\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\n </div>\n </div>\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\n <div class=\"table-responsive store-table\">\n <table class=\"table bottom-border\">\n <thead>\n <tr>\n <th>\n <div class=\"d-flex align-items-center\">\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\n [disabled]=\"group.get('isPrimary')?.value\"\n (change)=\"onSelectAllStores($event, i)\"\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n <span>Store Name</span>\n </label>\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n stroke=\"#667085\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th>Store Id\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Products</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscribedStoreList\">\n <td>\n <div class=\"d-flex align-items-center\">\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\n [disabled]=\"group.get('isPrimary')?.value\"\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\n <div class=\"store-name\">\n {{data?.storeName}}\n </div>\n </div>\n </td>\n <td>\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\n </td>\n\n <td>\n <div class=\"products\">\n <ng-container *ngFor=\"let product of data?.product\">\n <span *ngIf=\"product === 'tangoTraffic'\"\n class=\"chip me-2 mb-2\">Traffic</span>\n <span *ngIf=\"product === 'tangoZone'\"\n class=\"chip me-2 mb-2\">Zone</span>\n <span *ngIf=\"product === 'tangoTrax'\"\n class=\"chip me-2 mb-2\">Trax</span>\n </ng-container>\n\n </div>\n </td>\n\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div> \n </ng-container>\n\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\"\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n \n </ng-container>\n\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\n <div class=\"shimmer-card w-100\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Pricing Method</label>\n <div class=\"mt-3\">\n <div class=\"mb-3\">\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'prorate-' + i\" value=\"prorate\">\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\n Prorate \u2014 bill for actual working days\n </label>\n </div>\n <div>\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'flat-' + i\" value=\"flat\">\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\n Flat \u2014 bill for the whole month\n </label>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Advance Invoice</label>\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <div class=\"mt-3\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'advanceInvoice_' + i\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\n Generate in advance\n </label>\n </div>\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n <div class=\"text-muted small mt-1\">\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\n clips the Billing Method dropdown options panel. The table\n only has two columns, so horizontal scroll isn't needed. -->\n <table class=\"table table-sm bottom-border billing-method-table\">\n <thead>\n <tr>\n <th>Product</th>\n <th>Billing Method</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let prod of subscribedProducts\">\n <td>\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\n </td>\n <td>\n <lib-reactive-select\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\n [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"billingMethodOptions\">\n </lib-reactive-select>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\n class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control\">\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeEmailChip(email, i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\n viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\n id=\"emailValue\">\n </div>\n </div>\n <small class=\"invalid-inp\"\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\n Invoice email is required\n </small>\n </div>\n <div class=\"col-md-12 col-lg-12 mb-5\">\n <div class=\"row\">\n <div class=\"col-12 mb-5\">\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex\">\n <div class=\"me-4\">\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"yes\" [value]=\"true\">\n <label class=\"form-check-label me-2\" for=\"yes\">\n Yes\n </label>\n </div>\n <div>\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"no\" [value]=\"false\">\n <label class=\"form-check-label me-2\" for=\"no\">\n No\n </label>\n </div>\n </div>\n </div>\n\n\n </div>\n\n </div>\n </div>\n\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\n <span class=\"me-4\">\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\n </span>\n\n <span\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\n </span>\n\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\n <ng-container>\n <div class=\"tab row row-cols-2 g-0 mb-5\">\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'basic-info')\"\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\n Basic\n Info</div>\n </div>\n\n <div class=\"col\">\n <div (click)=\"onTabChange(i, 'settings')\"\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\n Settings\n </div>\n </div>\n </div>\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-12 mb-5\">\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\n formControlName=\"registeredCompanyName\"\n style=\"text-transform: uppercase;\"\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\n Registered company name is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"gst\" class=\"form-label\">GST</label>\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\n Registered company name is required.\n </small>\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\n Looking up registered address\u2026\n </small>\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\n Registered address auto-filled. Edit if needed.\n </small>\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\n No registered address found for this GSTIN. Enter manually.\n </small>\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\n Address lookup failed. Enter manually.\n </small>\n </div>\n <div class=\"col-12 mb-5 sub-header\">\n Address Details\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\n formControlName=\"addressLineOne\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-12 mb-5\">\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\n formControlName=\"addressLineTwo\"\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\n Address is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"city\" class=\"form-label\">City</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\n City is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"state\" class=\"form-label\">State/province</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\n State is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"country\" class=\"form-label\">Country</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\n Country is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\n formControlName=\"pinCode\"\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\n Pin code is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\n formControlName=\"placeOfSupply\" readonly\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\n Place of supply is required.\n </small>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label for=\"po\" class=\"form-label\">PO</label>\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\n <small class=\"invalid-feedback\"\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\n Purchase order is required.\n </small>\n </div>\n </div>\n\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Pricing Method</label>\n <div class=\"mt-3\">\n <div class=\"mb-3\">\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\n Prorate \u2014 bill for actual working days\n </label>\n </div>\n <div>\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\n [id]=\"'flat-edit-' + i\" value=\"flat\">\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\n Flat \u2014 bill for the whole month\n </label>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <label class=\"form-check-label\">Advance Invoice</label>\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <div class=\"mt-3\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'advanceInvoiceSingle_' + i\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\n Generate in advance\n </label>\n </div>\n <div *ngIf=\"billingGroups.at(i).get('advanceInvoice')?.value\" class=\"mt-2\">\n <label class=\"form-label small fw-semibold\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n <div class=\"text-muted small mt-1\">\n Advance invoice will cover {{ advanceInvoiceRange(billingGroups.at(i).get('advancePeriod')?.value) }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\n <div class=\"table-responsive\">\n <table class=\"table table-sm bottom-border\">\n <thead>\n <tr>\n <th>Product</th>\n <th>Billing Method</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let prod of subscribedProducts\">\n <td>\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\n </td>\n <td>\n <lib-reactive-select\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\n [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"billingMethodOptions\">\n </lib-reactive-select>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-6 mb-5\">\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\n </div>\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\n class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control\">\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeEmailChip(email, i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\n viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\n id=\"emailValue\">\n </div>\n </div>\n <small class=\"invalid-inp\"\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\n Invoice email is required\n </small>\n </div>\n <div class=\"col-md-12 col-lg-12 mb-5\">\n <div class=\"row\">\n <div class=\"col-12 mb-5\">\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex\">\n <div class=\"me-4\">\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"yes\" [value]=\"true\">\n <label class=\"form-check-label me-2\" for=\"yes\">\n Yes\n </label>\n </div>\n <div>\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\n type=\"radio\" id=\"no\" [value]=\"false\">\n <label class=\"form-check-label me-2\" for=\"no\">\n No\n </label>\n </div>\n </div>\n </div>\n\n\n </div>\n\n </div>\n </div>\n\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\n <span class=\"me-4\">\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\n </span>\n\n <span\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\n </span>\n\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\n </span>\n\n </div>\n </ng-container>\n\n\n </ng-container>\n </ng-container>\n\n</form>\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
672
706
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BillingService }, { type: i3.NgbActiveModal }, { type: i4.ToastService }], propDecorators: { clientId: [{
673
707
  type: Input
674
708
  }], groupId: [{
@@ -679,4 +713,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
679
713
  type: ViewChild,
680
714
  args: [NgbAccordionDirective]
681
715
  }] } });
682
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBMEIsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVNuRixNQUFNLE9BQU8seUJBQXlCO0lBa0YxQjtJQUNBO0lBQ0Q7SUFDQztJQW5GRCxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUM1QixXQUFXLENBQVk7SUFDdkIsU0FBUyxDQUFVO0lBQ25CLFVBQVUsR0FBMEIsRUFBRSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyxlQUFlLEdBQVUsRUFBRSxDQUFDO0lBQzVCLFlBQVksR0FBVSxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixX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O1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0EvcUJVLHlCQUF5Qjs0RkFBekIseUJBQXlCLHlMQXlFekIscUJBQXFCLGdEQ3JGbEMsa3o0REEreUJNOzs0RkRueUJPLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7cUtBTXpCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBcUU0QixTQUFTO3NCQUExQyxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiQWNjb3JkaW9uRGlyZWN0aXZlLCBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYmlsbGluZy1ncm91cC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGdyb3VwSWQ6IHN0cmluZztcbiAgQElucHV0KCkgY3VycmVudFRhYjogc3RyaW5nO1xuICBiaWxsaW5nRm9ybTogRm9ybUdyb3VwO1xuICBzdWJtaXR0ZWQ6IGJvb2xlYW47XG4gIGZpbHRlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xuICBzdWJzY3JpYmVkU3RvcmVMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJDb3VudHJpZXM6IGFueVtdID0gW107XG4gIGZpbHRlclN0YXRlczogYW55W10gPSBbXTtcbiAgZmlsdGVyQ2l0aWVzOiBhbnlbXSA9IFtdO1xuICBzZWFyY2hJbnB1dCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIHNlYXJjaFRlcm06IHN0cmluZztcbiAgc29ydGVkQ29sdW1uOiBzdHJpbmc7XG4gIHNvcnREaXJlY3Rpb246IG51bWJlcjtcbiAgc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnaW5pdGlhbCcgfCAnbG9hZGluZycgfCAnbG9hZGVkJz4oJ2luaXRpYWwnKTtcbiAgc3Vic2NyaWJlZFByb2R1Y3RzOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICAvLyBHU1RJTiBsb29rdXAgc3RhdGUgcGVyIGJpbGxpbmctZ3JvdXAgcm93LCBrZXllZCBieSBGb3JtQXJyYXkgaW5kZXguXG4gIC8vICdpZGxlJyA9IG5vIGxvb2t1cCB5ZXQgKG9yIEdTVElOIHRvbyBzaG9ydCB0byB0cmlnZ2VyIG9uZSkuXG4gIC8vICdsb2FkaW5nJyA9IHJlcXVlc3QgaW4gZmxpZ2h0LlxuICAvLyAnZm91bmQnID0gYmFja2VuZCByZXR1cm5lZCBhbiBhZGRyZXNzLCBmaWVsZHMgYXV0by1maWxsZWQuXG4gIC8vICdub3Rmb3VuZCcgPSBiYWNrZW5kIHJldHVybmVkIDQwNCAvIHVua25vd24gR1NUSU4uXG4gIC8vICdlcnJvcicgPSBuZXR3b3JrIG9yIHVuZXhwZWN0ZWQgZXJyb3IuXG4gIGdzdExvb2t1cFN0YXRlOiBSZWNvcmQ8bnVtYmVyLCAnaWRsZScgfCAnbG9hZGluZycgfCAnZm91bmQnIHwgJ25vdGZvdW5kJyB8ICdlcnJvcic+ID0ge307XG4gIC8vIFRyYWNrIHRoZSBsYXN0IEdTVElOIHdlIHN1Y2Nlc3NmdWxseSBsb29rZWQgdXAgcGVyIHJvdyBzbyByZS10eXBpbmcgdGhlXG4gIC8vIHNhbWUgdmFsdWUgZG9lc24ndCByZWZpcmUgdGhlIHJlcXVlc3QgKGFuZCBhdm9pZCBjbG9iYmVyaW5nIG1hbnVhbCBlZGl0c1xuICAvLyB0aGUgdXNlciBtYXkgaGF2ZSBtYWRlIGFmdGVyIHRoZSBhdXRvLWZpbGwpLlxuICBwcml2YXRlIGxhc3RMb29rZWRVcEdzdGluOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge307XG5cbiAgZ3JvdXBUYWdPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdzdG9yZScsIGxhYmVsOiAnU3RvcmUnIH0sXG4gICAgeyB2YWx1ZTogJ2dzdCcsIGxhYmVsOiAnR1NUJyB9XG4gIF07XG4gIGN1cnJlbmN5T3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnZG9sbGFyJywgbGFiZWw6ICdEb2xsYXIgKCQpJyB9LFxuICAgIHsgdmFsdWU6ICdpbnInLCBsYWJlbDogJ0lOUiAo4oK5KScgfSxcbiAgICB7IHZhbHVlOiAnc2luZ2Fwb3JlZG9sbGFyJywgbGFiZWw6ICdTaW5nYXBvcmUgRG9sbGFyIChTJCknIH0sXG4gICAgeyB2YWx1ZTogJ2V1cm8nLCBsYWJlbDogJ0V1cm8gKOKCrCknIH0sXG4gICAgeyB2YWx1ZTogJ2FlZCcsIGxhYmVsOiAnQUVEIChBRUQpJyB9LFxuICBdO1xuICAvLyBBZHZhbmNlLWludm9pY2UgaG9yaXpvbjogaG93IGZhciBhaGVhZCB0aGUgYWR2YW5jZSBpbnZvaWNlIGlzIGdlbmVyYXRlZC5cbiAgYWR2YW5jZVBlcmlvZE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ21vbnRobHknLCBsYWJlbDogJ01vbnRobHkgKG5leHQgbW9udGgpJywgbW9udGhzOiAxIH0sXG4gICAgeyB2YWx1ZTogJ3F1YXJ0ZXJseScsIGxhYmVsOiAnUXVhcnRlcmx5IChuZXh0IDMgbW9udGhzKScsIG1vbnRoczogMyB9LFxuICAgIHsgdmFsdWU6ICdoYWxmeWVhcmx5JywgbGFiZWw6ICdIYWxmLXllYXJseSAobmV4dCA2IG1vbnRocyknLCBtb250aHM6IDYgfSxcbiAgICB7IHZhbHVlOiAneWVhcmx5JywgbGFiZWw6ICdZZWFybHkgKG5leHQgMTIgbW9udGhzKScsIG1vbnRoczogMTIgfSxcbiAgXTtcbiAgLy8gRHJpdmVzIHdoZXRoZXIgdGhlIGJhY2tlbmQgd2lsbCBjYWxjdWxhdGUgR1NUL0lHU1Qgb24gaW52b2ljZXMgZm9yIHRoaXNcbiAgLy8gZ3JvdXAuICdpbnRlcm5hdGlvbmFsJyBza2lwcyB0YXhlcyBlbnRpcmVseSBzbyB0aGUgdG90YWxBbW91bnQgZXF1YWxzXG4gIC8vIHRoZSBzdWJ0b3RhbC4gU2VlIGdzdGluTG9va3VwIOKGkiBpbnZvaWNlQ29udHJvbGxlci5jcmVhdGVJbnZvaWNlLlxuICB0YXhDYWxjdWxhdGlvblR5cGVPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdkb21lc3RpYycsIGxhYmVsOiAnRG9tZXN0aWMnIH0sXG4gICAgeyB2YWx1ZTogJ2ludGVybmF0aW9uYWwnLCBsYWJlbDogJ0ludGVybmF0aW9uYWwnIH0sXG4gIF07XG4gIHBheW1lbnRDeWNsZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ21vbnRobHknLCBsYWJlbDogJ01vbnRobHknIH0sXG4gICAgeyB2YWx1ZTogJ3F1YXJ0ZXInLCBsYWJlbDogJ1F1YXJ0ZXJseScgfSxcbiAgICB7IHZhbHVlOiAnaGFsZlllYXJseScsIGxhYmVsOiAnSGFsZiB5ZWFybHknIH0sXG4gICAgeyB2YWx1ZTogJ3llYXJseScsIGxhYmVsOiAnWWVhcmx5JyB9XG4gIF07XG4gIHBheW1lbnRUZXJtT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAzMCwgbGFiZWw6ICczMCcgfSxcbiAgICB7IHZhbHVlOiA0NSwgbGFiZWw6ICc0NScgfSxcbiAgICB7IHZhbHVlOiA2MCwgbGFiZWw6ICc2MCcgfSxcbiAgICB7IHZhbHVlOiA5MCwgbGFiZWw6ICc5MCcgfVxuICBdO1xuICBiaWxsaW5nTWV0aG9kT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnZWFjaFN0b3JlJywgbGFiZWw6ICdTdG9yZSBXaXNlJyB9LFxuICAgIHsgdmFsdWU6ICdvdmVyYWxsU3RvcmUnLCBsYWJlbDogJ0JyYW5kIFdpc2UnIH1cbiAgXTtcbiAgQFZpZXdDaGlsZChOZ2JBY2NvcmRpb25EaXJlY3RpdmUpIGFjY29yZGlvbjogTmdiQWNjb3JkaW9uRGlyZWN0aXZlO1xuXG4gIGl0ZW1zUGVyUGFnZSA9IDEwO1xuICBjdXJyZW50UGFnZSA9IDE7XG4gIHRvdGFsSXRlbXMgPSAwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIHBhZ2VTaXplID0gMTA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsUmVmOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5nZXRCaWxsaW5nR3JvdXBzKCk7XG4gICAgdGhpcy5nZXRDbGllbnRQcm9kdWN0cygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnM6IHRydWUgfSk7XG5cbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICkuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHZhbDtcbiAgICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmJpbGxpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cHM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXRjaEZvcm1JdGVtKHsgLi4uZ3JvdXAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cElkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ19pZCcpPy52YWx1ZSA9PT0gdGhpcy5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRhYikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUodGhpcy5jdXJyZW50VGFiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZSgnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYXRjaEZvcm1JdGVtKHsgZ3JvdXBOYW1lLCBncm91cFRhZywgcmVnaXN0ZXJlZENvbXBhbnlOYW1lLCBnc3QsIGFkZHJlc3NMaW5lT25lLCBhZGRyZXNzTGluZVR3bywgY2l0eSwgc3RhdGUsIGNvdW50cnksXG4gICAgcGluQ29kZSwgcGxhY2VPZlN1cHBseSwgcG8sIHN0b3JlcywgcHJvUmF0YSwgcGF5bWVudENhdGVnb3J5LCBjdXJyZW5jeSwgdGF4Q2FsY3VsYXRpb25UeXBlLCBpc0luc3RhbGxhdGlvbk9uZVRpbWUsIGluc3RhbGxhdGlvbkZlZSwgcGF5bWVudEN5Y2xlLFxuICAgIHBheW1lbnRUZXJtLCBnZW5lcmF0ZUludm9pY2VUbywgYXR0YWNoQW5uZXh1cmUsIGlzUHJpbWFyeSwgYWR2YW5jZUludm9pY2UsIGFkdmFuY2VQZXJpb2QsIHByb2R1Y3RzLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyb3VwTmFtZTogW2dyb3VwTmFtZSB8fCAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdyb3VwVGFnOiBbZ3JvdXBUYWcgfHwgJ3N0b3JlJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHJlZ2lzdGVyZWRDb21wYW55TmFtZTogWyhyZWdpc3RlcmVkQ29tcGFueU5hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCksIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBnc3Q6IFtnc3QgfHwgJyddLFxuICAgICAgYWRkcmVzc0xpbmVPbmU6IFthZGRyZXNzTGluZU9uZSB8fCAnJ10sXG4gICAgICBhZGRyZXNzTGluZVR3bzogW2FkZHJlc3NMaW5lVHdvIHx8ICcnXSxcbiAgICAgIGNpdHk6IFtjaXR5IHx8ICcnXSxcbiAgICAgIHN0YXRlOiBbc3RhdGUgfHwgJyddLFxuICAgICAgY291bnRyeTogW2NvdW50cnkgfHwgJyddLFxuICAgICAgcGluQ29kZTogW3BpbkNvZGUgfHwgJyddLFxuICAgICAgcGxhY2VPZlN1cHBseTogW3BsYWNlT2ZTdXBwbHkgfHwgJyddLFxuICAgICAgcG86IFtwbyB8fCAnJ10sXG4gICAgICBzdG9yZXM6IFtzdG9yZXMgfHwgW11dLFxuICAgICAgLy8gUHJpY2luZyBtZXRob2Q6ICdwcm9yYXRlJyAoYWN0dWFsIHdvcmtpbmcgZGF5cykgb3IgJ2ZsYXQnIChmdWxsXG4gICAgICAvLyBtb250aCkuIERlZmF1bHQgdG8gJ3Byb3JhdGUnIGZvciByZWNvcmRzIHdpdGhvdXQgYSB2YWx1ZS5cbiAgICAgIHByb1JhdGE6IFtwcm9SYXRhID09PSAnZmxhdCcgPyAnZmxhdCcgOiAncHJvcmF0ZSddLFxuICAgICAgcGF5bWVudENhdGVnb3J5OiBbcGF5bWVudENhdGVnb3J5IHx8ICdwb3N0J10sXG4gICAgICBjdXJyZW5jeTogW2N1cnJlbmN5IHx8ICdkb2xsYXInXSxcbiAgICAgIC8vIERlZmF1bHQgdG8gJ2RvbWVzdGljJyBzbyBleGlzdGluZyByZWNvcmRzICh3aGljaCB3b24ndCBoYXZlIHRoaXNcbiAgICAgIC8vIGZpZWxkKSBiZWhhdmUgZXhhY3RseSBhcyB0b2RheSDigJQgR1NUL0lHU1Qgc3RpbGwgYXBwbGllZCBmb3IgSU5SLlxuICAgICAgdGF4Q2FsY3VsYXRpb25UeXBlOiBbdGF4Q2FsY3VsYXRpb25UeXBlIHx8ICdkb21lc3RpYyddLFxuICAgICAgaXNJbnN0YWxsYXRpb25PbmVUaW1lOiBbaXNJbnN0YWxsYXRpb25PbmVUaW1lIHx8IGZhbHNlXSxcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6IGluc3RhbGxhdGlvbkZlZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXG4gICAgICBwYXltZW50Q3ljbGU6IFtwYXltZW50Q3ljbGUgfHwgJ21vbnRobHknXSxcbiAgICAgIHBheW1lbnRUZXJtOiBbcGF5bWVudFRlcm0gfHwgMzBdLFxuICAgICAgZ2VuZXJhdGVJbnZvaWNlVG86IFtnZW5lcmF0ZUludm9pY2VUbyB8fCBbXV0sXG4gICAgICBhdHRhY2hBbm5leHVyZTogW2F0dGFjaEFubmV4dXJlIHx8IGZhbHNlXSxcbiAgICAgIGlzUHJpbWFyeTogW2lzUHJpbWFyeSB8fCBmYWxzZV0sXG4gICAgICBhZHZhbmNlSW52b2ljZTogW2FkdmFuY2VJbnZvaWNlIHx8IGZhbHNlXSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IFthZHZhbmNlUGVyaW9kIHx8ICdtb250aGx5J10sXG4gICAgICBwcm9kdWN0czogW3Byb2R1Y3RzIHx8IFtdXSxcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIF9pZDogW19pZF1cbiAgICB9KTtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKTtcbiAgfVxuXG4gIGFkZEZvcm1JdGVtKHsgaXNQcmltYXJ5LCBncm91cE5hbWUgfTogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZz4pIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBncm91cFRhZzogWydzdG9yZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICByZWdpc3RlcmVkQ29tcGFueU5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdzdDogWycnXSxcbiAgICAgIGFkZHJlc3NMaW5lT25lOiBbJyddLFxuICAgICAgYWRkcmVzc0xpbmVUd286IFsnJ10sXG4gICAgICBjaXR5OiBbJyddLFxuICAgICAgc3RhdGU6IFsnJ10sXG4gICAgICBjb3VudHJ5OiBbJyddLFxuICAgICAgcGluQ29kZTogWycnXSxcbiAgICAgIHBsYWNlT2ZTdXBwbHk6IFsnJ10sXG4gICAgICBwbzogWycnXSxcbiAgICAgIHN0b3JlczogW1tdXSxcbiAgICAgIC8vIE5ldyByZWNvcmRzIGFsd2F5cyBzdGFydCB3aXRoICdwcm9yYXRlJzsgZmxhdCBpcyBvcHQtaW4uXG4gICAgICBwcm9SYXRhOiBbJ3Byb3JhdGUnXSxcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogWydwb3N0J10sXG4gICAgICBjdXJyZW5jeTogWydkb2xsYXInXSxcbiAgICAgIC8vIERlZmF1bHQgJ2RvbWVzdGljJyBzbyB0aGUgZXhpc3RpbmcgR1NUL0lHU1QgbG9naWMgc3RpbGwgYXBwbGllc1xuICAgICAgLy8gdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgc3dpdGNoZXMgdG8gaW50ZXJuYXRpb25hbC5cbiAgICAgIHRheENhbGN1bGF0aW9uVHlwZTogWydkb21lc3RpYyddLFxuICAgICAgaXNJbnN0YWxsYXRpb25PbmVUaW1lOiBbZmFsc2VdLFxuICAgICAgaW5zdGFsbGF0aW9uRmVlOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH1dLFxuICAgICAgcGF5bWVudEN5Y2xlOiBbJ21vbnRobHknXSxcbiAgICAgIHBheW1lbnRUZXJtOiBbMzBdLFxuICAgICAgZ2VuZXJhdGVJbnZvaWNlVG86IFtbXV0sXG4gICAgICBhdHRhY2hBbm5leHVyZTogW2ZhbHNlXSxcbiAgICAgIGlzUHJpbWFyeTogW2lzUHJpbWFyeV0sXG4gICAgICBhZHZhbmNlSW52b2ljZTogW2ZhbHNlXSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IFsnbW9udGhseSddLFxuICAgICAgcHJvZHVjdHM6IFtbXV0sXG4gICAgICBjdXJyZW50VGFiOiBbJ2Jhc2ljLWluZm8nXSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF1cbiAgICB9KTtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShgJHt0aGlzLmJpbGxpbmdHcm91cHMubGVuZ3RoIC0gMX1gKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldCBiaWxsaW5nR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLmJpbGxpbmdGb3JtLmdldCgnZ3JvdXBzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgLy8gU3RhcnQgbW9udGggdGhlIGFkdmFuY2UgaW52b2ljZSB3aWxsIGNvdmVyIOKAlCB0aGUgZmlyc3QgZGF5IG9mIG5leHQgbW9udGgsXG4gIC8vIG1hdGNoaW5nIHRoZSBiYWNrZW5kIChkYXlqcygpLmFkZCgxLCdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykpLlxuICBnZXQgYWR2YW5jZUludm9pY2VEYXRlKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1HQicsIHsgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICAvLyBIdW1hbiBsYWJlbCBmb3IgdGhlIHBlcmlvZCBhIGNob3NlbiBhZHZhbmNlIGZyZXF1ZW5jeSBjb3ZlcnMsIHNob3duIG5leHRcbiAgLy8gdG8gdGhlIGRyb3Bkb3duIChlLmcuIFwiSnVsIDIwMjYg4oCTIERlYyAyMDI2XCIgZm9yIGhhbGYteWVhcmx5KS5cbiAgYWR2YW5jZUludm9pY2VSYW5nZShwZXJpb2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhzID0gdGhpcy5hZHZhbmNlUGVyaW9kT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gcGVyaW9kKT8ubW9udGhzIHx8IDE7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgIGNvbnN0IGZtdCA9IChkOiBEYXRlKSA9PiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgaWYgKG1vbnRocyA8PSAxKSByZXR1cm4gZm10KHN0YXJ0KTtcbiAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCkgKyBtb250aHMsIDEpO1xuICAgIHJldHVybiBgJHtmbXQoc3RhcnQpfSDigJMgJHtmbXQoZW5kKX1gO1xuICB9XG5cbiAgb25UYWJDaGFuZ2UoaWR4OiBudW1iZXIsIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKHZhbCk7XG4gIH1cblxuICBvbkRlbGV0ZUdyb3VwKGlkeDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUJpbGxpbmdHcm91cCh0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ19pZCcpPy52YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLnJlbW92ZUF0KGlkeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLnJlbW92ZUF0KGlkeCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnMgfTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pIHtcbiAgICB0aGlzLnN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBzb3J0Q29sdW1uOiB0aGlzLnNvcnRlZENvbHVtbixcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMuc2VhcmNoVGVybSxcbiAgICAgIGNvdW50cnk6IHRoaXMuZmlsdGVyQ291bnRyaWVzLFxuICAgICAgc3RhdGU6IHRoaXMuZmlsdGVyU3RhdGVzLFxuICAgICAgY2l0eTogdGhpcy5maWx0ZXJDaXRpZXMsXG4gICAgICBnZXRGaWx0ZXJzOiBnZXRGaWx0ZXJzXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKGRhdGFba2V5XSA9PT0gdW5kZWZpbmVkIHx8IGRhdGFba2V5XSA9PT0gJycpIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgJiYgIWRhdGFba2V5XS5sZW5ndGgpIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRTdWJzY3JpYmVkU3RvcmVzKGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlLm5leHQoJ2xvYWRlZCcpO1xuICAgICAgICBpZiAoZ2V0RmlsdGVycykge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGE/LmNvdW50cmllcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGEucHVzaCh7IERlc2NyaXB0aW9uOiAnQ291bnRyeScsIElzc3VlczogcmVzLmRhdGEuY291bnRyaWVzLm1hcCgodmFsOiBhbnkpID0+ICh7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0pKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uc3RhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdTdGF0ZScsIElzc3VlczogcmVzLmRhdGEuc3RhdGVzLm1hcCgodmFsOiBhbnkpID0+ICh7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0pKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY2l0aWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDaXR5JywgSXNzdWVzOiByZXMuZGF0YS5jaXRpZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXM/LmRhdGE/LnBhZ2VJbmZvPy5jb3VudCB8fCAwO1xuICAgICAgICB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblN0b3JlQ2hlY2soZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoc3RvcmVJZCkpIHtcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKGl0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBzdG9yZUlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgc3RvcmVJZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gc3RvcmVJZClcbiAgICAgICk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5pdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLCBzdG9yZUlkXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzdWJzY3JpYmVkU3RvcmVJZHMgPSB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QubWFwKGl0ZW0gPT4gaXRlbS5zdG9yZUlkKTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZS5mb3JFYWNoKChzdG9yZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZWRTdG9yZUlkcy5pbmNsdWRlcyhzdG9yZSkpIHtcbiAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBzdG9yZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUlkc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigoaXRlbTogYW55KSA9PiAhc3Vic2NyaWJlZFN0b3JlSWRzLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLml0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUlkc10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1N0b3JlU2VsZWN0ZWRJbkdyb3VwKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHN0b3JlSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKHN0b3JlSWQpO1xuICB9XG5cbiAgaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QuZXZlcnkoaXRlbSA9PiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKGl0ZW0uc3RvcmVJZCkpICYmIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5sZW5ndGg7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudDtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnQ7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcbiAgICB2YXIgayA9IGV2ZW50LmNoYXJDb2RlO1xuICAgIHJldHVybiAoayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1NykpO1xuICB9XG5cbiAgZm9yY2VVcHBlcmNhc2UoZXZlbnQ6IGFueSwgaWR4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHVwcGVyID0gaW5wdXQudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaW5wdXQudmFsdWUgIT09IHVwcGVyKSB7XG4gICAgICBjb25zdCBjYXJldCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgaW5wdXQudmFsdWUgPSB1cHBlcjtcbiAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnNldFZhbHVlKHVwcGVyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIGV2ZW50LmZvckVhY2goKHZhbDogYW55KSA9PiB7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ291bnRyeScpIHRoaXMuZmlsdGVyQ291bnRyaWVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnU3RhdGUnKSB0aGlzLmZpbHRlclN0YXRlcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpO1xuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ0NpdHknKSB0aGlzLmZpbHRlckNpdGllcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpO1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBvbkVtYWlsS2V5RG93bihldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0JhY2tzcGFjZScgJiYgZXZlbnQudGFyZ2V0LnZhbHVlID09ICcnKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5zbGljZSgwLCAtMSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChldmVudC5jb2RlID09ICdFbnRlcicpIHtcbiAgICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC87XG4gICAgICBpZiAoZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKFxuICAgICAgICAgIFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUsIGV2ZW50LnRhcmdldC52YWx1ZV1cbiAgICAgICAgKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRW1haWxDaGlwKGVtYWlsOiBzdHJpbmcsIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBlbWFpbClcbiAgICApO1xuICB9XG5cbiAgb25Tb3J0KGNvbHVtbjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbiA9PT0gMSA/IC0xIDogMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBjb2x1bW47XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAxO1xuICAgIH1cbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgbmF2aWdhdGUoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3N0b3JlLXNlbGVjdGlvbicpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3NldHRpbmdzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQmlsbGluZ0dyb3VwKCkge1xuICAgIHRoaXMuYWRkRm9ybUl0ZW0oeyBncm91cE5hbWU6IGBHcm91cCAke3RoaXMuYmlsbGluZ0dyb3Vwcy5sZW5ndGggKyAxfWAsIGlzUHJpbWFyeTogZmFsc2UgfSk7XG4gIH1cblxuICBvblN1Ym1pdChmb3JtVmFsdWVzOiBhbnksIGlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnYmFzaWMtaW5mbycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBhZGQgYXQgbGVhc3Qgb25lIGVtYWlsIGluIEdlbmVyYXRlIEludm9pY2UgVG8nKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWxldGUgZm9ybVZhbHVlcy5jdXJyZW50VGFiO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVZhbHVlcykge1xuICAgICAgaWYgKGZvcm1WYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoZm9ybVZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIGRlbGV0ZSBmb3JtVmFsdWVzW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvcm1WYWx1ZXMuX2lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUJpbGxpbmdHcm91cChmb3JtVmFsdWVzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyLmVycm9yPy5jb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHVwZGF0ZSBiaWxsaW5nIGdyb3VwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5jcmVhdGVCaWxsaW5nR3JvdXAoZm9ybVZhbHVlcykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFJlZi5jbG9zZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0UHJpbWFyeVRvYXN0KCdCaWxsaW5nIGdyb3VwIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGVyci5lcnJvcj8uY29kZSA9PT0gNDAwKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBjcmVhdGUgYmlsbGluZyBncm91cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xpZW50UHJvZHVjdHMoKSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRDbGllbnRQcm9kdWN0cyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5wbGFuRGV0YWlscz8ucHJvZHVjdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVkUHJvZHVjdHMgPSByZXMuZGF0YS5wbGFuRGV0YWlscy5wcm9kdWN0LmZpbHRlcigocDogYW55KSA9PiBwLnN0YXR1cyA9PT0gJ2xpdmUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DYW5jZWwoaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHJldmVudEVudGVyKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgZ2V0UHJvZHVjdEJpbGxpbmdNZXRob2QoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8udmFsdWUgfHwgW107XG4gICAgY29uc3QgZm91bmQgPSBwcm9kdWN0cy5maW5kKChwOiBhbnkpID0+IHAucHJvZHVjdE5hbWUgPT09IHByb2R1Y3ROYW1lKTtcbiAgICByZXR1cm4gZm91bmQ/LmJpbGxpbmdNZXRob2QgfHwgJ292ZXJhbGxTdG9yZSc7XG4gIH1cblxuICBvbkJpbGxpbmdNZXRob2RDaGFuZ2UoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZywgZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcHJvZHVjdHMuZmluZCgocDogYW55KSA9PiBwLnByb2R1Y3ROYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5iaWxsaW5nTWV0aG9kID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0cy5wdXNoKHsgcHJvZHVjdE5hbWUsIGJpbGxpbmdNZXRob2Q6IGV2ZW50LnRhcmdldC52YWx1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnNldFZhbHVlKFsuLi5wcm9kdWN0c10pO1xuICB9XG5cbiAgb25CaWxsaW5nTWV0aG9kU2VsZWN0Q2hhbmdlKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHByb2R1Y3ROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy52YWx1ZSB8fCBbXTtcbiAgICBjb25zdCBleGlzdGluZyA9IHByb2R1Y3RzLmZpbmQoKHA6IGFueSkgPT4gcC5wcm9kdWN0TmFtZSA9PT0gcHJvZHVjdE5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYmlsbGluZ01ldGhvZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0cy5wdXNoKHsgcHJvZHVjdE5hbWUsIGJpbGxpbmdNZXRob2Q6IHZhbHVlIH0pO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8uc2V0VmFsdWUoWy4uLnByb2R1Y3RzXSk7XG4gIH1cblxuICBmb3JtYXRQcm9kdWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMSAkMicpXG4gICAgICAucmVwbGFjZSgvXi4vLCAoc3RyKSA9PiBzdHIudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvLyBHU1RJTiBzdGF0ZS1jb2RlIHByZWZpeCDihpIgU3RhdGUgKFBsYWNlIG9mIFN1cHBseSlcbiAgcHJpdmF0ZSByZWFkb25seSBnc3RTdGF0ZUNvZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJzAxJzogJ0phbW11IGFuZCBLYXNobWlyJyxcbiAgICAnMDInOiAnSGltYWNoYWwgUHJhZGVzaCcsXG4gICAgJzAzJzogJ1B1bmphYicsXG4gICAgJzA0JzogJ0NoYW5kaWdhcmgnLFxuICAgICcwNSc6ICdVdHRhcmFraGFuZCcsXG4gICAgJzA2JzogJ0hhcnlhbmEnLFxuICAgICcwNyc6ICdEZWxoaScsXG4gICAgJzA4JzogJ1JhamFzdGhhbicsXG4gICAgJzA5JzogJ1V0dGFyIFByYWRlc2gnLFxuICAgICcxMCc6ICdCaWhhcicsXG4gICAgJzExJzogJ1Npa2tpbScsXG4gICAgJzEyJzogJ0FydW5hY2hhbCBQcmFkZXNoJyxcbiAgICAnMTMnOiAnTmFnYWxhbmQnLFxuICAgICcxNCc6ICdNYW5pcHVyJyxcbiAgICAnMTUnOiAnTWl6b3JhbScsXG4gICAgJzE2JzogJ1RyaXB1cmEnLFxuICAgICcxNyc6ICdNZWdoYWxheWEnLFxuICAgICcxOCc6ICdBc3NhbScsXG4gICAgJzE5JzogJ1dlc3QgQmVuZ2FsJyxcbiAgICAnMjAnOiAnSmhhcmtoYW5kJyxcbiAgICAnMjEnOiAnT2Rpc2hhJyxcbiAgICAnMjInOiAnQ2hoYXR0aXNnYXJoJyxcbiAgICAnMjMnOiAnTWFkaHlhIFByYWRlc2gnLFxuICAgICcyNCc6ICdHdWphcmF0JyxcbiAgICAnMjUnOiAnRGFtYW4gYW5kIERpdScsXG4gICAgJzI2JzogJ0RhZHJhIGFuZCBOYWdhciBIYXZlbGkgYW5kIERhbWFuIGFuZCBEaXUnLFxuICAgICcyNyc6ICdNYWhhcmFzaHRyYScsXG4gICAgJzI4JzogJ0FuZGhyYSBQcmFkZXNoIChPbGQpJyxcbiAgICAnMjknOiAnS2FybmF0YWthJyxcbiAgICAnMzAnOiAnR29hJyxcbiAgICAnMzEnOiAnTGFrc2hhZHdlZXAnLFxuICAgICczMic6ICdLZXJhbGEnLFxuICAgICczMyc6ICdUYW1pbCBOYWR1JyxcbiAgICAnMzQnOiAnUHVkdWNoZXJyeScsXG4gICAgJzM1JzogJ0FuZGFtYW4gYW5kIE5pY29iYXIgSXNsYW5kcycsXG4gICAgJzM2JzogJ1RlbGFuZ2FuYScsXG4gICAgJzM3JzogJ0FuZGhyYSBQcmFkZXNoJyxcbiAgICAnMzgnOiAnTGFkYWtoJyxcbiAgICAnOTcnOiAnT3RoZXIgVGVycml0b3J5JyxcbiAgICAnOTknOiAnQ2VudHJlIEp1cmlzZGljdGlvbidcbiAgfTtcblxuICBvbkdzdENoYW5nZShmb3JtQXJyYXlJbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3N0ID0gKHZhbHVlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBwbGFjZU9mU3VwcGx5Q3RybCA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk7XG4gICAgaWYgKGdzdC5sZW5ndGggPCAyKSB7XG4gICAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoJycpO1xuICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnaWRsZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSBnc3Quc3Vic3RyaW5nKDAsIDIpO1xuICAgIGNvbnN0IHN0YXRlTmFtZSA9IHRoaXMuZ3N0U3RhdGVDb2RlTWFwW2NvZGVdO1xuICAgIGlmIChzdGF0ZU5hbWUpIHtcbiAgICAgIHBsYWNlT2ZTdXBwbHlDdHJsPy5zZXRWYWx1ZShgJHtzdGF0ZU5hbWV9ICgke2NvZGV9KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoJycpO1xuICAgIH1cblxuICAgIC8vIEZ1bGwgR1NUSU4gaXMgMTUgY2hhcnMgKDE1LWNoYXIgYWxwaGFudW1lcmljKS4gVHJpZ2dlciB0aGUgYWRkcmVzc1xuICAgIC8vIGxvb2t1cCBvbmNlIHRoZSB1c2VyIGhhcyB0eXBlZCBhbGwgMTUuIFNraXAgaWYgd2UgYWxyZWFkeSBsb29rZWQgdGhpc1xuICAgIC8vIGV4YWN0IHZhbHVlIHVwIGZvciB0aGlzIHJvdyDigJQgb3RoZXJ3aXNlIHRoZSAoaW5wdXQpIGV2ZW50IHdvdWxkIHJlZmlyZVxuICAgIC8vIG9uIGZvY3VzL2JsdXIgYW5kIGNsb2JiZXIgYW55IG1hbnVhbCB0d2Vha3MgdGhlIHVzZXIgbWFkZS5cbiAgICBpZiAoZ3N0Lmxlbmd0aCA9PT0gMTUgJiYgdGhpcy5sYXN0TG9va2VkVXBHc3Rpbltmb3JtQXJyYXlJbmRleF0gIT09IGdzdCkge1xuICAgICAgdGhpcy5sb29rdXBBbmRGaWxsQWRkcmVzcyhmb3JtQXJyYXlJbmRleCwgZ3N0KTtcbiAgICB9IGVsc2UgaWYgKGdzdC5sZW5ndGggPCAxNSkge1xuICAgICAgLy8gUmVzZXQgc3RhdGUgc28gYSBwcmV2aW91cyBcImZvdW5kXCIgaW5kaWNhdG9yIGRvZXNuJ3Qgc3RpY2sgYXJvdW5kXG4gICAgICAvLyB3aGlsZSB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBudW1iZXIgdG8gYSBuZXcgdmFsdWUuXG4gICAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdpZGxlJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvb2t1cEFuZEZpbGxBZGRyZXNzKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIGdzdDogc3RyaW5nKSB7XG4gICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnbG9hZGluZyc7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5sb29rdXBHc3Rpbihnc3QpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vIEJhY2tlbmQgd3JhcDogeyBjb2RlLCBzdGF0dXMsIGRhdGE6IDxwYXlsb2FkPiB9LiBQYXlsb2FkIGl0c2VsZlxuICAgICAgICAvLyBtYXkgYWxzbyBiZSBuZXN0ZWQgdW5kZXIgYGRhdGFgIGlmIHRoZSByZXNwb25zZSBtaWRkbGV3YXJlIGRvdWJsZS1cbiAgICAgICAgLy8gd3JhcHMgaXQ7IGhhbmRsZSBib3RoIHNoYXBlcyB0byBiZSBzYWZlLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcmVzPy5kYXRhPy5kYXRhIHx8IHJlcz8uZGF0YSB8fCB7fTtcbiAgICAgICAgaWYgKCFwYXlsb2FkIHx8ICFwYXlsb2FkLmdzdGluKSB7XG4gICAgICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnbm90Zm91bmQnO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCk7XG4gICAgICAgIC8vIFBhdGNoIG9ubHkgdGhlIGFkZHJlc3MtcmVsYXRlZCBmaWVsZHMuIERvbid0IG92ZXJ3cml0ZSBncm91cE5hbWUsXG4gICAgICAgIC8vIGdyb3VwVGFnLCBzdG9yZXMsIGN1cnJlbmN5LCBwYXltZW50VGVybSDigJQgdGhvc2UgYXJlIHVzZXIgY2hvaWNlcyxcbiAgICAgICAgLy8gbm90IGRlcml2ZWQgZnJvbSBHU1RJTi5cbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgICAgaWYgKHBheWxvYWQubGVnYWxOYW1lKSBwYXRjaFsncmVnaXN0ZXJlZENvbXBhbnlOYW1lJ10gPSBTdHJpbmcocGF5bG9hZC5sZWdhbE5hbWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChwYXlsb2FkLmFkZHJlc3NMaW5lT25lKSBwYXRjaFsnYWRkcmVzc0xpbmVPbmUnXSA9IHBheWxvYWQuYWRkcmVzc0xpbmVPbmU7XG4gICAgICAgIGlmIChwYXlsb2FkLmFkZHJlc3NMaW5lVHdvKSBwYXRjaFsnYWRkcmVzc0xpbmVUd28nXSA9IHBheWxvYWQuYWRkcmVzc0xpbmVUd287XG4gICAgICAgIGlmIChwYXlsb2FkLmNpdHkpIHBhdGNoWydjaXR5J10gPSBwYXlsb2FkLmNpdHk7XG4gICAgICAgIGlmIChwYXlsb2FkLnN0YXRlKSBwYXRjaFsnc3RhdGUnXSA9IHBheWxvYWQuc3RhdGU7XG4gICAgICAgIGlmIChwYXlsb2FkLmNvdW50cnkpIHBhdGNoWydjb3VudHJ5J10gPSBwYXlsb2FkLmNvdW50cnk7XG4gICAgICAgIGlmIChwYXlsb2FkLnBpbkNvZGUpIHBhdGNoWydwaW5Db2RlJ10gPSBwYXlsb2FkLnBpbkNvZGU7XG4gICAgICAgIGlmIChwYXlsb2FkLnBsYWNlT2ZTdXBwbHkpIHBhdGNoWydwbGFjZU9mU3VwcGx5J10gPSBwYXlsb2FkLnBsYWNlT2ZTdXBwbHk7XG4gICAgICAgIGdyb3VwLnBhdGNoVmFsdWUocGF0Y2gpO1xuICAgICAgICB0aGlzLmxhc3RMb29rZWRVcEdzdGluW2Zvcm1BcnJheUluZGV4XSA9IGdzdDtcbiAgICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnZm91bmQnO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gNDA0ID0gdW5rbm93biBHU1RJTjsgZXZlcnl0aGluZyBlbHNlIHN1cmZhY2VzIGFzIGFuIGVycm9yIHNvIHRoZVxuICAgICAgICAvLyB1c2VyIGtub3dzIHRoZSBhdXRvLWZpbGwgZGlkbid0IGhhcHBlbiBhbmQgdGhleSBzaG91bGQgZW50ZXJcbiAgICAgICAgLy8gbWFudWFsbHkuXG4gICAgICAgIHRoaXMuZ3N0TG9va3VwU3RhdGVbZm9ybUFycmF5SW5kZXhdID0gZXJyPy5zdGF0dXMgPT09IDQwNCA/ICdub3Rmb3VuZCcgOiAnZXJyb3InO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItNVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgIFVwZGF0ZSBCaWxsaW5nIEluZm9ybWF0aW9uXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkQmlsbGluZ0dyb3VwKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIG5lZWRoZWxwXCI+PHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDEzIDQuMTY2MDJWMTUuODMyN000LjE2Nzk3IDkuOTk5MzVIMTUuODM0NlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+QWRkIEJpbGxpbmcgR3JvdXA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG48Zm9ybSBbZm9ybUdyb3VwXT1cImJpbGxpbmdGb3JtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5sZW5ndGggPiAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiIG5nYkFjY29yZGlvbiBhY2NvcmRpb249XCJOZ2JBY2NvcmRpb25cIlxyXG4gICAgICAgIFtjbG9zZU90aGVyc109XCJ0cnVlXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYmlsbGluZ0dyb3Vwcy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgW25nYkFjY29yZGlvbkl0ZW1dPVwiaS50b1N0cmluZygpXCIgY2xhc3M9XCJtYi01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1haW5oZWFkaW5nIHAtMFwiIG5nYkFjY29yZGlvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57e2dyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIGNsYXNzPVwicHJpbWFyeS1iYWRnZVwiPlByaW1hcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvbkRlbGV0ZUdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNC45OTkzNUg0LjE2NjY3TTQuMTY2NjcgNC45OTkzNUwxNy41IDQuOTk5MzVNNC4xNjY2NyA0Ljk5OTM1TDQuMTY2NjcgMTYuNjY2QzQuMTY2NjcgMTcuMTA4IDQuMzQyMjYgMTcuNTMyIDQuNjU0ODIgMTcuODQ0NUM0Ljk2NzM4IDE4LjE1NzEgNS4zOTEzMSAxOC4zMzI3IDUuODMzMzMgMTguMzMyN0gxNC4xNjY3QzE0LjYwODcgMTguMzMyNyAxNS4wMzI2IDE4LjE1NzEgMTUuMzQ1MiAxNy44NDQ1QzE1LjY1NzcgMTcuNTMyIDE1LjgzMzMgMTcuMTA4IDE1LjgzMzMgMTYuNjY2TDE1LjgzMzMgNC45OTkzNUw0LjE2NjY3IDQuOTk5MzVaTTYuNjY2NjcgNC45OTkzNVYzLjMzMjY4QzYuNjY2NjcgMi44OTA2NSA2Ljg0MjI2IDIuNDY2NzMgNy4xNTQ4MiAyLjE1NDE3QzcuNDY3MzggMS44NDE2MSA3Ljg5MTMxIDEuNjY2MDIgOC4zMzMzMyAxLjY2NjAyTDExLjY2NjcgMS42NjYwMkMxMi4xMDg3IDEuNjY2MDIgMTIuNTMyNiAxLjg0MTYxIDEyLjg0NTIgMi4xNTQxN0MxMy4xNTc3IDIuNDY2NzMgMTMuMzMzMyAyLjg5MDY1IDEzLjMzMzMgMy4zMzI2OFY0Ljk5OTM1TTguMzMzMzMgOS4xNjYwMkw4LjMzMzMzIDE0LjE2Nk0xMS42NjY3IDkuMTY2MDJWMTQuMTY2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5IGNsYXNzPVwicHMtMCBwZS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSA/ICdyb3ctY29scy0yJyA6ICcnXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYiByb3cgcm93LWNvbHMtMyAgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPkJhc2ljIEluZm88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzdG9yZS1zZWxlY3Rpb24nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+U3RvcmUgU2VsZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc2V0dGluZ3MnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TZXR0aW5nczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdyb3VwTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdyb3VwIE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBUYWdcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZ3JvdXBUYWdPcHRpb25zXCIgW2xhYmVsXT1cIidHcm91cCBUYWcqJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCB0YWcgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChpbnB1dCk9XCJmb3JjZVVwcGVyY2FzZSgkZXZlbnQsIGkpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgY29tcGFueSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdzdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdTVDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoaW5wdXQpPVwib25Hc3RDaGFuZ2UoaSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJnc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJnc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dzdCcpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3N0Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3N0Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dzdCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTVCBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEdTVElOIGFkZHJlc3MtbG9va3VwIGZlZWRiYWNrLiBTdGF0ZSBtYWNoaW5lIGRyaXZlbiBieSBsb29rdXBBbmRGaWxsQWRkcmVzcygpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImdzdC1sb29rdXAtbXNnIHRleHQtbXV0ZWRcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29raW5nIHVwIHJlZ2lzdGVyZWQgYWRkcmVzc+KAplxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImdzdC1sb29rdXAtbXNnIHRleHQtc3VjY2Vzc1wiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdmb3VuZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGFkZHJlc3MgYXV0by1maWxsZWQuIEVkaXQgaWYgbmVlZGVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImdzdC1sb29rdXAtbXNnIHRleHQtd2FybmluZ1wiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdub3Rmb3VuZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZWdpc3RlcmVkIGFkZHJlc3MgZm91bmQgZm9yIHRoaXMgR1NUSU4uIEVudGVyIG1hbnVhbGx5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImdzdC1sb29rdXAtbXNnIHRleHQtZGFuZ2VyXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2Vycm9yJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbG9va3VwIGZhaWxlZC4gRW50ZXIgbWFudWFsbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3N0b3JlLXNlbGVjdGlvbicgPyAnZC1ub25lJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMTBMMTEuNDMgMTAuNzNDMTIuNDEgOS41OSAxMyA4LjExIDEzIDYuNUMxMyAyLjkxIDEwLjA5IDAgNi41IDBDMi45MSAwIDAgMi45MSAwIDYuNUMwIDEwLjA5IDIuOTEgMTMgNi41IDEzQzguMTEgMTMgOS41OSAxMi40MSAxMC43MyAxMS40M0wxMC4yNzYyIDExLjcxTDE2IDE3LjQ5TDE3LjQ5IDE2TDExLjUgMTBaTTYuNSAxMUM0LjAxIDExIDIgOC45OSAyIDYuNUMyIDQuMDEgNC4wMSAyIDYuNSAyQzguOTkgMiAxMSA0LjAxIDExIDYuNUMxMSA4Ljk5IDguOTkgMTEgNi41IDExWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJibGFja1wiIGZpbGwtb3BhY2l0eT1cIjAuNTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyAqbmdJZj1cImZpbHRlckRhdGEubGVuZ3RoXCIgY2xhc3M9XCJtZS0yXCIgW2RhdGFPYmplY3RdPVwiZmlsdGVyRGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHN0b3JlLXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWRJbkdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxTdG9yZXMoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmUgTmFtZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVOYW1lJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdG9yZSBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZUlkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVJZCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3RzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpYmVkU3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZEluR3JvdXAoaSwgZGF0YT8uc3RvcmVJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN0b3JlQ2hlY2soJGV2ZW50LCBpLCBkYXRhPy5zdG9yZUlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhPy5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtaWRcIj5JRCA6IHt7ZGF0YT8uc3RvcmVJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgZGF0YT8ucHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJhZmZpYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+VHJhZmZpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlpvbmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmF4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5UcmF4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aFwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncHJvcmF0ZS0nICsgaVwiIHZhbHVlPVwicHJvcmF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBbZm9yXT1cIidwcm9yYXRlLScgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9yYXRlIOKAlCBiaWxsIGZvciBhY3R1YWwgd29ya2luZyBkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInByb1JhdGFcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2ZsYXQtJyArIGlcIiB2YWx1ZT1cImZsYXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgW2Zvcl09XCInZmxhdC0nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhdCDigJQgYmlsbCBmb3IgdGhlIHdob2xlIG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPkFkdmFuY2UgSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiBuZ2JUb29sdGlwPVwiQ3JlYXRlcyBhbiBpbnZvaWNlIGZvciB0aGUgbmV4dCBtb250aCBhdXRvbWF0aWNhbGx5IHVwb24gc2F2aW5nXCIgcGxhY2VtZW50PVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxM0MxMC4zMTM3IDEzIDEzIDEwLjMxMzcgMTMgN0MxMyAzLjY4NjI5IDEwLjMxMzcgMSA3IDFDMy42ODYyOSAxIDEgMy42ODYyOSAxIDdDMSAxMC4zMTM3IDMuNjg2MjkgMTMgNyAxM1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgOS40VjdNNyA0LjZINy4wMDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInYWR2YW5jZUludm9pY2VfJyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZUludm9pY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiJ2FkdmFuY2VJbnZvaWNlXycgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbiBhZHZhbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImJpbGxpbmdHcm91cHMuYXQoaSkuZ2V0KCdhZHZhbmNlSW52b2ljZScpPy52YWx1ZVwiIGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIGZ3LXNlbWlib2xkXCI+QWR2YW5jZSBmcmVxdWVuY3k8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlUGVyaW9kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHQgb2YgYWR2YW5jZVBlcmlvZE9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+e3sgb3B0LmxhYmVsIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZhbmNlIGludm9pY2Ugd2lsbCBjb3ZlciB7eyBhZHZhbmNlSW52b2ljZVJhbmdlKGJpbGxpbmdHcm91cHMuYXQoaSkuZ2V0KCdhZHZhbmNlUGVyaW9kJyk/LnZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtYi01XCIgKm5nSWY9XCJzdWJzY3JpYmVkUHJvZHVjdHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1iLTNcIj5Qcm9kdWN0IEJpbGxpbmcgTWV0aG9kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZTogbm8gLnRhYmxlLXJlc3BvbnNpdmUgd3JhcHBlciBoZXJlLiBJdHMgb3ZlcmZsb3cteDphdXRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBzIHRoZSBCaWxsaW5nIE1ldGhvZCBkcm9wZG93biBvcHRpb25zIHBhbmVsLiBUaGUgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBoYXMgdHdvIGNvbHVtbnMsIHNvIGhvcml6b250YWwgc2Nyb2xsIGlzbid0IG5lZWRlZC4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbSBib3R0b20tYm9yZGVyIGJpbGxpbmctbWV0aG9kLXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBNZXRob2Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHByb2Qgb2Ygc3Vic2NyaWJlZFByb2R1Y3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUocHJvZC5wcm9kdWN0TmFtZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFByb2R1Y3RCaWxsaW5nTWV0aG9kKGksIHByb2QucHJvZHVjdE5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShpLCBwcm9kLnByb2R1Y3ROYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImJpbGxpbmdNZXRob2RPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiY3VycmVuY3lPcHRpb25zXCIgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInRheENhbGN1bGF0aW9uVHlwZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJ0YXhDYWxjdWxhdGlvblR5cGVPcHRpb25zXCIgW2xhYmVsXT1cIidUYXggQ2FsY3VsYXRpb24nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50Q3ljbGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicGF5bWVudEN5Y2xlT3B0aW9uc1wiIFtsYWJlbF09XCInUGF5bWVudCBDeWNsZSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRUZXJtXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRUZXJtT3B0aW9uc1wiIFtsYWJlbF09XCInUGF5bWVudCBUZXJtJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidlbWFpbCcgKyBpXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R2VuZXJhdGUgSW52b2ljZSBUbyogPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm91dGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtM1wiPnt7IGVtYWlsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVtYWlsVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1pbnBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgIWdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2ljZSBlbWFpbCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJ5ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwibm9cIiBbdmFsdWVdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJub1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1lbmQgbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsKGkpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDBcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgfHwgZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5sZW5ndGggPT09IDFcIiBmb3JtQXJyYXlOYW1lPVwiZ3JvdXBzXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYmlsbGluZ0dyb3Vwcy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiIHJvdyByb3ctY29scy0yIGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnYmFzaWMtaW5mbycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nID8gJ3NlbGVjdGVkJyA6ICcnXCIgY2xhc3M9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzZXR0aW5ncycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJyA/ICdzZWxlY3RlZCcgOiAnJ1wiIGNsYXNzPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnYmFzaWMtaW5mbycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJlZ2lzdGVyZWQgQ29tcGFueSBOYW1lKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChpbnB1dCk9XCJmb3JjZVVwcGVyY2FzZSgkZXZlbnQsIGkpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgY29tcGFueSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3N0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R1NUPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cIm9uR3N0Q2hhbmdlKGksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dzdCcpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3N0Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgY29tcGFueSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJnc3QtbG9va3VwLW1zZyB0ZXh0LW11dGVkXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2xvYWRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29raW5nIHVwIHJlZ2lzdGVyZWQgYWRkcmVzc+KAplxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJnc3QtbG9va3VwLW1zZyB0ZXh0LXN1Y2Nlc3NcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnZm91bmQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGFkZHJlc3MgYXV0by1maWxsZWQuIEVkaXQgaWYgbmVlZGVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJnc3QtbG9va3VwLW1zZyB0ZXh0LXdhcm5pbmdcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnbm90Zm91bmQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZWdpc3RlcmVkIGFkZHJlc3MgZm91bmQgZm9yIHRoaXMgR1NUSU4uIEVudGVyIG1hbnVhbGx5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJnc3QtbG9va3VwLW1zZyB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdlcnJvcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbG9va3VwIGZhaWxlZC4gRW50ZXIgbWFudWFsbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZU9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAxPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVUd29cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY2l0eScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpdHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdzdGF0ZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY291bnRyeVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY291bnRyeScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NvdW50cnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGluQ29kZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwbGFjZU9mU3VwcGx5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGxhY2Ugb2YgU3VwcGx5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGxhY2VPZlN1cHBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZSBvZiBzdXBwbHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwb1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBPPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1cmNoYXNlIG9yZGVyIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlByaWNpbmcgTWV0aG9kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInByb1JhdGFcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncHJvcmF0ZS1lZGl0LScgKyBpXCIgdmFsdWU9XCJwcm9yYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgW2Zvcl09XCIncHJvcmF0ZS1lZGl0LScgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3JhdGUg4oCUIGJpbGwgZm9yIGFjdHVhbCB3b3JraW5nIGRheXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2ZsYXQtZWRpdC0nICsgaVwiIHZhbHVlPVwiZmxhdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIFtmb3JdPVwiJ2ZsYXQtZWRpdC0nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGF0IOKAlCBiaWxsIGZvciB0aGUgd2hvbGUgbW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgbmdiVG9vbHRpcD1cIkNyZWF0ZXMgYW4gaW52b2ljZSBmb3IgdGhlIG5leHQgbW9udGggYXV0b21hdGljYWxseSB1cG9uIHNhdmluZ1wiIHBsYWNlbWVudD1cInRvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDkuNFY3TTcgNC42SDcuMDA2XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2FkdmFuY2VJbnZvaWNlU2luZ2xlXycgKyBpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZUludm9pY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VTaW5nbGVfJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgaW4gYWR2YW5jZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmF0KGkpLmdldCgnYWR2YW5jZUludm9pY2UnKT8udmFsdWVcIiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIGZ3LXNlbWlib2xkXCI+QWR2YW5jZSBmcmVxdWVuY3k8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VQZXJpb2RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGFkdmFuY2VQZXJpb2RPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdC52YWx1ZVwiPnt7IG9wdC5sYWJlbCB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2YW5jZSBpbnZvaWNlIHdpbGwgY292ZXIge3sgYWR2YW5jZUludm9pY2VSYW5nZShiaWxsaW5nR3JvdXBzLmF0KGkpLmdldCgnYWR2YW5jZVBlcmlvZCcpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG1iLTVcIiAqbmdJZj1cInN1YnNjcmliZWRQcm9kdWN0cy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtYi0zXCI+UHJvZHVjdCBCaWxsaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbSBib3R0b20tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBNZXRob2Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHByb2Qgb2Ygc3Vic2NyaWJlZFByb2R1Y3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUocHJvZC5wcm9kdWN0TmFtZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFByb2R1Y3RCaWxsaW5nTWV0aG9kKGksIHByb2QucHJvZHVjdE5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShpLCBwcm9kLnByb2R1Y3ROYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImJpbGxpbmdNZXRob2RPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImN1cnJlbmN5T3B0aW9uc1wiIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0YXhDYWxjdWxhdGlvblR5cGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwidGF4Q2FsY3VsYXRpb25UeXBlT3B0aW9uc1wiIFtsYWJlbF09XCInVGF4IENhbGN1bGF0aW9uJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRDeWNsZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50VGVybU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgVGVybSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
716
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBMEIsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVNuRixNQUFNLE9BQU8seUJBQXlCO0lBcUYxQjtJQUNBO0lBQ0Q7SUFDQztJQXRGRCxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUM1QixXQUFXLENBQVk7SUFDdkIsU0FBUyxDQUFVO0lBQ25CLFVBQVUsR0FBMEIsRUFBRSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyw2RUFBNkU7SUFDN0Usd0RBQXdEO0lBQ3hELGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsZUFBZSxHQUFVLEVBQUUsQ0FBQztJQUM1QixZ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RTtnQkFDbEIsbUVBQW1FO2dCQUNuRSwrREFBK0Q7Z0JBQy9ELFlBQVk7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkYsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBanRCVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qix5TEE0RXpCLHFCQUFxQixnREN4RmxDLG90MURBK3lCTTs7NEZEbnlCTyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCO3FLQU16QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQXdFNEIsU0FBUztzQkFBMUMsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nYkFjY29yZGlvbkRpcmVjdGl2ZSwgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXAtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBncm91cElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRUYWI6IHN0cmluZztcbiAgYmlsbGluZ0Zvcm06IEZvcm1Hcm91cDtcbiAgc3VibWl0dGVkOiBib29sZWFuO1xuICBmaWx0ZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gPSBbXTtcbiAgc3Vic2NyaWJlZFN0b3JlTGlzdDogYW55W10gPSBbXTtcbiAgLy8gR3JvdXAgY3VycmVudGx5IGJlaW5nIGVkaXRlZCDigJQgY2FwdHVyZWQgYmVmb3JlIHRoaXMuZ3JvdXBJZCBpcyBjbGVhcmVkLCBzb1xuICAvLyBzZWxlY3RlZC1maXJzdCBvcmRlcmluZyBjYW4gcmVhZCBpdHMgc2VsZWN0ZWQgc3RvcmVzLlxuICBlZGl0aW5nR3JvdXBJZDogc3RyaW5nID0gJyc7XG4gIGZpbHRlckNvdW50cmllczogYW55W10gPSBbXTtcbiAgZmlsdGVyU3RhdGVzOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJDaXRpZXM6IGFueVtdID0gW107XG4gIHNlYXJjaElucHV0ID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgc2VhcmNoVGVybTogc3RyaW5nO1xuICBzb3J0ZWRDb2x1bW46IHN0cmluZztcbiAgc29ydERpcmVjdGlvbjogbnVtYmVyO1xuICBzdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCdpbml0aWFsJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnPignaW5pdGlhbCcpO1xuICBzdWJzY3JpYmVkUHJvZHVjdHM6IGFueVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8vIEdTVElOIGxvb2t1cCBzdGF0ZSBwZXIgYmlsbGluZy1ncm91cCByb3csIGtleWVkIGJ5IEZvcm1BcnJheSBpbmRleC5cbiAgLy8gJ2lkbGUnID0gbm8gbG9va3VwIHlldCAob3IgR1NUSU4gdG9vIHNob3J0IHRvIHRyaWdnZXIgb25lKS5cbiAgLy8gJ2xvYWRpbmcnID0gcmVxdWVzdCBpbiBmbGlnaHQuXG4gIC8vICdmb3VuZCcgPSBiYWNrZW5kIHJldHVybmVkIGFuIGFkZHJlc3MsIGZpZWxkcyBhdXRvLWZpbGxlZC5cbiAgLy8gJ25vdGZvdW5kJyA9IGJhY2tlbmQgcmV0dXJuZWQgNDA0IC8gdW5rbm93biBHU1RJTi5cbiAgLy8gJ2Vycm9yJyA9IG5ldHdvcmsgb3IgdW5leHBlY3RlZCBlcnJvci5cbiAgZ3N0TG9va3VwU3RhdGU6IFJlY29yZDxudW1iZXIsICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdmb3VuZCcgfCAnbm90Zm91bmQnIHwgJ2Vycm9yJz4gPSB7fTtcbiAgLy8gVHJhY2sgdGhlIGxhc3QgR1NUSU4gd2Ugc3VjY2Vzc2Z1bGx5IGxvb2tlZCB1cCBwZXIgcm93IHNvIHJlLXR5cGluZyB0aGVcbiAgLy8gc2FtZSB2YWx1ZSBkb2Vzbid0IHJlZmlyZSB0aGUgcmVxdWVzdCAoYW5kIGF2b2lkIGNsb2JiZXJpbmcgbWFudWFsIGVkaXRzXG4gIC8vIHRoZSB1c2VyIG1heSBoYXZlIG1hZGUgYWZ0ZXIgdGhlIGF1dG8tZmlsbCkuXG4gIHByaXZhdGUgbGFzdExvb2tlZFVwR3N0aW46IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7fTtcblxuICBncm91cFRhZ09wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZScgfSxcbiAgICB7IHZhbHVlOiAnZ3N0JywgbGFiZWw6ICdHU1QnIH1cbiAgXTtcbiAgY3VycmVuY3lPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdkb2xsYXInLCBsYWJlbDogJ0RvbGxhciAoJCknIH0sXG4gICAgeyB2YWx1ZTogJ2lucicsIGxhYmVsOiAnSU5SICjigrkpJyB9LFxuICAgIHsgdmFsdWU6ICdzaW5nYXBvcmVkb2xsYXInLCBsYWJlbDogJ1NpbmdhcG9yZSBEb2xsYXIgKFMkKScgfSxcbiAgICB7IHZhbHVlOiAnZXVybycsIGxhYmVsOiAnRXVybyAo4oKsKScgfSxcbiAgICB7IHZhbHVlOiAnYWVkJywgbGFiZWw6ICdBRUQgKEFFRCknIH0sXG4gIF07XG4gIC8vIEFkdmFuY2UtaW52b2ljZSBob3Jpem9uOiBob3cgZmFyIGFoZWFkIHRoZSBhZHZhbmNlIGludm9pY2UgaXMgZ2VuZXJhdGVkLlxuICBhZHZhbmNlUGVyaW9kT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnbW9udGhseScsIGxhYmVsOiAnTW9udGhseSAobmV4dCBtb250aCknLCBtb250aHM6IDEgfSxcbiAgICB7IHZhbHVlOiAncXVhcnRlcmx5JywgbGFiZWw6ICdRdWFydGVybHkgKG5leHQgMyBtb250aHMpJywgbW9udGhzOiAzIH0sXG4gICAgeyB2YWx1ZTogJ2hhbGZ5ZWFybHknLCBsYWJlbDogJ0hhbGYteWVhcmx5IChuZXh0IDYgbW9udGhzKScsIG1vbnRoczogNiB9LFxuICAgIHsgdmFsdWU6ICd5ZWFybHknLCBsYWJlbDogJ1llYXJseSAobmV4dCAxMiBtb250aHMpJywgbW9udGhzOiAxMiB9LFxuICBdO1xuICAvLyBEcml2ZXMgd2hldGhlciB0aGUgYmFja2VuZCB3aWxsIGNhbGN1bGF0ZSBHU1QvSUdTVCBvbiBpbnZvaWNlcyBmb3IgdGhpc1xuICAvLyBncm91cC4gJ2ludGVybmF0aW9uYWwnIHNraXBzIHRheGVzIGVudGlyZWx5IHNvIHRoZSB0b3RhbEFtb3VudCBlcXVhbHNcbiAgLy8gdGhlIHN1YnRvdGFsLiBTZWUgZ3N0aW5Mb29rdXAg4oaSIGludm9pY2VDb250cm9sbGVyLmNyZWF0ZUludm9pY2UuXG4gIHRheENhbGN1bGF0aW9uVHlwZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ2RvbWVzdGljJywgbGFiZWw6ICdEb21lc3RpYycgfSxcbiAgICB7IHZhbHVlOiAnaW50ZXJuYXRpb25hbCcsIGxhYmVsOiAnSW50ZXJuYXRpb25hbCcgfSxcbiAgXTtcbiAgcGF5bWVudEN5Y2xlT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnbW9udGhseScsIGxhYmVsOiAnTW9udGhseScgfSxcbiAgICB7IHZhbHVlOiAncXVhcnRlcicsIGxhYmVsOiAnUXVhcnRlcmx5JyB9LFxuICAgIHsgdmFsdWU6ICdoYWxmWWVhcmx5JywgbGFiZWw6ICdIYWxmIHllYXJseScgfSxcbiAgICB7IHZhbHVlOiAneWVhcmx5JywgbGFiZWw6ICdZZWFybHknIH1cbiAgXTtcbiAgcGF5bWVudFRlcm1PcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IDMwLCBsYWJlbDogJzMwJyB9LFxuICAgIHsgdmFsdWU6IDQ1LCBsYWJlbDogJzQ1JyB9LFxuICAgIHsgdmFsdWU6IDYwLCBsYWJlbDogJzYwJyB9LFxuICAgIHsgdmFsdWU6IDkwLCBsYWJlbDogJzkwJyB9XG4gIF07XG4gIGJpbGxpbmdNZXRob2RPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdlYWNoU3RvcmUnLCBsYWJlbDogJ1N0b3JlIFdpc2UnIH0sXG4gICAgeyB2YWx1ZTogJ292ZXJhbGxTdG9yZScsIGxhYmVsOiAnQnJhbmQgV2lzZScgfVxuICBdO1xuICBAVmlld0NoaWxkKE5nYkFjY29yZGlvbkRpcmVjdGl2ZSkgYWNjb3JkaW9uOiBOZ2JBY2NvcmRpb25EaXJlY3RpdmU7XG5cbiAgaXRlbXNQZXJQYWdlID0gMTA7XG4gIGN1cnJlbnRQYWdlID0gMTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgcGFnZVNpemUgPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwdWJsaWMgbW9kYWxSZWY6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdldEJpbGxpbmdHcm91cHMoKTtcbiAgICB0aGlzLmdldENsaWVudFByb2R1Y3RzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbCBzdG9yZSBsb2FkIGlzIHRyaWdnZXJlZCBmcm9tIGdldEJpbGxpbmdHcm91cHMoKSAoYWZ0ZXIgdGhlXG4gICAgLy8gc2VsZWN0ZWQgc3RvcmVzIGFyZSBwYXRjaGVkIGluKSBzbyBzZWxlY3RlZC1maXJzdCBvcmRlcmluZyB3b3Jrcy5cbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICkuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHZhbDtcbiAgICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmJpbGxpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cHM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXRjaEZvcm1JdGVtKHsgLi4uZ3JvdXAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gUmVtZW1iZXIgd2hpY2ggZ3JvdXAgaXMgYmVpbmcgZWRpdGVkIHNvIHNlbGVjdGVkLWZpcnN0IG9yZGVyaW5nIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXRzIHN0b3JlcyBldmVuIGFmdGVyIHRoaXMuZ3JvdXBJZCBpcyBjbGVhcmVkIGJlbG93LlxuICAgICAgICAgIHRoaXMuZWRpdGluZ0dyb3VwSWQgPSB0aGlzLmdyb3VwSWQgfHwgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzWzBdPy5nZXQoJ19pZCcpPy52YWx1ZSB8fCAnJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnX2lkJyk/LnZhbHVlID09PSB0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRUYWIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBJZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5kYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKCcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZCB0aGUgc3RvcmUgbGlzdCBBRlRFUiBncm91cHMgYXJlIHBhdGNoZWQgc28gdGhlIHNlbGVjdGVkIHN0b3JlSWRzXG4gICAgICAgIC8vIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBiYWNrZW5kIHNlbGVjdGVkLWZpcnN0IG9yZGVyaW5nLiAoZ2V0RmlsdGVycyBvblxuICAgICAgICAvLyB0aGlzIGZpcnN0IGNhbGwgdG8gYWxzbyBwb3B1bGF0ZSB0aGUgY291bnRyeS9zdGF0ZS9jaXR5IGZpbHRlcnMuKVxuICAgICAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoeyBnZXRGaWx0ZXJzOiB0cnVlIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIFN0aWxsIGxvYWQgc3RvcmVzIGV2ZW4gaWYgZ3JvdXBzIGZhaWwsIHNvIHRoZSBzZWN0aW9uIGlzbid0IGVtcHR5LlxuICAgICAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoeyBnZXRGaWx0ZXJzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcGF0Y2hGb3JtSXRlbSh7IGdyb3VwTmFtZSwgZ3JvdXBUYWcsIHJlZ2lzdGVyZWRDb21wYW55TmFtZSwgZ3N0LCBhZGRyZXNzTGluZU9uZSwgYWRkcmVzc0xpbmVUd28sIGNpdHksIHN0YXRlLCBjb3VudHJ5LFxuICAgIHBpbkNvZGUsIHBsYWNlT2ZTdXBwbHksIHBvLCBzdG9yZXMsIHByb1JhdGEsIHBheW1lbnRDYXRlZ29yeSwgY3VycmVuY3ksIHRheENhbGN1bGF0aW9uVHlwZSwgaXNJbnN0YWxsYXRpb25PbmVUaW1lLCBpbnN0YWxsYXRpb25GZWUsIHBheW1lbnRDeWNsZSxcbiAgICBwYXltZW50VGVybSwgZ2VuZXJhdGVJbnZvaWNlVG8sIGF0dGFjaEFubmV4dXJlLCBpc1ByaW1hcnksIGFkdmFuY2VJbnZvaWNlLCBhZHZhbmNlUGVyaW9kLCBwcm9kdWN0cywgX2lkIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUgfHwgJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBncm91cFRhZzogW2dyb3VwVGFnIHx8ICdzdG9yZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICByZWdpc3RlcmVkQ29tcGFueU5hbWU6IFsocmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8ICcnKS50b1VwcGVyQ2FzZSgpLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3N0OiBbZ3N0IHx8ICcnXSxcbiAgICAgIGFkZHJlc3NMaW5lT25lOiBbYWRkcmVzc0xpbmVPbmUgfHwgJyddLFxuICAgICAgYWRkcmVzc0xpbmVUd286IFthZGRyZXNzTGluZVR3byB8fCAnJ10sXG4gICAgICBjaXR5OiBbY2l0eSB8fCAnJ10sXG4gICAgICBzdGF0ZTogW3N0YXRlIHx8ICcnXSxcbiAgICAgIGNvdW50cnk6IFtjb3VudHJ5IHx8ICcnXSxcbiAgICAgIHBpbkNvZGU6IFtwaW5Db2RlIHx8ICcnXSxcbiAgICAgIHBsYWNlT2ZTdXBwbHk6IFtwbGFjZU9mU3VwcGx5IHx8ICcnXSxcbiAgICAgIHBvOiBbcG8gfHwgJyddLFxuICAgICAgc3RvcmVzOiBbc3RvcmVzIHx8IFtdXSxcbiAgICAgIC8vIFByaWNpbmcgbWV0aG9kOiAncHJvcmF0ZScgKGFjdHVhbCB3b3JraW5nIGRheXMpIG9yICdmbGF0JyAoZnVsbFxuICAgICAgLy8gbW9udGgpLiBEZWZhdWx0IHRvICdwcm9yYXRlJyBmb3IgcmVjb3JkcyB3aXRob3V0IGEgdmFsdWUuXG4gICAgICBwcm9SYXRhOiBbcHJvUmF0YSA9PT0gJ2ZsYXQnID8gJ2ZsYXQnIDogJ3Byb3JhdGUnXSxcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogW3BheW1lbnRDYXRlZ29yeSB8fCAncG9zdCddLFxuICAgICAgY3VycmVuY3k6IFtjdXJyZW5jeSB8fCAnZG9sbGFyJ10sXG4gICAgICAvLyBEZWZhdWx0IHRvICdkb21lc3RpYycgc28gZXhpc3RpbmcgcmVjb3JkcyAod2hpY2ggd29uJ3QgaGF2ZSB0aGlzXG4gICAgICAvLyBmaWVsZCkgYmVoYXZlIGV4YWN0bHkgYXMgdG9kYXkg4oCUIEdTVC9JR1NUIHN0aWxsIGFwcGxpZWQgZm9yIElOUi5cbiAgICAgIHRheENhbGN1bGF0aW9uVHlwZTogW3RheENhbGN1bGF0aW9uVHlwZSB8fCAnZG9tZXN0aWMnXSxcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2lzSW5zdGFsbGF0aW9uT25lVGltZSB8fCBmYWxzZV0sXG4gICAgICBpbnN0YWxsYXRpb25GZWU6IFt7IHZhbHVlOiBpbnN0YWxsYXRpb25GZWUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxuICAgICAgcGF5bWVudEN5Y2xlOiBbcGF5bWVudEN5Y2xlIHx8ICdtb250aGx5J10sXG4gICAgICBwYXltZW50VGVybTogW3BheW1lbnRUZXJtIHx8IDMwXSxcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbZ2VuZXJhdGVJbnZvaWNlVG8gfHwgW11dLFxuICAgICAgYXR0YWNoQW5uZXh1cmU6IFthdHRhY2hBbm5leHVyZSB8fCBmYWxzZV0sXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnkgfHwgZmFsc2VdLFxuICAgICAgYWR2YW5jZUludm9pY2U6IFthZHZhbmNlSW52b2ljZSB8fCBmYWxzZV0sXG4gICAgICBhZHZhbmNlUGVyaW9kOiBbYWR2YW5jZVBlcmlvZCB8fCAnbW9udGhseSddLFxuICAgICAgcHJvZHVjdHM6IFtwcm9kdWN0cyB8fCBbXV0sXG4gICAgICBjdXJyZW50VGFiOiBbJ2Jhc2ljLWluZm8nXSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF0sXG4gICAgICBfaWQ6IFtfaWRdXG4gICAgfSk7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLnB1c2goaXRlbSk7XG4gIH1cblxuICBhZGRGb3JtSXRlbSh7IGlzUHJpbWFyeSwgZ3JvdXBOYW1lIH06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmc+KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JvdXBOYW1lOiBbZ3JvdXBOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3JvdXBUYWc6IFsnc3RvcmUnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBnc3Q6IFsnJ10sXG4gICAgICBhZGRyZXNzTGluZU9uZTogWycnXSxcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbJyddLFxuICAgICAgY2l0eTogWycnXSxcbiAgICAgIHN0YXRlOiBbJyddLFxuICAgICAgY291bnRyeTogWycnXSxcbiAgICAgIHBpbkNvZGU6IFsnJ10sXG4gICAgICBwbGFjZU9mU3VwcGx5OiBbJyddLFxuICAgICAgcG86IFsnJ10sXG4gICAgICBzdG9yZXM6IFtbXV0sXG4gICAgICAvLyBOZXcgcmVjb3JkcyBhbHdheXMgc3RhcnQgd2l0aCAncHJvcmF0ZSc7IGZsYXQgaXMgb3B0LWluLlxuICAgICAgcHJvUmF0YTogWydwcm9yYXRlJ10sXG4gICAgICBwYXltZW50Q2F0ZWdvcnk6IFsncG9zdCddLFxuICAgICAgY3VycmVuY3k6IFsnZG9sbGFyJ10sXG4gICAgICAvLyBEZWZhdWx0ICdkb21lc3RpYycgc28gdGhlIGV4aXN0aW5nIEdTVC9JR1NUIGxvZ2ljIHN0aWxsIGFwcGxpZXNcbiAgICAgIC8vIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5IHN3aXRjaGVzIHRvIGludGVybmF0aW9uYWwuXG4gICAgICB0YXhDYWxjdWxhdGlvblR5cGU6IFsnZG9tZXN0aWMnXSxcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2ZhbHNlXSxcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHBheW1lbnRDeWNsZTogWydtb250aGx5J10sXG4gICAgICBwYXltZW50VGVybTogWzMwXSxcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbW11dLFxuICAgICAgYXR0YWNoQW5uZXh1cmU6IFtmYWxzZV0sXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnldLFxuICAgICAgYWR2YW5jZUludm9pY2U6IFtmYWxzZV0sXG4gICAgICBhZHZhbmNlUGVyaW9kOiBbJ21vbnRobHknXSxcbiAgICAgIHByb2R1Y3RzOiBbW11dLFxuICAgICAgY3VycmVudFRhYjogWydiYXNpYy1pbmZvJ10sXG4gICAgICBjbGllbnRJZDogW3RoaXMuY2xpZW50SWRdXG4gICAgfSk7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLnB1c2goaXRlbSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoYCR7dGhpcy5iaWxsaW5nR3JvdXBzLmxlbmd0aCAtIDF9YCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgYmlsbGluZ0dyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5iaWxsaW5nRm9ybS5nZXQoJ2dyb3VwcycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIC8vIFN0YXJ0IG1vbnRoIHRoZSBhZHZhbmNlIGludm9pY2Ugd2lsbCBjb3ZlciDigJQgdGhlIGZpcnN0IGRheSBvZiBuZXh0IG1vbnRoLFxuICAvLyBtYXRjaGluZyB0aGUgYmFja2VuZCAoZGF5anMoKS5hZGQoMSwnbW9udGgnKS5zdGFydE9mKCdtb250aCcpKS5cbiAgZ2V0IGFkdmFuY2VJbnZvaWNlRGF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xuICB9XG5cbiAgLy8gSHVtYW4gbGFiZWwgZm9yIHRoZSBwZXJpb2QgYSBjaG9zZW4gYWR2YW5jZSBmcmVxdWVuY3kgY292ZXJzLCBzaG93biBuZXh0XG4gIC8vIHRvIHRoZSBkcm9wZG93biAoZS5nLiBcIkp1bCAyMDI2IOKAkyBEZWMgMjAyNlwiIGZvciBoYWxmLXllYXJseSkuXG4gIGFkdmFuY2VJbnZvaWNlUmFuZ2UocGVyaW9kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuYWR2YW5jZVBlcmlvZE9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IHBlcmlvZCk/Lm1vbnRocyB8fCAxO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICBjb25zdCBmbXQgPSAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIGlmIChtb250aHMgPD0gMSkgcmV0dXJuIGZtdChzdGFydCk7XG4gICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpICsgbW9udGhzLCAxKTtcbiAgICByZXR1cm4gYCR7Zm10KHN0YXJ0KX0g4oCTICR7Zm10KGVuZCl9YDtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKGlkeDogbnVtYmVyLCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh2YWwpO1xuICB9XG5cbiAgb25EZWxldGVHcm91cChpZHg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ19pZCcpPy52YWx1ZSkge1xuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVCaWxsaW5nR3JvdXAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdfaWQnKT8udmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgaWYgKGdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLmdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5yZW1vdmVBdChpZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgaWYgKGdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLmdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5yZW1vdmVBdChpZHgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN1YnNjcmliZWRTdG9yZXMoeyBnZXRGaWx0ZXJzIH06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGluZycpO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0ZWRDb2x1bW4sXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydERpcmVjdGlvbixcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFRlcm0sXG4gICAgICBjb3VudHJ5OiB0aGlzLmZpbHRlckNvdW50cmllcyxcbiAgICAgIHN0YXRlOiB0aGlzLmZpbHRlclN0YXRlcyxcbiAgICAgIGNpdHk6IHRoaXMuZmlsdGVyQ2l0aWVzLFxuICAgICAgZ2V0RmlsdGVyczogZ2V0RmlsdGVycyxcbiAgICAgIC8vIEJhY2tlbmQgcmVzb2x2ZXMgdGhpcyBncm91cCdzIHNlbGVjdGVkIHN0b3JlcywgdGFncyBlYWNoIHJvdyB3aXRoXG4gICAgICAvLyBpc1NlbGVjdGVkIGFuZCBmbG9hdHMgc2VsZWN0ZWQgc3RvcmVzIHRvIHRoZSB0b3AgYWNyb3NzIGFsbCBwYWdlcy5cbiAgICAgIGdyb3VwSWQ6IHRoaXMuZWRpdGluZ0dyb3VwSWQgfHwgdGhpcy5ncm91cElkIHx8IHRoaXMuYmlsbGluZ0dyb3Vwcz8uY29udHJvbHM/LlswXT8uZ2V0KCdfaWQnKT8udmFsdWUgfHwgJycsXG4gICAgICAvLyBBbHNvIHNlbmQgdGhlIGxpdmUgc2VsZWN0aW9uIChjb3ZlcnMgYSBicmFuZC1uZXcgdW5zYXZlZCBncm91cCB3aG9zZVxuICAgICAgLy8gc3RvcmVzIGFyZW4ndCB5ZXQgcGVyc2lzdGVkIHRvIHRoZSBiaWxsaW5nIGRvYykuXG4gICAgICBzZWxlY3RlZFN0b3JlSWRzOiB0aGlzLnNlbGVjdGVkU3RvcmVJZHNGb3JTb3J0KClcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSAmJiAhZGF0YVtrZXldLmxlbmd0aCkgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldFN1YnNjcmliZWRTdG9yZXMoZGF0YSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGVkJyk7XG4gICAgICAgIGlmIChnZXRGaWx0ZXJzKSB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY291bnRyaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDb3VudHJ5JywgSXNzdWVzOiByZXMuZGF0YS5jb3VudHJpZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5zdGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ1N0YXRlJywgSXNzdWVzOiByZXMuZGF0YS5zdGF0ZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5jaXRpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ0NpdHknLCBJc3N1ZXM6IHJlcy5kYXRhLmNpdGllcy5tYXAoKHZhbDogYW55KSA9PiAoeyB0ZXh0OiB2YWwuX2lkLCBpZDogdmFsLl9pZCB9KSkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcz8uZGF0YT8ucGFnZUluZm8/LmNvdW50IHx8IDA7XG4gICAgICAgIC8vIEJhY2tlbmQgcmV0dXJucyBzZWxlY3RlZCBzdG9yZXMgZmlyc3QgKHNlbGVjdGVkLWZpcnN0IG9yZGVyaW5nKS5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0ID0gcmVzPy5kYXRhPy5kYXRhIHx8IFtdO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25TdG9yZUNoZWNrKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHN0b3JlSWQ6IHN0cmluZykge1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKHN0b3JlSWQpKSB7XG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShpdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gc3RvcmVJZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIHN0b3JlSWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IHN0b3JlSWQpXG4gICAgICApO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgc3RvcmVJZF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdEFsbFN0b3JlcyhldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3Vic2NyaWJlZFN0b3JlSWRzID0gdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0Lm1hcChpdGVtID0+IGl0ZW0uc3RvcmVJZCk7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZm9yRWFjaCgoc3RvcmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChzdWJzY3JpYmVkU3RvcmVJZHMuaW5jbHVkZXMoc3RvcmUpKSB7XG4gICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gc3RvcmUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi5zdWJzY3JpYmVkU3RvcmVJZHNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gIXN1YnNjcmliZWRTdG9yZUlkcy5pbmNsdWRlcyhpdGVtKSlcbiAgICAgICk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5pdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi5zdWJzY3JpYmVkU3RvcmVJZHNdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNTdG9yZVNlbGVjdGVkSW5Hcm91cChmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBzdG9yZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhzdG9yZUlkKTtcbiAgfVxuXG4gIC8vIFNlbGVjdGVkIHN0b3JlSWRzIHNlbnQgdG8gdGhlIGJhY2tlbmQgc28gaXQgY2FuIHNvcnQgc2VsZWN0ZWQgc3RvcmVzIGZpcnN0LlxuICAvLyBSZWFkIHN0cmFpZ2h0IGZyb20gdGhlIGxpdmUgZm9ybSAodGhlIHNhbWUgc291cmNlIGFzIHRoZSBjaGVja2JveGVzKSwgc28gaXRcbiAgLy8gYWx3YXlzIG1hdGNoZXMgdGhlIFVJLiBUaGUgc2hhcmVkIHN0b3JlIGxpc3QgaXMgcmVuZGVyZWQgcGVyIGdyb3VwLCBzbyB3ZVxuICAvLyB1bmlvbiBldmVyeSBncm91cCdzIHNlbGVjdGlvbiDigJQgZm9yIGEgc2luZ2xlLWdyb3VwIGVkaXQgdGhpcyBpcyBleGFjdGx5XG4gIC8vIHRoYXQgZ3JvdXAncyBzdG9yZXM7IGZvciBtdWx0aS1ncm91cCBpdCBmbG9hdHMgYW55dGhpbmcgc2VsZWN0ZWQgYW55d2hlcmUuXG4gIHByaXZhdGUgc2VsZWN0ZWRTdG9yZUlkc0ZvclNvcnQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICh0aGlzLmJpbGxpbmdHcm91cHM/LmNvbnRyb2xzIHx8IFtdKS5mb3JFYWNoKGcgPT4ge1xuICAgICAgKGcuZ2V0KCdzdG9yZXMnKT8udmFsdWUgfHwgW10pLmZvckVhY2goKHM6IHN0cmluZykgPT4gaWRzLmFkZChzKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi5pZHNdO1xuICB9XG5cbiAgaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QuZXZlcnkoaXRlbSA9PiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKGl0ZW0uc3RvcmVJZCkpICYmIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5sZW5ndGg7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudDtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnQ7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcbiAgICB2YXIgayA9IGV2ZW50LmNoYXJDb2RlO1xuICAgIHJldHVybiAoayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1NykpO1xuICB9XG5cbiAgZm9yY2VVcHBlcmNhc2UoZXZlbnQ6IGFueSwgaWR4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHVwcGVyID0gaW5wdXQudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaW5wdXQudmFsdWUgIT09IHVwcGVyKSB7XG4gICAgICBjb25zdCBjYXJldCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgaW5wdXQudmFsdWUgPSB1cHBlcjtcbiAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnNldFZhbHVlKHVwcGVyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIGV2ZW50LmZvckVhY2goKHZhbDogYW55KSA9PiB7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ291bnRyeScpIHRoaXMuZmlsdGVyQ291bnRyaWVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnU3RhdGUnKSB0aGlzLmZpbHRlclN0YXRlcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpO1xuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ0NpdHknKSB0aGlzLmZpbHRlckNpdGllcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpO1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBvbkVtYWlsS2V5RG93bihldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0JhY2tzcGFjZScgJiYgZXZlbnQudGFyZ2V0LnZhbHVlID09ICcnKSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5zbGljZSgwLCAtMSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChldmVudC5jb2RlID09ICdFbnRlcicpIHtcbiAgICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC87XG4gICAgICBpZiAoZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKFxuICAgICAgICAgIFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUsIGV2ZW50LnRhcmdldC52YWx1ZV1cbiAgICAgICAgKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRW1haWxDaGlwKGVtYWlsOiBzdHJpbmcsIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBlbWFpbClcbiAgICApO1xuICB9XG5cbiAgb25Tb3J0KGNvbHVtbjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbiA9PT0gMSA/IC0xIDogMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBjb2x1bW47XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAxO1xuICAgIH1cbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgbmF2aWdhdGUoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3N0b3JlLXNlbGVjdGlvbicpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3NldHRpbmdzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQmlsbGluZ0dyb3VwKCkge1xuICAgIHRoaXMuYWRkRm9ybUl0ZW0oeyBncm91cE5hbWU6IGBHcm91cCAke3RoaXMuYmlsbGluZ0dyb3Vwcy5sZW5ndGggKyAxfWAsIGlzUHJpbWFyeTogZmFsc2UgfSk7XG4gIH1cblxuICBvblN1Ym1pdChmb3JtVmFsdWVzOiBhbnksIGlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnYmFzaWMtaW5mbycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBhZGQgYXQgbGVhc3Qgb25lIGVtYWlsIGluIEdlbmVyYXRlIEludm9pY2UgVG8nKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWxldGUgZm9ybVZhbHVlcy5jdXJyZW50VGFiO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVZhbHVlcykge1xuICAgICAgaWYgKGZvcm1WYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoZm9ybVZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIGRlbGV0ZSBmb3JtVmFsdWVzW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvcm1WYWx1ZXMuX2lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUJpbGxpbmdHcm91cChmb3JtVmFsdWVzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyLmVycm9yPy5jb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHVwZGF0ZSBiaWxsaW5nIGdyb3VwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5jcmVhdGVCaWxsaW5nR3JvdXAoZm9ybVZhbHVlcykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFJlZi5jbG9zZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0UHJpbWFyeVRvYXN0KCdCaWxsaW5nIGdyb3VwIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGVyci5lcnJvcj8uY29kZSA9PT0gNDAwKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBjcmVhdGUgYmlsbGluZyBncm91cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xpZW50UHJvZHVjdHMoKSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRDbGllbnRQcm9kdWN0cyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5wbGFuRGV0YWlscz8ucHJvZHVjdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVkUHJvZHVjdHMgPSByZXMuZGF0YS5wbGFuRGV0YWlscy5wcm9kdWN0LmZpbHRlcigocDogYW55KSA9PiBwLnN0YXR1cyA9PT0gJ2xpdmUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DYW5jZWwoaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHJldmVudEVudGVyKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgZ2V0UHJvZHVjdEJpbGxpbmdNZXRob2QoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8udmFsdWUgfHwgW107XG4gICAgY29uc3QgZm91bmQgPSBwcm9kdWN0cy5maW5kKChwOiBhbnkpID0+IHAucHJvZHVjdE5hbWUgPT09IHByb2R1Y3ROYW1lKTtcbiAgICByZXR1cm4gZm91bmQ/LmJpbGxpbmdNZXRob2QgfHwgJ292ZXJhbGxTdG9yZSc7XG4gIH1cblxuICBvbkJpbGxpbmdNZXRob2RDaGFuZ2UoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZywgZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcHJvZHVjdHMuZmluZCgocDogYW55KSA9PiBwLnByb2R1Y3ROYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5iaWxsaW5nTWV0aG9kID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0cy5wdXNoKHsgcHJvZHVjdE5hbWUsIGJpbGxpbmdNZXRob2Q6IGV2ZW50LnRhcmdldC52YWx1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnNldFZhbHVlKFsuLi5wcm9kdWN0c10pO1xuICB9XG5cbiAgb25CaWxsaW5nTWV0aG9kU2VsZWN0Q2hhbmdlKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHByb2R1Y3ROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy52YWx1ZSB8fCBbXTtcbiAgICBjb25zdCBleGlzdGluZyA9IHByb2R1Y3RzLmZpbmQoKHA6IGFueSkgPT4gcC5wcm9kdWN0TmFtZSA9PT0gcHJvZHVjdE5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYmlsbGluZ01ldGhvZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0cy5wdXNoKHsgcHJvZHVjdE5hbWUsIGJpbGxpbmdNZXRob2Q6IHZhbHVlIH0pO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8uc2V0VmFsdWUoWy4uLnByb2R1Y3RzXSk7XG4gIH1cblxuICBmb3JtYXRQcm9kdWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMSAkMicpXG4gICAgICAucmVwbGFjZSgvXi4vLCAoc3RyKSA9PiBzdHIudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvLyBHU1RJTiBzdGF0ZS1jb2RlIHByZWZpeCDihpIgU3RhdGUgKFBsYWNlIG9mIFN1cHBseSlcbiAgcHJpdmF0ZSByZWFkb25seSBnc3RTdGF0ZUNvZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJzAxJzogJ0phbW11IGFuZCBLYXNobWlyJyxcbiAgICAnMDInOiAnSGltYWNoYWwgUHJhZGVzaCcsXG4gICAgJzAzJzogJ1B1bmphYicsXG4gICAgJzA0JzogJ0NoYW5kaWdhcmgnLFxuICAgICcwNSc6ICdVdHRhcmFraGFuZCcsXG4gICAgJzA2JzogJ0hhcnlhbmEnLFxuICAgICcwNyc6ICdEZWxoaScsXG4gICAgJzA4JzogJ1JhamFzdGhhbicsXG4gICAgJzA5JzogJ1V0dGFyIFByYWRlc2gnLFxuICAgICcxMCc6ICdCaWhhcicsXG4gICAgJzExJzogJ1Npa2tpbScsXG4gICAgJzEyJzogJ0FydW5hY2hhbCBQcmFkZXNoJyxcbiAgICAnMTMnOiAnTmFnYWxhbmQnLFxuICAgICcxNCc6ICdNYW5pcHVyJyxcbiAgICAnMTUnOiAnTWl6b3JhbScsXG4gICAgJzE2JzogJ1RyaXB1cmEnLFxuICAgICcxNyc6ICdNZWdoYWxheWEnLFxuICAgICcxOCc6ICdBc3NhbScsXG4gICAgJzE5JzogJ1dlc3QgQmVuZ2FsJyxcbiAgICAnMjAnOiAnSmhhcmtoYW5kJyxcbiAgICAnMjEnOiAnT2Rpc2hhJyxcbiAgICAnMjInOiAnQ2hoYXR0aXNnYXJoJyxcbiAgICAnMjMnOiAnTWFkaHlhIFByYWRlc2gnLFxuICAgICcyNCc6ICdHdWphcmF0JyxcbiAgICAnMjUnOiAnRGFtYW4gYW5kIERpdScsXG4gICAgJzI2JzogJ0RhZHJhIGFuZCBOYWdhciBIYXZlbGkgYW5kIERhbWFuIGFuZCBEaXUnLFxuICAgICcyNyc6ICdNYWhhcmFzaHRyYScsXG4gICAgJzI4JzogJ0FuZGhyYSBQcmFkZXNoIChPbGQpJyxcbiAgICAnMjknOiAnS2FybmF0YWthJyxcbiAgICAnMzAnOiAnR29hJyxcbiAgICAnMzEnOiAnTGFrc2hhZHdlZXAnLFxuICAgICczMic6ICdLZXJhbGEnLFxuICAgICczMyc6ICdUYW1pbCBOYWR1JyxcbiAgICAnMzQnOiAnUHVkdWNoZXJyeScsXG4gICAgJzM1JzogJ0FuZGFtYW4gYW5kIE5pY29iYXIgSXNsYW5kcycsXG4gICAgJzM2JzogJ1RlbGFuZ2FuYScsXG4gICAgJzM3JzogJ0FuZGhyYSBQcmFkZXNoJyxcbiAgICAnMzgnOiAnTGFkYWtoJyxcbiAgICAnOTcnOiAnT3RoZXIgVGVycml0b3J5JyxcbiAgICAnOTknOiAnQ2VudHJlIEp1cmlzZGljdGlvbidcbiAgfTtcblxuICBvbkdzdENoYW5nZShmb3JtQXJyYXlJbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3N0ID0gKHZhbHVlIHx8ICcnKS50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBwbGFjZU9mU3VwcGx5Q3RybCA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk7XG4gICAgaWYgKGdzdC5sZW5ndGggPCAyKSB7XG4gICAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoJycpO1xuICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnaWRsZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSBnc3Quc3Vic3RyaW5nKDAsIDIpO1xuICAgIGNvbnN0IHN0YXRlTmFtZSA9IHRoaXMuZ3N0U3RhdGVDb2RlTWFwW2NvZGVdO1xuICAgIGlmIChzdGF0ZU5hbWUpIHtcbiAgICAgIHBsYWNlT2ZTdXBwbHlDdHJsPy5zZXRWYWx1ZShgJHtzdGF0ZU5hbWV9ICgke2NvZGV9KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoJycpO1xuICAgIH1cblxuICAgIC8vIEZ1bGwgR1NUSU4gaXMgMTUgY2hhcnMgKDE1LWNoYXIgYWxwaGFudW1lcmljKS4gVHJpZ2dlciB0aGUgYWRkcmVzc1xuICAgIC8vIGxvb2t1cCBvbmNlIHRoZSB1c2VyIGhhcyB0eXBlZCBhbGwgMTUuIFNraXAgaWYgd2UgYWxyZWFkeSBsb29rZWQgdGhpc1xuICAgIC8vIGV4YWN0IHZhbHVlIHVwIGZvciB0aGlzIHJvdyDigJQgb3RoZXJ3aXNlIHRoZSAoaW5wdXQpIGV2ZW50IHdvdWxkIHJlZmlyZVxuICAgIC8vIG9uIGZvY3VzL2JsdXIgYW5kIGNsb2JiZXIgYW55IG1hbnVhbCB0d2Vha3MgdGhlIHVzZXIgbWFkZS5cbiAgICBpZiAoZ3N0Lmxlbmd0aCA9PT0gMTUgJiYgdGhpcy5sYXN0TG9va2VkVXBHc3Rpbltmb3JtQXJyYXlJbmRleF0gIT09IGdzdCkge1xuICAgICAgdGhpcy5sb29rdXBBbmRGaWxsQWRkcmVzcyhmb3JtQXJyYXlJbmRleCwgZ3N0KTtcbiAgICB9IGVsc2UgaWYgKGdzdC5sZW5ndGggPCAxNSkge1xuICAgICAgLy8gUmVzZXQgc3RhdGUgc28gYSBwcmV2aW91cyBcImZvdW5kXCIgaW5kaWNhdG9yIGRvZXNuJ3Qgc3RpY2sgYXJvdW5kXG4gICAgICAvLyB3aGlsZSB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBudW1iZXIgdG8gYSBuZXcgdmFsdWUuXG4gICAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdpZGxlJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvb2t1cEFuZEZpbGxBZGRyZXNzKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIGdzdDogc3RyaW5nKSB7XG4gICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnbG9hZGluZyc7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5sb29rdXBHc3Rpbihnc3QpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vIEJhY2tlbmQgd3JhcDogeyBjb2RlLCBzdGF0dXMsIGRhdGE6IDxwYXlsb2FkPiB9LiBQYXlsb2FkIGl0c2VsZlxuICAgICAgICAvLyBtYXkgYWxzbyBiZSBuZXN0ZWQgdW5kZXIgYGRhdGFgIGlmIHRoZSByZXNwb25zZSBtaWRkbGV3YXJlIGRvdWJsZS1cbiAgICAgICAgLy8gd3JhcHMgaXQ7IGhhbmRsZSBib3RoIHNoYXBlcyB0byBiZSBzYWZlLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcmVzPy5kYXRhPy5kYXRhIHx8IHJlcz8uZGF0YSB8fCB7fTtcbiAgICAgICAgaWYgKCFwYXlsb2FkIHx8ICFwYXlsb2FkLmdzdGluKSB7XG4gICAgICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnbm90Zm91bmQnO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCk7XG4gICAgICAgIC8vIFBhdGNoIG9ubHkgdGhlIGFkZHJlc3MtcmVsYXRlZCBmaWVsZHMuIERvbid0IG92ZXJ3cml0ZSBncm91cE5hbWUsXG4gICAgICAgIC8vIGdyb3VwVGFnLCBzdG9yZXMsIGN1cnJlbmN5LCBwYXltZW50VGVybSDigJQgdGhvc2UgYXJlIHVzZXIgY2hvaWNlcyxcbiAgICAgICAgLy8gbm90IGRlcml2ZWQgZnJvbSBHU1RJTi5cbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgICAgaWYgKHBheWxvYWQubGVnYWxOYW1lKSBwYXRjaFsncmVnaXN0ZXJlZENvbXBhbnlOYW1lJ10gPSBTdHJpbmcocGF5bG9hZC5sZWdhbE5hbWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChwYXlsb2FkLmFkZHJlc3NMaW5lT25lKSBwYXRjaFsnYWRkcmVzc0xpbmVPbmUnXSA9IHBheWxvYWQuYWRkcmVzc0xpbmVPbmU7XG4gICAgICAgIGlmIChwYXlsb2FkLmFkZHJlc3NMaW5lVHdvKSBwYXRjaFsnYWRkcmVzc0xpbmVUd28nXSA9IHBheWxvYWQuYWRkcmVzc0xpbmVUd287XG4gICAgICAgIGlmIChwYXlsb2FkLmNpdHkpIHBhdGNoWydjaXR5J10gPSBwYXlsb2FkLmNpdHk7XG4gICAgICAgIGlmIChwYXlsb2FkLnN0YXRlKSBwYXRjaFsnc3RhdGUnXSA9IHBheWxvYWQuc3RhdGU7XG4gICAgICAgIGlmIChwYXlsb2FkLmNvdW50cnkpIHBhdGNoWydjb3VudHJ5J10gPSBwYXlsb2FkLmNvdW50cnk7XG4gICAgICAgIGlmIChwYXlsb2FkLnBpbkNvZGUpIHBhdGNoWydwaW5Db2RlJ10gPSBwYXlsb2FkLnBpbkNvZGU7XG4gICAgICAgIGlmIChwYXlsb2FkLnBsYWNlT2ZTdXBwbHkpIHBhdGNoWydwbGFjZU9mU3VwcGx5J10gPSBwYXlsb2FkLnBsYWNlT2ZTdXBwbHk7XG4gICAgICAgIGdyb3VwLnBhdGNoVmFsdWUocGF0Y2gpO1xuICAgICAgICB0aGlzLmxhc3RMb29rZWRVcEdzdGluW2Zvcm1BcnJheUluZGV4XSA9IGdzdDtcbiAgICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSAnZm91bmQnO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gNDA0ID0gdW5rbm93biBHU1RJTjsgZXZlcnl0aGluZyBlbHNlIHN1cmZhY2VzIGFzIGFuIGVycm9yIHNvIHRoZVxuICAgICAgICAvLyB1c2VyIGtub3dzIHRoZSBhdXRvLWZpbGwgZGlkbid0IGhhcHBlbiBhbmQgdGhleSBzaG91bGQgZW50ZXJcbiAgICAgICAgLy8gbWFudWFsbHkuXG4gICAgICAgIHRoaXMuZ3N0TG9va3VwU3RhdGVbZm9ybUFycmF5SW5kZXhdID0gZXJyPy5zdGF0dXMgPT09IDQwNCA/ICdub3Rmb3VuZCcgOiAnZXJyb3InO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbjxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIFVwZGF0ZSBCaWxsaW5nIEluZm9ybWF0aW9uXG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkQmlsbGluZ0dyb3VwKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIG5lZWRoZWxwXCI+PHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDEzIDQuMTY2MDJWMTUuODMyN000LjE2Nzk3IDkuOTk5MzVIMTUuODM0NlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+QWRkIEJpbGxpbmcgR3JvdXA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxmb3JtIFtmb3JtR3JvdXBdPVwiYmlsbGluZ0Zvcm1cIj5cbiAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5sZW5ndGggPiAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiIG5nYkFjY29yZGlvbiBhY2NvcmRpb249XCJOZ2JBY2NvcmRpb25cIlxuICAgICAgICBbY2xvc2VPdGhlcnNdPVwidHJ1ZVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICAgICAgW25nYkFjY29yZGlvbkl0ZW1dPVwiaS50b1N0cmluZygpXCIgY2xhc3M9XCJtYi01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgbmdiQWNjb3JkaW9uSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57e2dyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIiBjbGFzcz1cInByaW1hcnktYmFkZ2VcIj5QcmltYXJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uRGVsZXRlR3JvdXAoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNC45OTkzNUg0LjE2NjY3TTQuMTY2NjcgNC45OTkzNUwxNy41IDQuOTk5MzVNNC4xNjY2NyA0Ljk5OTM1TDQuMTY2NjcgMTYuNjY2QzQuMTY2NjcgMTcuMTA4IDQuMzQyMjYgMTcuNTMyIDQuNjU0ODIgMTcuODQ0NUM0Ljk2NzM4IDE4LjE1NzEgNS4zOTEzMSAxOC4zMzI3IDUuODMzMzMgMTguMzMyN0gxNC4xNjY3QzE0LjYwODcgMTguMzMyNyAxNS4wMzI2IDE4LjE1NzEgMTUuMzQ1MiAxNy44NDQ1QzE1LjY1NzcgMTcuNTMyIDE1LjgzMzMgMTcuMTA4IDE1LjgzMzMgMTYuNjY2TDE1LjgzMzMgNC45OTkzNUw0LjE2NjY3IDQuOTk5MzVaTTYuNjY2NjcgNC45OTkzNVYzLjMzMjY4QzYuNjY2NjcgMi44OTA2NSA2Ljg0MjI2IDIuNDY2NzMgNy4xNTQ4MiAyLjE1NDE3QzcuNDY3MzggMS44NDE2MSA3Ljg5MTMxIDEuNjY2MDIgOC4zMzMzMyAxLjY2NjAyTDExLjY2NjcgMS42NjYwMkMxMi4xMDg3IDEuNjY2MDIgMTIuNTMyNiAxLjg0MTYxIDEyLjg0NTIgMi4xNTQxN0MxMy4xNTc3IDIuNDY2NzMgMTMuMzMzMyAyLjg5MDY1IDEzLjMzMzMgMy4zMzI2OFY0Ljk5OTM1TTguMzMzMzMgOS4xNjYwMkw4LjMzMzMzIDE0LjE2Nk0xMS42NjY3IDkuMTY2MDJWMTQuMTY2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHkgY2xhc3M9XCJwcy0wIHBlLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSA/ICdyb3ctY29scy0yJyA6ICcnXCIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTMgIGctMCBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nID8gJ3NlbGVjdGVkJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+QmFzaWMgSW5mbzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3N0b3JlLXNlbGVjdGlvbicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPlN0b3JlIFNlbGVjdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncycgPyAnc2VsZWN0ZWQnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TZXR0aW5nczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3JvdXBOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R3JvdXAgTmFtZSo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdyb3VwTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdyb3VwTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBUYWdcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZ3JvdXBUYWdPcHRpb25zXCIgW2xhYmVsXT1cIidHcm91cCBUYWcqJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdncm91cFRhZycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdncm91cFRhZycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCB0YWcgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJlZ2lzdGVyZWQgQ29tcGFueSBOYW1lKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cImZvcmNlVXBwZXJjYXNlKCRldmVudCwgaSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdzdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdTVDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cIm9uR3N0Q2hhbmdlKGksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3N0Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NUIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHU1RJTiBhZGRyZXNzLWxvb2t1cCBmZWVkYmFjay4gU3RhdGUgbWFjaGluZSBkcml2ZW4gYnkgbG9va3VwQW5kRmlsbEFkZHJlc3MoKS4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1tdXRlZFwiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdsb2FkaW5nJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29raW5nIHVwIHJlZ2lzdGVyZWQgYWRkcmVzc+KAplxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1zdWNjZXNzXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2ZvdW5kJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGFkZHJlc3MgYXV0by1maWxsZWQuIEVkaXQgaWYgbmVlZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC13YXJuaW5nXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ25vdGZvdW5kJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZWdpc3RlcmVkIGFkZHJlc3MgZm91bmQgZm9yIHRoaXMgR1NUSU4uIEVudGVyIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1kYW5nZXJcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnZXJyb3InXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbG9va3VwIGZhaWxlZC4gRW50ZXIgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lT25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDE8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lT25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lVHdvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVUd29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NpdHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY2l0eScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5IGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY291bnRyeVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvdW50cnk8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY291bnRyeScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpbkNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaW4gY29kZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGluQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BpbkNvZGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGluQ29kZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW4gY29kZSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGxhY2VPZlN1cHBseVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBsYWNlT2ZTdXBwbHlcIiByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwb1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBPPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwb1wiIGZvcm1Db250cm9sTmFtZT1cInBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdkLW5vbmUnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS41IDEwTDExLjQzIDEwLjczQzEyLjQxIDkuNTkgMTMgOC4xMSAxMyA2LjVDMTMgMi45MSAxMC4wOSAwIDYuNSAwQzIuOTEgMCAwIDIuOTEgMCA2LjVDMCAxMC4wOSAyLjkxIDEzIDYuNSAxM0M4LjExIDEzIDkuNTkgMTIuNDEgMTAuNzMgMTEuNDNMMTAuMjc2MiAxMS43MUwxNiAxNy40OUwxNy40OSAxNkwxMS41IDEwWk02LjUgMTFDNC4wMSAxMSAyIDguOTkgMiA2LjVDMiA0LjAxIDQuMDEgMiA2LjUgMkM4Ljk5IDIgMTEgNC4wMSAxMSA2LjVDMTEgOC45OSA4Ljk5IDExIDYuNSAxMVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImJsYWNrXCIgZmlsbC1vcGFjaXR5PVwiMC41NFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzICpuZ0lmPVwiZmlsdGVyRGF0YS5sZW5ndGhcIiBjbGFzcz1cIm1lLTJcIiBbZGF0YU9iamVjdF09XCJmaWx0ZXJEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Py5sZW5ndGhcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgc3RvcmUtdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2NoZWNrZWRdPVwiaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsU3RvcmVzKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXIgbWUtNFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0b3JlIE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlTmFtZScgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlIElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZUlkJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlSWQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0czwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIHN1YnNjcmliZWRTdG9yZUxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2NoZWNrZWRdPVwiaXNTdG9yZVNlbGVjdGVkSW5Hcm91cChpLCBkYXRhPy5zdG9yZUlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TdG9yZUNoZWNrKCRldmVudCwgaSwgZGF0YT8uc3RvcmVJZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXIgbWUtNFwiIHR5cGU9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YT8uc3RvcmVOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtaWRcIj5JRCA6IHt7ZGF0YT8uc3RvcmVJZH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBkYXRhPy5wcm9kdWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJhZmZpYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlRyYWZmaWM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvWm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlpvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJheCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlRyYXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3Vic2NyaWJlZFN0b3JlTGlzdC5sZW5ndGhcIiBjbGFzcz1cIm15LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkaW5nJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc2V0dGluZ3MnID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2Q8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3Byb3JhdGUtJyArIGlcIiB2YWx1ZT1cInByb3JhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIFtmb3JdPVwiJ3Byb3JhdGUtJyArIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9yYXRlIOKAlCBiaWxsIGZvciBhY3R1YWwgd29ya2luZyBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmxhdC0nICsgaVwiIHZhbHVlPVwiZmxhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgW2Zvcl09XCInZmxhdC0nICsgaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYXQg4oCUIGJpbGwgZm9yIHRoZSB3aG9sZSBtb250aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5BZHZhbmNlIEludm9pY2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTNDMTAuMzEzNyAxMyAxMyAxMC4zMTM3IDEzIDdDMTMgMy42ODYyOSAxMC4zMTM3IDEgNyAxQzMuNjg2MjkgMSAxIDMuNjg2MjkgMSA3QzEgMTAuMzEzNyAzLjY4NjI5IDEzIDcgMTNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZV8nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZUludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidhZHZhbmNlSW52b2ljZV8nICsgaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluIGFkdmFuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5hdChpKS5nZXQoJ2FkdmFuY2VJbnZvaWNlJyk/LnZhbHVlXCIgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIGZ3LXNlbWlib2xkXCI+QWR2YW5jZSBmcmVxdWVuY3k8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZVBlcmlvZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhZHZhbmNlUGVyaW9kT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2UgaW52b2ljZSB3aWxsIGNvdmVyIHt7IGFkdmFuY2VJbnZvaWNlUmFuZ2UoYmlsbGluZ0dyb3Vwcy5hdChpKS5nZXQoJ2FkdmFuY2VQZXJpb2QnKT8udmFsdWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbWItNVwiICpuZ0lmPVwic3Vic2NyaWJlZFByb2R1Y3RzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWItM1wiPlByb2R1Y3QgQmlsbGluZyBNZXRob2Q8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZTogbm8gLnRhYmxlLXJlc3BvbnNpdmUgd3JhcHBlciBoZXJlLiBJdHMgb3ZlcmZsb3cteDphdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcyB0aGUgQmlsbGluZyBNZXRob2QgZHJvcGRvd24gb3B0aW9ucyBwYW5lbC4gVGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGhhcyB0d28gY29sdW1ucywgc28gaG9yaXpvbnRhbCBzY3JvbGwgaXNuJ3QgbmVlZGVkLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbSBib3R0b20tYm9yZGVyIGJpbGxpbmctbWV0aG9kLXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgTWV0aG9kPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcHJvZCBvZiBzdWJzY3JpYmVkUHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeVwiPnt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2QucHJvZHVjdE5hbWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0UHJvZHVjdEJpbGxpbmdNZXRob2QoaSwgcHJvZC5wcm9kdWN0TmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoaSwgcHJvZC5wcm9kdWN0TmFtZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImJpbGxpbmdNZXRob2RPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJjdXJyZW5jeU9wdGlvbnNcIiBbbGFiZWxdPVwiJ0N1cnJlbmN5J1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidGF4Q2FsY3VsYXRpb25UeXBlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInRheENhbGN1bGF0aW9uVHlwZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1RheCBDYWxjdWxhdGlvbidcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50Q3ljbGVPcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicGF5bWVudFRlcm1PcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2VtYWlsJyArIGlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HZW5lcmF0ZSBJbnZvaWNlIFRvKiA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+e3sgZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtaW5wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2ljZSBlbWFpbCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwieWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cIm5vXCIgW3ZhbHVlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cIm5vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1lbmQgbXQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoaSlcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgfHwgZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5OZXh0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoZ3JvdXAudmFsdWUsIGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA9PT0gMVwiIGZvcm1BcnJheU5hbWU9XCJncm91cHNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYmlsbGluZ0dyb3Vwcy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTIgZy0wIG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm88L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJyA/ICdzZWxlY3RlZCcgOiAnJ1wiIGNsYXNzPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdiYXNpYy1pbmZvJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZWdpc3RlcmVkIENvbXBhbnkgTmFtZSo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cImZvcmNlVXBwZXJjYXNlKCRldmVudCwgaSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3N0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R1NUPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChpbnB1dCk9XCJvbkdzdENoYW5nZShpLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3N0Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1tdXRlZFwiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdsb2FkaW5nJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2tpbmcgdXAgcmVnaXN0ZXJlZCBhZGRyZXNz4oCmXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1zdWNjZXNzXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2ZvdW5kJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgYWRkcmVzcyBhdXRvLWZpbGxlZC4gRWRpdCBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC13YXJuaW5nXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ25vdGZvdW5kJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlZ2lzdGVyZWQgYWRkcmVzcyBmb3VuZCBmb3IgdGhpcyBHU1RJTi4gRW50ZXIgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1kYW5nZXJcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnZXJyb3InXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBsb29rdXAgZmFpbGVkLiBFbnRlciBtYW51YWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTUgc3ViLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZU9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAxPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lT25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZU9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lVHdvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVUd29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lVHdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNpdHk8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NpdHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5IGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RhdGUvcHJvdmluY2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCIgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2Q8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncHJvcmF0ZS1lZGl0LScgKyBpXCIgdmFsdWU9XCJwcm9yYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIFtmb3JdPVwiJ3Byb3JhdGUtZWRpdC0nICsgaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcmF0ZSDigJQgYmlsbCBmb3IgYWN0dWFsIHdvcmtpbmcgZGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmbGF0LWVkaXQtJyArIGlcIiB2YWx1ZT1cImZsYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgW2Zvcl09XCInZmxhdC1lZGl0LScgKyBpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGF0IOKAlCBiaWxsIGZvciB0aGUgd2hvbGUgbW9udGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZVNpbmdsZV8nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VTaW5nbGVfJyArIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluIGFkdmFuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5hdChpKS5nZXQoJ2FkdmFuY2VJbnZvaWNlJyk/LnZhbHVlXCIgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgZnctc2VtaWJvbGRcIj5BZHZhbmNlIGZyZXF1ZW5jeTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VQZXJpb2RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhZHZhbmNlUGVyaW9kT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2UgaW52b2ljZSB3aWxsIGNvdmVyIHt7IGFkdmFuY2VJbnZvaWNlUmFuZ2UoYmlsbGluZ0dyb3Vwcy5hdChpKS5nZXQoJ2FkdmFuY2VQZXJpb2QnKT8udmFsdWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG1iLTVcIiAqbmdJZj1cInN1YnNjcmliZWRQcm9kdWN0cy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWItM1wiPlByb2R1Y3QgQmlsbGluZyBNZXRob2Q8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbSBib3R0b20tYm9yZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgTWV0aG9kPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcHJvZCBvZiBzdWJzY3JpYmVkUHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeVwiPnt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2QucHJvZHVjdE5hbWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0UHJvZHVjdEJpbGxpbmdNZXRob2QoaSwgcHJvZC5wcm9kdWN0TmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoaSwgcHJvZC5wcm9kdWN0TmFtZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImJpbGxpbmdNZXRob2RPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImN1cnJlbmN5T3B0aW9uc1wiIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0YXhDYWxjdWxhdGlvblR5cGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwidGF4Q2FsY3VsYXRpb25UeXBlT3B0aW9uc1wiIFtsYWJlbF09XCInVGF4IENhbGN1bGF0aW9uJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRDeWNsZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50VGVybU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgVGVybSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWRcIj48L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlRW1haWxDaGlwKGVtYWlsLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiAoa2V5ZG93bik9XCJvbkVtYWlsS2V5RG93bigkZXZlbnQsIGkpXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtaW5wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2ljZSBlbWFpbCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlN0b3JlIExpc3QgQW5uZXh1cmUgQXR0YWNoZWQgV2l0aCBJbnZvaWNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cInllc1wiIFt2YWx1ZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwieWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cIm5vXCIgW3ZhbHVlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWVuZCBtdC01XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyB8fCBncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZShpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+TmV4dDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuPC9mb3JtPlxuPC9kaXY+Il19