ngx-dynamic-entity 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -139
- package/esm2022/lib/field-types/array-field.component.mjs +112 -104
- package/esm2022/lib/field-types/boolean-field.component.mjs +62 -61
- package/esm2022/lib/field-types/checkbox-field.component.mjs +48 -47
- package/esm2022/lib/field-types/currency-field.component.mjs +54 -53
- package/esm2022/lib/field-types/date-field.component.mjs +46 -45
- package/esm2022/lib/field-types/dropdown-field.component.mjs +89 -87
- package/esm2022/lib/field-types/email-field.component.mjs +64 -63
- package/esm2022/lib/field-types/entity-ref-field.component.mjs +85 -71
- package/esm2022/lib/field-types/field-component.contract.mjs +2 -0
- package/esm2022/lib/field-types/file-field.component.mjs +88 -87
- package/esm2022/lib/field-types/group-field.component.mjs +50 -50
- package/esm2022/lib/field-types/image-field.component.mjs +92 -91
- package/esm2022/lib/field-types/month-year-field.component.mjs +80 -79
- package/esm2022/lib/field-types/multi-select-field.component.mjs +66 -65
- package/esm2022/lib/field-types/number-field.component.mjs +71 -75
- package/esm2022/lib/field-types/password-field.component.mjs +68 -67
- package/esm2022/lib/field-types/radio-field.component.mjs +66 -65
- package/esm2022/lib/field-types/text-field.component.mjs +81 -74
- package/esm2022/lib/field-types/textarea-field.component.mjs +48 -47
- package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +53 -6
- package/esm2022/lib/form/dynamic-form.component.mjs +309 -20
- package/esm2022/lib/form/dynamic-record-form.component.mjs +36 -11
- package/esm2022/lib/providers/provide-field-types.mjs +1 -1
- package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +8 -2
- package/esm2022/lib/services/cascade-data.service.mjs +2 -2
- package/esm2022/lib/services/entity-ref-cache.mjs +1 -1
- package/esm2022/lib/services/entity-ref-registry.service.mjs +2 -2
- package/esm2022/lib/services/entity-ref-selection.service.mjs +1 -1
- package/esm2022/lib/services/entity-reference.service.mjs +1 -1
- package/esm2022/lib/services/field-registry.service.mjs +1 -1
- package/esm2022/lib/services/file-upload.service.mjs +1 -1
- package/esm2022/lib/services/lookup-registry.service.mjs +2 -2
- package/esm2022/lib/services/rbac.service.mjs +1 -1
- package/esm2022/lib/services/validation-messages.service.mjs +56 -0
- package/esm2022/lib/services/validator-registry.service.mjs +35 -2
- package/esm2022/lib/tokens/injection-tokens.mjs +35 -6
- package/esm2022/public-api.mjs +23 -2
- package/fesm2022/ngx-dynamic-entity.mjs +1754 -1236
- package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
- package/lib/field-types/array-field.component.d.ts +7 -1
- package/lib/field-types/dropdown-field.component.d.ts +2 -1
- package/lib/field-types/entity-ref-field.component.d.ts +12 -2
- package/lib/field-types/field-component.contract.d.ts +49 -0
- package/lib/field-types/group-field.component.d.ts +1 -1
- package/lib/field-types/multi-select-field.component.d.ts +1 -1
- package/lib/field-types/number-field.component.d.ts +1 -0
- package/lib/field-types/radio-field.component.d.ts +1 -1
- package/lib/field-types/text-field.component.d.ts +10 -2
- package/lib/form/dynamic-field/dynamic-field.component.d.ts +39 -4
- package/lib/form/dynamic-form.component.d.ts +155 -8
- package/lib/form/dynamic-record-form.component.d.ts +13 -2
- package/lib/providers/provide-ngx-dynamic-entity.d.ts +25 -3
- package/lib/services/cascade-data.service.d.ts +1 -1
- package/lib/services/entity-ref-registry.service.d.ts +1 -1
- package/lib/services/lookup-registry.service.d.ts +1 -1
- package/lib/services/validation-messages.service.d.ts +43 -0
- package/lib/services/validator-registry.service.d.ts +13 -1
- package/lib/tokens/injection-tokens.d.ts +42 -7
- package/package.json +17 -18
- package/public-api.d.ts +12 -0
- package/styles.css +579 -0
|
@@ -7,6 +7,11 @@ import { DynamicFieldComponent } from './dynamic-field/dynamic-field.component';
|
|
|
7
7
|
import { RulesEvaluationService } from '../services/rules-evaluation.service';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@angular/forms";
|
|
10
|
+
/**
|
|
11
|
+
* Distinguishes "no tab holds this field" from "the field holds undefined", so the tab walk
|
|
12
|
+
* can keep searching in the first case and stop in the second.
|
|
13
|
+
*/
|
|
14
|
+
const FIELD_NOT_FOUND = Symbol('field-not-found');
|
|
10
15
|
/**
|
|
11
16
|
* DynamicRecordFormComponent — comprehensive tabbed record view & edit component.
|
|
12
17
|
* Supports cross-tab rule evaluation, profile header, summary drawer (showOnMinimize),
|
|
@@ -356,14 +361,34 @@ export class DynamicRecordFormComponent {
|
|
|
356
361
|
controlFor(fieldId) {
|
|
357
362
|
return this.dynamicFormComp?.getControl(fieldId) ?? null;
|
|
358
363
|
}
|
|
359
|
-
/**
|
|
364
|
+
/**
|
|
365
|
+
* A field's current value, read from the record so it is stable during render.
|
|
366
|
+
*
|
|
367
|
+
* Resolved through `getTabData` so it honours exactly the nesting contract the form
|
|
368
|
+
* patches with — `{ tabId: { fieldId } }`, or the record root when the tab sets
|
|
369
|
+
* `flatData`. Reading the record flat instead is not a shortcut: it makes the summary
|
|
370
|
+
* display values the form never loaded, which reads as "the data is there" while every
|
|
371
|
+
* control behind it is empty.
|
|
372
|
+
*
|
|
373
|
+
* Walks sub-tabs as well: a summary, header, or profile field may sit on any tab at any
|
|
374
|
+
* depth.
|
|
375
|
+
*/
|
|
360
376
|
fieldValue(fieldId) {
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
377
|
+
const visit = (tabs = []) => {
|
|
378
|
+
for (const tab of tabs) {
|
|
379
|
+
const data = getTabData(tab.id, this.currentData(), this.config);
|
|
380
|
+
if (data && fieldId in data)
|
|
381
|
+
return data[fieldId];
|
|
382
|
+
if (tab.children) {
|
|
383
|
+
const found = visit(tab.children);
|
|
384
|
+
if (found !== FIELD_NOT_FOUND)
|
|
385
|
+
return found;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return FIELD_NOT_FOUND;
|
|
389
|
+
};
|
|
390
|
+
const result = visit(this.config?.tabs);
|
|
391
|
+
return result === FIELD_NOT_FOUND ? undefined : result;
|
|
367
392
|
}
|
|
368
393
|
isModified = computed(() => {
|
|
369
394
|
const orig = this.originalBaseline();
|
|
@@ -407,7 +432,7 @@ export class DynamicRecordFormComponent {
|
|
|
407
432
|
}
|
|
408
433
|
/** Summary values render through the shared core formatter, not a local stringifier. */
|
|
409
434
|
formatFieldValue(field) {
|
|
410
|
-
return formatDisplayValue(field.type, field.options, this.
|
|
435
|
+
return formatDisplayValue(field.type, field.options, this.fieldValue(field.id), this.language);
|
|
411
436
|
}
|
|
412
437
|
jumpToField(fieldId) {
|
|
413
438
|
// Find parent tab for field
|
|
@@ -427,11 +452,11 @@ export class DynamicRecordFormComponent {
|
|
|
427
452
|
}
|
|
428
453
|
}
|
|
429
454
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
430
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\r\n <!-- Record Header -->\r\n <div class=\"ngx-record-editor__header\">\r\n <div class=\"ngx-record-editor__title-group\">\r\n @if (profileImageUrl) {\r\n <img\r\n class=\"ngx-record-editor__avatar\"\r\n data-testid=\"header-profile-image\"\r\n [src]=\"profileImageUrl\"\r\n [alt]=\"recordTitle\"\r\n />\r\n } @else {\r\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\r\n {{ avatarLetter }}\r\n </div>\r\n }\r\n <div>\r\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\r\n {{ recordTitle }}\r\n </h2>\r\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Record-level status switch, outside section editing -->\r\n @if (headerToggleField; as toggleField) {\r\n <label class=\"ngx-record-editor__header-toggle\">\r\n <span>{{ formatFieldLabel(toggleField) }}</span>\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n data-testid=\"header-toggle\"\r\n [checked]=\"headerToggleValue\"\r\n [disabled]=\"recordReadOnly\"\r\n [attr.aria-checked]=\"headerToggleValue\"\r\n (change)=\"toggleHeaderStatus()\"\r\n />\r\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\r\n </label>\r\n }\r\n </div>\r\n\r\n <!-- Dismissible info banners (rules `info` action) -->\r\n @for (banner of infoBanners; track banner.fieldId) {\r\n <div\r\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\r\n role=\"status\"\r\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\r\n >\r\n <span>\u2139\uFE0F {{ banner.message }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"ngx-record-editor__banner-dismiss\"\r\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\r\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\r\n (click)=\"dismissInfoBanner(banner.fieldId)\"\r\n >\u2715</button>\r\n </div>\r\n }\r\n\r\n <!-- Modification baseline banner -->\r\n @if (isModified()) {\r\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\r\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\r\n </div>\r\n }\r\n\r\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\r\n @if (summaryFields().length > 0) {\r\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\r\n @for (sf of summaryFields(); track sf.id) {\r\n <div\r\n class=\"ngx-record-editor__summary-item\"\r\n [attr.data-testid]=\"'summary-' + sf.id\"\r\n (click)=\"jumpToField(sf.id)\"\r\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\r\n >\r\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\r\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\r\n @if (viewMode && !recordReadOnly) {\r\n <div class=\"ngx-record-editor__section-bar\">\r\n @if (isEditingActiveTab) {\r\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\r\n Save section\r\n </button>\r\n } @else {\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\r\n Edit section\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @if (Object.keys(sectionErrors()).length > 0) {\r\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\r\n @for (key of Object.keys(sectionErrors()); track key) {\r\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Array rows: listed here, edited in the drawer below -->\r\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\r\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\r\n <div class=\"ngx-record-editor__rows-head\">\r\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\r\n @if (!sectionReadOnly) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-form__reset\"\r\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\r\n (click)=\"openAddRow(arrayField)\"\r\n >+ Row</button>\r\n }\r\n </div>\r\n\r\n @for (row of rowsOf(arrayField); track $index) {\r\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\r\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\r\n @if (!sectionReadOnly) {\r\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\r\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\r\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\r\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\r\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\r\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!--\r\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\r\n tab view races the tab's own initialisation (the reference hit this with FormArray).\r\n -->\r\n @if (inlineRowField(); as rowField) {\r\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\r\n <div class=\"ngx-record-editor__rows-head\">\r\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\r\n </div>\r\n\r\n <div class=\"ngx-form__panel\">\r\n @for (child of rowField.children ?? []; track child.id) {\r\n <ngx-dynamic-field\r\n [field]=\"child\"\r\n [control]=\"inlineRowForm!.get(child.id)!\"\r\n [config]=\"config\"\r\n [language]=\"language\"\r\n [readonly]=\"false\"\r\n [userRoles]=\"userRoles\"\r\n [style.gridColumn]=\"'span 12'\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-record-editor__section-bar\">\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\r\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Main Dynamic Form -->\r\n <ngx-dynamic-form\r\n [config]=\"config\"\r\n [rules]=\"rules\"\r\n [initialData]=\"initialData\"\r\n [originalData]=\"originalBaseline()\"\r\n [userRoles]=\"userRoles\"\r\n [language]=\"language\"\r\n [readonly]=\"sectionReadOnly\"\r\n [readOnlyFields]=\"readOnlyFields\"\r\n [showInfoBanners]=\"false\"\r\n [loading]=\"loading\"\r\n [error]=\"error\"\r\n (formChange)=\"onFormChange($event)\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formReset)=\"onFormReset()\"\r\n (activeTabChange)=\"onActiveTabChange($event)\"\r\n />\r\n</div>\r\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
|
|
455
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange", "saveRejected"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
|
|
431
456
|
}
|
|
432
457
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, decorators: [{
|
|
433
458
|
type: Component,
|
|
434
|
-
args: [{ selector: 'ngx-dynamic-record-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicFormComponent, DynamicFieldComponent], template: "<div class=\"ngx-record-editor\">\r\n <!-- Record Header -->\r\n <div class=\"ngx-record-editor__header\">\r\n <div class=\"ngx-record-editor__title-group\">\r\n @if (profileImageUrl) {\r\n <img\r\n class=\"ngx-record-editor__avatar\"\r\n data-testid=\"header-profile-image\"\r\n [src]=\"profileImageUrl\"\r\n [alt]=\"recordTitle\"\r\n />\r\n } @else {\r\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\r\n {{ avatarLetter }}\r\n </div>\r\n }\r\n <div>\r\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\r\n {{ recordTitle }}\r\n </h2>\r\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Record-level status switch, outside section editing -->\r\n @if (headerToggleField; as toggleField) {\r\n <label class=\"ngx-record-editor__header-toggle\">\r\n <span>{{ formatFieldLabel(toggleField) }}</span>\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n data-testid=\"header-toggle\"\r\n [checked]=\"headerToggleValue\"\r\n [disabled]=\"recordReadOnly\"\r\n [attr.aria-checked]=\"headerToggleValue\"\r\n (change)=\"toggleHeaderStatus()\"\r\n />\r\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\r\n </label>\r\n }\r\n </div>\r\n\r\n <!-- Dismissible info banners (rules `info` action) -->\r\n @for (banner of infoBanners; track banner.fieldId) {\r\n <div\r\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\r\n role=\"status\"\r\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\r\n >\r\n <span>\u2139\uFE0F {{ banner.message }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"ngx-record-editor__banner-dismiss\"\r\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\r\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\r\n (click)=\"dismissInfoBanner(banner.fieldId)\"\r\n >\u2715</button>\r\n </div>\r\n }\r\n\r\n <!-- Modification baseline banner -->\r\n @if (isModified()) {\r\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\r\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\r\n </div>\r\n }\r\n\r\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\r\n @if (summaryFields().length > 0) {\r\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\r\n @for (sf of summaryFields(); track sf.id) {\r\n <div\r\n class=\"ngx-record-editor__summary-item\"\r\n [attr.data-testid]=\"'summary-' + sf.id\"\r\n (click)=\"jumpToField(sf.id)\"\r\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\r\n >\r\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\r\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\r\n @if (viewMode && !recordReadOnly) {\r\n <div class=\"ngx-record-editor__section-bar\">\r\n @if (isEditingActiveTab) {\r\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\r\n Save section\r\n </button>\r\n } @else {\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\r\n Edit section\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @if (Object.keys(sectionErrors()).length > 0) {\r\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\r\n @for (key of Object.keys(sectionErrors()); track key) {\r\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Array rows: listed here, edited in the drawer below -->\r\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\r\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\r\n <div class=\"ngx-record-editor__rows-head\">\r\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\r\n @if (!sectionReadOnly) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-form__reset\"\r\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\r\n (click)=\"openAddRow(arrayField)\"\r\n >+ Row</button>\r\n }\r\n </div>\r\n\r\n @for (row of rowsOf(arrayField); track $index) {\r\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\r\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\r\n @if (!sectionReadOnly) {\r\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\r\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\r\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\r\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\r\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\r\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!--\r\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\r\n tab view races the tab's own initialisation (the reference hit this with FormArray).\r\n -->\r\n @if (inlineRowField(); as rowField) {\r\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\r\n <div class=\"ngx-record-editor__rows-head\">\r\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\r\n </div>\r\n\r\n <div class=\"ngx-form__panel\">\r\n @for (child of rowField.children ?? []; track child.id) {\r\n <ngx-dynamic-field\r\n [field]=\"child\"\r\n [control]=\"inlineRowForm!.get(child.id)!\"\r\n [config]=\"config\"\r\n [language]=\"language\"\r\n [readonly]=\"false\"\r\n [userRoles]=\"userRoles\"\r\n [style.gridColumn]=\"'span 12'\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-record-editor__section-bar\">\r\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\r\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Main Dynamic Form -->\r\n <ngx-dynamic-form\r\n [config]=\"config\"\r\n [rules]=\"rules\"\r\n [initialData]=\"initialData\"\r\n [originalData]=\"originalBaseline()\"\r\n [userRoles]=\"userRoles\"\r\n [language]=\"language\"\r\n [readonly]=\"sectionReadOnly\"\r\n [readOnlyFields]=\"readOnlyFields\"\r\n [showInfoBanners]=\"false\"\r\n [loading]=\"loading\"\r\n [error]=\"error\"\r\n (formChange)=\"onFormChange($event)\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formReset)=\"onFormReset()\"\r\n (activeTabChange)=\"onActiveTabChange($event)\"\r\n />\r\n</div>\r\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"] }]
|
|
459
|
+
args: [{ selector: 'ngx-dynamic-record-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicFormComponent, DynamicFieldComponent], template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"] }]
|
|
435
460
|
}], propDecorators: { config: [{
|
|
436
461
|
type: Input
|
|
437
462
|
}], rules: [{
|
|
@@ -466,4 +491,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
466
491
|
type: ViewChild,
|
|
467
492
|
args: [DynamicFormComponent]
|
|
468
493
|
}] } });
|
|
469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUE4QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFOUU7Ozs7R0FJRztBQW9NSCxNQUFNLE9BQU8sMEJBQTBCO0lBQzVCLE1BQU0sQ0FBb0I7SUFDMUIsS0FBSyxDQUFjO0lBQ25CLFdBQVcsQ0FBdUI7SUFDbEMsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixLQUFLLEdBQWtCLElBQUksQ0FBQztJQUNyQyw4RkFBOEY7SUFDckYsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUNy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UUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFRRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRTBCLGVBQWU7c0JBQS9DLFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBzaWduYWwsXHJcbiAgY29tcHV0ZWQsXHJcbiAgaW5qZWN0LFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB0eXBlIHsgRW50aXR5Rm9ybUNvbmZpZywgRm9ybVJ1bGUsIE5lc3RlZEZpZWxkQ29uZmlnLCBOZXN0ZWRUYWJDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IGZpbmRUYWIsIGZvcm1hdERpc3BsYXlWYWx1ZSwgZ2V0VGFiRGF0YSwgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IER5bmFtaWNGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJ1bGVzRXZhbHVhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ydWxlcy1ldmFsdWF0aW9uLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIER5bmFtaWNSZWNvcmRGb3JtQ29tcG9uZW50IOKAlCBjb21wcmVoZW5zaXZlIHRhYmJlZCByZWNvcmQgdmlldyAmIGVkaXQgY29tcG9uZW50LlxyXG4gKiBTdXBwb3J0cyBjcm9zcy10YWIgcnVsZSBldmFsdWF0aW9uLCBwcm9maWxlIGhlYWRlciwgc3VtbWFyeSBkcmF3ZXIgKHNob3dPbk1pbmltaXplKSxcclxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtcmVjb3JkLWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRHluYW1pY0Zvcm1Db21wb25lbnQsIER5bmFtaWNGaWVsZENvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlczogW1xyXG4gICAgYFxyXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3Ige1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICBnYXA6IDE2cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XHJcbiAgICAgICAgcGFkZGluZzogMjBweDtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxNnB4O1xyXG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjNmNGY2O1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fdGl0bGUtZ3JvdXAge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBnYXA6IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXIge1xyXG4gICAgICAgIHdpZHRoOiA0OHB4O1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7XHJcbiAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjtcclxuICAgICAgICBjb2xvcjogIzRmNDZlNTtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcclxuICAgICAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZSB7XHJcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGUge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgICAgICBjb2xvcjogIzZiNzI4MDtcclxuICAgICAgfVxyXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBnYXA6IDhweDtcclxuICAgICAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICAgICAgY29sb3I6ICMzNzQxNTE7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXItdG9nZ2xlLXRleHQge1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWluZm8ge1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcclxuICAgICAgICBjb2xvcjogIzFkNGVkODtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICAgIGdhcDogMTJweDtcclxuICAgICAgfVxyXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci1kaXNtaXNzIHtcclxuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3M6aG92ZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yIHtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZWNhY2E7XHJcbiAgICAgICAgY29sb3I6ICNiOTFjMWM7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWJhciB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWhpbnQge1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogYXV0bztcclxuICAgICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLXdhcm5pbmcge1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZiZWI7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlZjNjNztcclxuICAgICAgICBjb2xvcjogI2I0NTMwOTtcclxuICAgICAgfVxyXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3Jvd3Mge1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgZ2FwOiA2cHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWQge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3cge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBnYXA6IDhweDtcclxuICAgICAgICBwYWRkaW5nOiA2cHggOHB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LXRleHQge1xyXG4gICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0biB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDJweCA4cHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3ctZW1wdHkge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICBjb2xvcjogIzZiNzI4MDtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXIge1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkYmVhZmU7XHJcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcclxuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgICAgcGFkZGluZzogMTRweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbCB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZjNmNGY2O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XHJcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcclxuICAgICAgICBnYXA6IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW0ge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgICAgcGFkZGluZzogNnB4IDEwcHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW06aG92ZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWxhYmVsIHtcclxuICAgICAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xyXG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIH1cclxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbCB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgICAgY29sb3I6ICMxZjI5Mzc7XHJcbiAgICAgIH1cclxuICAgIGAsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNSZWNvcmRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBjb25maWchOiBFbnRpdHlGb3JtQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHJ1bGVzPzogRm9ybVJ1bGVbXTtcclxuICBASW5wdXQoKSBpbml0aWFsRGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgPSAnZW4nO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAvKiogV2hvbGUgcmVjb3JkIHJlYWQtb25seSwgcmVnYXJkbGVzcyBvZiBSQkFDLiBFcXVpdmFsZW50IHRvIHRoZSByZWZlcmVuY2UncyBgaXNSZWFkT25seWAuICovXHJcbiAgQElucHV0KCkgaXNSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBTcGVjaWZpYyBmaWVsZCBpZHMgZm9yY2VkIHJlYWQtb25seSB3aGlsZSB0aGUgcmVzdCBvZiB0aGUgcmVjb3JkIHN0YXlzIGVkaXRhYmxlLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRPbmx5RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIE9wZW4gdGhlIHJlY29yZCByZWFkLW9ubHksIHdpdGggYSBwZXItdGFiIFwiRWRpdCBzZWN0aW9uXCIgZmxvdyDigJQgb25lIHRhYiBpcyBlZGl0ZWQgYW5kXHJcbiAgICogdmFsaWRhdGVkIGF0IGEgdGltZS4gVGhpcyBpcyB0aGUgZnJhbWV3b3JrJ3MgYEVudGl0eVJlY29yZENvbXBvbmVudGAgbW9kZWwgYW5kIHRoZVxyXG4gICAqIGRlZmF1bHQgaGVyZS5cclxuICAgKlxyXG4gICAqIFNldCBmYWxzZSBmb3IgYSBkaXJlY3RseSBlZGl0YWJsZSByZWNvcmQgd2l0aCBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24uXHJcbiAgICovXHJcbiAgQElucHV0KCkgdmlld01vZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcclxuICBAT3V0cHV0KCkgZm9ybUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcclxuICBAT3V0cHV0KCkgZm9ybVJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIC8qKiBPbmUgdGFiIHNlY3Rpb24gd2FzIHNhdmVkLiBDYXJyaWVzIHRoZSB3aG9sZSByZWNvcmQsIHBsdXMgd2hpY2ggdGFiIHdhcyBlZGl0ZWQuICovXHJcbiAgQE91dHB1dCgpIHNlY3Rpb25TYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRhYklkOiBzdHJpbmc7IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiB9PigpO1xyXG5cclxuICBAVmlld0NoaWxkKER5bmFtaWNGb3JtQ29tcG9uZW50KSBkeW5hbWljRm9ybUNvbXA/OiBEeW5hbWljRm9ybUNvbXBvbmVudDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBydWxlc0V2YWx1YXRpb24gPSBpbmplY3QoUnVsZXNFdmFsdWF0aW9uU2VydmljZSk7XHJcblxyXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRhID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcclxuICByZWFkb25seSBvcmlnaW5hbEJhc2VsaW5lID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5mbyBiYW5uZXJzIHRoZSB1c2VyIGhhcyBkaXNtaXNzZWQsIGJ5IGZpZWxkIGlkLlxyXG4gICAqXHJcbiAgICogVGhlIHJlZmVyZW5jZSdzIGNvbnRyYWN0OiBhbiBpbmZvIGJhbm5lciBwZXJzaXN0cyB1bnRpbCBkaXNtaXNzZWQsICoqbm90KiogdW50aWwgdGhlXHJcbiAgICogdmFsdWUgY2hhbmdlcy4gRGlzbWlzc2FsIGlzIGtleWVkIGJ5IGZpZWxkIHNvIHJlLXRyaWdnZXJpbmcgYSBkaWZmZXJlbnQgZmllbGQncyBydWxlXHJcbiAgICogc3RpbGwgc2hvd3MuIFJlLWFybWVkIHdoZW4gYSBkaWZmZXJlbnQgcmVjb3JkIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc21pc3NlZCA9IHNpZ25hbDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0PHN0cmluZz4oKSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm8gYmFubmVycyBmcm9tIHRoZSBydWxlcyBlbmdpbmUgdGhhdCBhcmUgc3RpbGwgc2hvd2luZy5cclxuICAgKlxyXG4gICAqIEEgZ2V0dGVyLCBub3QgYSBgY29tcHV0ZWRgOiB0aGUgc291cmNlIGlzIGBkeW5hbWljRm9ybUNvbXBgLCBhIFZpZXdDaGlsZC4gQSBjb21wdXRlZFxyXG4gICAqIGV2YWx1YXRlZCBiZWZvcmUgdGhlIHZpZXcgaW5pdGlhbGlzZXMgd291bGQgY2FwdHVyZSBubyBkZXBlbmRlbmN5IG9uIHRoZSBjaGlsZCdzXHJcbiAgICogYHJ1bGVSZXN1bHRgIHNpZ25hbCBhbmQgdGhlbiBuZXZlciByZWNvbXB1dGUuIFJlYWQgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBpbnN0ZWFkLlxyXG4gICAqL1xyXG4gIGdldCBpbmZvQmFubmVycygpOiB7IGZpZWxkSWQ6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8ucnVsZVJlc3VsdCgpO1xyXG4gICAgY29uc3QgZ29uZSA9IHRoaXMuZGlzbWlzc2VkKCk7XHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0Py5pbmZvQmFubmVycyA/PyB7fSlcclxuICAgICAgLmZpbHRlcigoW2ZpZWxkSWRdKSA9PiAhZ29uZS5oYXMoZmllbGRJZCkpXHJcbiAgICAgIC5tYXAoKFtmaWVsZElkLCBtZXNzYWdlXSkgPT4gKHsgZmllbGRJZCwgbWVzc2FnZTogU3RyaW5nKG1lc3NhZ2UpIH0pKTtcclxuICB9XHJcblxyXG4gIGRpc21pc3NJbmZvQmFubmVyKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNtaXNzZWQuc2V0KG5ldyBTZXQodGhpcy5kaXNtaXNzZWQoKSkuYWRkKGZpZWxkSWQpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gbm90aGluZyBpbiB0aGUgcmVjb3JkIG1heSBiZSBlZGl0ZWQuICovXHJcbiAgZ2V0IHJlY29yZFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgfHwgdGhpcy5pc1JlYWRPbmx5O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIElubGluZSBhcnJheS1yb3cgZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogQSByb3cgb2YgYW4gYGFycmF5YCBmaWVsZCBpcyBlZGl0ZWQgaW4gYSBkcmF3ZXIsIG5vdCBpbmxpbmUgaW4gdGhlIHRhYiBwYW5lbC5cclxuICAgKlxyXG4gICAqIFRoZSBkcmF3ZXIgaXMgcmVuZGVyZWQgb3V0c2lkZSB0aGUgdGFiIGNvbnRhaW5lciBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIGZvdW5kIHRoYXRcclxuICAgKiBidWlsZGluZyBhIHJvdydzIEZvcm1Hcm91cCBpbnNpZGUgdGhlIHRhYiB2aWV3IHJhY2VzIHRoZSB0YWIncyBvd24gaW5pdGlhbGlzYXRpb24sIHNvXHJcbiAgICogdGhlIHJvdyBmb3JtIGlzIGtlcHQgZGV0YWNoZWQgYW5kIG9ubHkgcHVzaGVkIGludG8gdGhlIEZvcm1BcnJheSBvbiBzYXZlLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlubGluZVJvd0ZpZWxkID0gc2lnbmFsPE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbD4obnVsbCk7XHJcbiAgcmVhZG9ubHkgaW5saW5lUm93SW5kZXggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcbiAgaW5saW5lUm93Rm9ybTogRm9ybUdyb3VwIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBgYXJyYXlgIGZpZWxkcyBvbiB0aGUgdGFiIGN1cnJlbnRseSBzaG93biwgc28gdGhlIHRlbXBsYXRlIGNhbiBsaXN0IHRoZWlyIHJvd3MuICovXHJcbiAgZ2V0IGFycmF5RmllbGRzRm9yQWN0aXZlVGFiKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xyXG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmFjdGl2ZVRhYklkO1xyXG4gICAgY29uc3QgdGFiID0gdGFiSWQgPyBmaW5kVGFiKHRoaXMuY29uZmlnPy50YWJzLCB0YWJJZCkgOiBudWxsO1xyXG4gICAgcmV0dXJuICh0YWI/LmZpZWxkcyA/PyBbXSkuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnYXJyYXknKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJvd3MgY3VycmVudGx5IGhlbGQgYnkgYW4gYGFycmF5YCBmaWVsZCwgcmVhZCBmcm9tIHRoZSByZWNvcmQgdmFsdWUuXHJcbiAgICpcclxuICAgKiBEZWxpYmVyYXRlbHkgbm90IHJlYWQgb2ZmIHRoZSBjaGlsZCdzIEZvcm1BcnJheTogdGhhdCBjb250cm9sIG9ubHkgZXhpc3RzIG9uY2UgdGhlXHJcbiAgICogY2hpbGQgaGFzIGluaXRpYWxpc2VkLCBzbyByZW5kZXJpbmcgZnJvbSBpdCBjaGFuZ2VkIHZhbHVlIG1pZC1wYXNzLiBgY3VycmVudERhdGFgIGlzIGFcclxuICAgKiBzaWduYWwgc2VlZGVkIGZyb20gYGluaXRpYWxEYXRhYCBhbmQga2VwdCBjdXJyZW50IGJ5IHRoZSBjaGlsZCdzIGBmb3JtQ2hhbmdlYC5cclxuICAgKi9cclxuICByb3dzT2YoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XHJcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuYWN0aXZlVGFiSWQ7XHJcbiAgICBjb25zdCB0YWJEYXRhID0gdGFiSWQgPyBnZXRUYWJEYXRhKHRhYklkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSA6IG51bGw7XHJcbiAgICBjb25zdCByb3dzID0gKHRhYkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsKT8uW2ZpZWxkLmlkXTtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJvd3MpID8gKHJvd3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgOiBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgcm93IHJlbmRlcmVkIGFzIHRleHQsIHNvIHRoZSBsaXN0IGlzIHJlYWRhYmxlIHdpdGhvdXQgb3BlbmluZyB0aGUgZHJhd2VyLiAqL1xyXG4gIHJvd1N1bW1hcnkoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbHVlID0gcm93ID8/IHt9O1xyXG4gICAgY29uc3QgcGFydHMgPSAoZmllbGQuY2hpbGRyZW4gPz8gW10pXHJcbiAgICAgIC5tYXAoY2hpbGQgPT4gdmFsdWVbY2hpbGQuaWRdKVxyXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gJycpXHJcbiAgICAgIC5tYXAodiA9PiAodHlwZW9mIHYgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodikgOiBTdHJpbmcodikpKTtcclxuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnKGVtcHR5KSc7XHJcbiAgfVxyXG5cclxuICBvcGVuQWRkUm93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XHJcbiAgICB0aGlzLmlubGluZVJvd0ZpZWxkLnNldChmaWVsZCk7XHJcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcclxuICAgIHRoaXMuaW5saW5lUm93Rm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wPy5jcmVhdGVBcnJheVJvdyhmaWVsZCkgYXMgRm9ybUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgb3BlbkVkaXRSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uUmVhZE9ubHkpIHJldHVybjtcclxuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcclxuICAgIHRoaXMuaW5saW5lUm93SW5kZXguc2V0KGluZGV4KTtcclxuICAgIHRoaXMuaW5saW5lUm93Rm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wPy5jcmVhdGVBcnJheVJvdyhmaWVsZCwgdGhpcy5yb3dzT2YoZmllbGQpW2luZGV4XSkgYXMgRm9ybUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsUm93KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQobnVsbCk7XHJcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcclxuICAgIHRoaXMuaW5saW5lUm93Rm9ybSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogQ29tbWl0IHRoZSBkcmF3ZXIgaW50byB0aGUgRm9ybUFycmF5LiBSdWxlcyByZS1ldmFsdWF0ZSBvZmYgdGhlIHJlc3VsdGluZyB2YWx1ZSBjaGFuZ2UuICovXHJcbiAgc2F2ZVJvdygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5pbmxpbmVSb3dGaWVsZCgpO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xyXG4gICAgaWYgKCFmaWVsZCB8fCAhZm9ybSB8fCAhdGhpcy5pbmxpbmVSb3dGb3JtKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuaW5saW5lUm93Rm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuaW5saW5lUm93Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcnJheSA9IGZvcm0uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWFycmF5KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmlubGluZVJvd0luZGV4KCk7XHJcbiAgICBpZiAoaW5kZXggPT09IG51bGwpIGFycmF5LnB1c2goZm9ybS5jcmVhdGVBcnJheVJvdyhmaWVsZCwgdGhpcy5pbmxpbmVSb3dGb3JtLnZhbHVlKSk7XHJcbiAgICBlbHNlIGFycmF5LmF0KGluZGV4KS5wYXRjaFZhbHVlKHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSk7XHJcblxyXG4gICAgYXJyYXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xyXG4gICAgdGhpcy5jYW5jZWxSb3coKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVJvdyhmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xyXG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XHJcbiAgICBhcnJheT8ucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgYXJyYXk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcclxuICAgIGlmICh0aGlzLmlubGluZVJvd0luZGV4KCkgPT09IGluZGV4KSB0aGlzLmNhbmNlbFJvdygpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFBlci10YWIgc2VjdGlvbiBlZGl0aW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGFiIGN1cnJlbnRseSBvcGVuIGZvciBlZGl0aW5nLCBvciBudWxsIHdoZW4gdGhlIHJlY29yZCBpcyBiZWluZyB2aWV3ZWQuXHJcbiAgICpcclxuICAgKiBUaGUgcmVmZXJlbmNlIGVkaXRzIG9uZSB0YWIgc2VjdGlvbiBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHJlY29yZCwgYW5kXHJcbiAgICogdmFsaWRhdGVzIG9ubHkgdGhhdCBzZWN0aW9uIG9uIHNhdmUg4oCUIGEgcmVxdWlyZWQgZmllbGQgb24gYW4gdW50b3VjaGVkIHRhYiBtdXN0IG5vdFxyXG4gICAqIGJsb2NrIHNhdmluZyB0aGUgdGFiIHlvdSBhcmUgYWN0dWFsbHkgd29ya2luZyBvbi5cclxuICAgKi9cclxuICByZWFkb25seSBlZGl0aW5nVGFiSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YWIgdGhlIGlubmVyIGZvcm0gaXMgc2hvd2luZy5cclxuICAgKlxyXG4gICAqIFRyYWNrZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgVmlld0NoaWxkLiBUaGUgY2hpbGQgcmVzb2x2ZXMgaXRzIGZpcnN0IHRhYiBhc1xyXG4gICAqIHBhcnQgb2YgaXRzIG93biBpbml0aWFsaXNhdGlvbiwgc28gcmVhZGluZyBpdCBkdXJpbmcgdGhpcyBjb21wb25lbnQncyByZW5kZXIgY2hhbmdlZFxyXG4gICAqIHZhbHVlIG1pZC1wYXNzIOKAlCBhbiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZCBlcnJvci4gU2VlZGVkIGZyb20gdGhlXHJcbiAgICogY29uZmlnIGFuZCBrZXB0IGluIHN0ZXAgYnkgdGhlIGNoaWxkJ3MgYGFjdGl2ZVRhYkNoYW5nZWAgb3V0cHV0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlVGFiSWRTaWcgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIGdldCBhY3RpdmVUYWJJZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYklkU2lnKCk7XHJcbiAgfVxyXG5cclxuICBvbkFjdGl2ZVRhYkNoYW5nZSh0YWJJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJZFNpZygpID09PSB0YWJJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5hY3RpdmVUYWJJZFNpZy5zZXQodGFiSWQpO1xyXG4gICAgLy8gRWRpdGluZyBkb2VzIG5vdCBmb2xsb3cgdGhlIHVzZXIgdG8gYW5vdGhlciB0YWIuXHJcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XHJcbiAgICB0aGlzLmNhbmNlbFJvdygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZpcnN0IHRhYiBhIHVzZXIgY2FuIHNlZSwgdXNlZCB0byBzZWVkIHRoZSBhY3RpdmUgdGFiIGJlZm9yZSB0aGUgY2hpbGQgcmVwb3J0cyBvbmUuICovXHJcbiAgcHJpdmF0ZSBmaXJzdFZpc2libGVUYWJJZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFicz8uZmluZCh0ID0+IHQudmlzaWJpbGl0eSAhPT0gZmFsc2UpPy5pZCA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVycm9ycyBmcm9tIHRoZSBsYXN0IHNhdmUgYXR0ZW1wdCwgYnkgZmllbGQgaWQuICovXHJcbiAgcmVhZG9ubHkgc2VjdGlvbkVycm9ycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBhY2Nlc3MgdG8gYE9iamVjdC5rZXlzYCBmb3IgaXRlcmF0aW5nIHRoZSBlcnJvciBtYXAuICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9iamVjdCA9IE9iamVjdDtcclxuXHJcbiAgZ2V0IGlzRWRpdGluZ0FjdGl2ZVRhYigpOiBib29sZWFuIHtcclxuICAgIC8vIFdpdGhvdXQgdmlldyBtb2RlIHRoZXJlIGlzIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbiDigJQgZXZlcnl0aGluZyBpcyBhbHdheXMgZWRpdGFibGUuXHJcbiAgICBpZiAoIXRoaXMudmlld01vZGUpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuICEhdGhpcy5hY3RpdmVUYWJJZCAmJiB0aGlzLmVkaXRpbmdUYWJJZCgpID09PSB0aGlzLmFjdGl2ZVRhYklkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZpZWxkcyByZW5kZXIgcmVhZC1vbmx5IHVubGVzcyB0aGVpciBvd24gdGFiIGlzIHRoZSBvbmUgYmVpbmcgZWRpdGVkLiAqL1xyXG4gIGdldCBzZWN0aW9uUmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWNvcmRSZWFkT25seSB8fCAhdGhpcy5pc0VkaXRpbmdBY3RpdmVUYWI7XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy52aWV3TW9kZSB8fCB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmFjdGl2ZVRhYklkKSByZXR1cm47XHJcbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcclxuICAgIHRoaXMuZWRpdGluZ1RhYklkLnNldCh0aGlzLmFjdGl2ZVRhYklkKTtcclxuICB9XHJcblxyXG4gIC8qKiBEaXNjYXJkIHRoaXMgc2VjdGlvbidzIGVkaXRzLCByZXN0b3JpbmcgZWFjaCBmaWVsZCBmcm9tIHRoZSBzZXNzaW9uIGJhc2VsaW5lLiAqL1xyXG4gIGNhbmNlbFNlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XHJcbiAgICBpZiAodGFiSWQgJiYgZm9ybSkge1xyXG4gICAgICBjb25zdCB0YWIgPSBmaW5kVGFiKHRoaXMuY29uZmlnPy50YWJzLCB0YWJJZCk7XHJcbiAgICAgIGNvbnN0IGJhc2VsaW5lVGFiID0gKGdldFRhYkRhdGEodGFiSWQsIHRoaXMub3JpZ2luYWxCYXNlbGluZSgpLCB0aGlzLmNvbmZpZykgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRhYj8uZmllbGRzID8/IFtdKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZWxpbmVWYWx1ZSA9IGJhc2VsaW5lVGFiW2ZpZWxkLmlkXTtcclxuXHJcbiAgICAgICAgLy8gQSBGb3JtQXJyYXkgY2Fubm90IGJlIHJlc3RvcmVkIHdpdGggc2V0VmFsdWUg4oCUIHRoYXQgZGVtYW5kcyBhIHZhbHVlIHNoYXBlZCBleGFjdGx5XHJcbiAgICAgICAgLy8gbGlrZSB0aGUgY3VycmVudCByb3dzLiBSZWJ1aWxkIGl0IGZyb20gdGhlIGJhc2VsaW5lIHJvd3MgaW5zdGVhZC5cclxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm0uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0YWJJZCk7XHJcbiAgICAgICAgaWYgKGFycmF5KSB7XHJcbiAgICAgICAgICBhcnJheS5jbGVhcigpO1xyXG4gICAgICAgICAgZm9yIChjb25zdCByb3cgb2YgQXJyYXkuaXNBcnJheShiYXNlbGluZVZhbHVlKSA/IGJhc2VsaW5lVmFsdWUgOiBbXSkge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHJvdykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJyYXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKT8uc2V0VmFsdWUoYmFzZWxpbmVWYWx1ZSA/PyBudWxsKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnREYXRhLnNldChmb3JtLmV4dHJhY3RSZWNvcmQoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcclxuICAgIHRoaXMuZWRpdGluZ1RhYklkLnNldChudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIHRoaXMgc2VjdGlvbiBvbmx5LCB0aGVuIGVtaXQgaXQuIFZhbGlkYXRpb24gaXMgc2NvcGVkIHR3byB3YXlzOiBBbmd1bGFyXHJcbiAgICogdmFsaWRpdHkgb2YgdGhlIHRhYidzIG93biBjb250cm9scywgYW5kIHJ1bGVzIGZpbHRlcmVkIHRvIHRoaXMgdGFiIOKAlCBhIHJ1bGUgdGFyZ2V0aW5nXHJcbiAgICogYSBoaWRkZW4gdGFiIG11c3Qgbm90IGJsb2NrIHRoZSBzYXZlICh0aGUgcmVmZXJlbmNlJ3MgT1YwLTk2OCBmaXgpLlxyXG4gICAqL1xyXG4gIHNhdmVTZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmVkaXRpbmdUYWJJZCgpO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xyXG4gICAgaWYgKCF0YWJJZCB8fCAhZm9ybSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKTtcclxuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcclxuICAgICAgY29uc3QgY3RybCA9IGZvcm0uZ2V0Q29udHJvbChmaWVsZC5pZCwgdGFiSWQpO1xyXG4gICAgICBpZiAoY3RybD8uaW52YWxpZCkge1xyXG4gICAgICAgIGN0cmwubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIGVycm9yc1tmaWVsZC5pZF0gPSBgJHtyZXNvbHZlTGFiZWwoZmllbGQubGFiZWwsIHRoaXMubGFuZ3VhZ2UpfSBpcyBpbnZhbGlkLmA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzY29wZWQgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5maWx0ZXJGb3JUYWIodGhpcy5ydWxlcywgdGFiSWQsIHRoaXMuY29uZmlnKTtcclxuICAgIGNvbnN0IHJ1bGVFcnJvcnMgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5ldmFsdWF0ZShzY29wZWQsIGZvcm0uZm9ybVZhbHVlcygpLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSlcclxuICAgICAgLnZhbGlkYXRpb25FcnJvcnM7XHJcbiAgICBPYmplY3QuYXNzaWduKGVycm9ycywgcnVsZUVycm9ycyk7XHJcblxyXG4gICAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KGVycm9ycyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcclxuICAgIHRoaXMuZWRpdGluZ1RhYklkLnNldChudWxsKTtcclxuXHJcbiAgICBjb25zdCByZWNvcmQgPSBmb3JtLmV4dHJhY3RSZWNvcmQoKTtcclxuICAgIHRoaXMuY3VycmVudERhdGEuc2V0KHJlY29yZCk7XHJcbiAgICB0aGlzLnNlY3Rpb25TYXZlLmVtaXQoeyB0YWJJZCwgcmVjb3JkIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VlZCB0aGUgc2Vzc2lvbiBiYXNlbGluZSBmcm9tIHRoZSBsb2FkZWQgcmVjb3JkIHNvIGBWQUxVRV9DSEFOR0VEYCBydWxlcyBhbmQgdGhlXHJcbiAgICogbW9kaWZpY2F0aW9uIGJhbm5lciBjb21wYXJlIGFnYWluc3QgdGhlIHJlY29yZCBhcyBpdCB3YXMgb3BlbmVkIOKAlCBub3QgYXMgaXQgd2FzXHJcbiAgICogYWZ0ZXIgdGhlIGZpcnN0IGtleXN0cm9rZS5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbERhdGEnXSB8fCBjaGFuZ2VzWydjb25maWcnXSkge1xyXG4gICAgICB0aGlzLm9yaWdpbmFsQmFzZWxpbmUuc2V0KHsgLi4uKHRoaXMuaW5pdGlhbERhdGEgPz8ge30pIH0pO1xyXG4gICAgICB0aGlzLmN1cnJlbnREYXRhLnNldCh7IC4uLih0aGlzLmluaXRpYWxEYXRhID8/IHt9KSB9KTtcclxuICAgICAgdGhpcy5hY3RpdmVUYWJJZFNpZy5zZXQodGhpcy5maXJzdFZpc2libGVUYWJJZCgpKTtcclxuICAgICAgLy8gQSBkaWZmZXJlbnQgcmVjb3JkIGlzIGEgZGlmZmVyZW50IHNldCBvZiBiYW5uZXJzIOKAlCByZS1hcm0gdGhlbS5cclxuICAgICAgdGhpcy5kaXNtaXNzZWQuc2V0KG5ldyBTZXQ8c3RyaW5nPigpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCByZWNvcmRUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuICdSZWNvcmQnO1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm5hbWUgPyByZXNvbHZlTGFiZWwodGhpcy5jb25maWcubmFtZSwgdGhpcy5sYW5ndWFnZSkgOiB0aGlzLmNvbmZpZy5lbnRpdHk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZhdGFyTGV0dGVyKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVjb3JkVGl0bGUgfHwgJ1InKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBIZWFkZXIgZmllbGRzIChpc1Byb2ZpbGVJbWFnZSAvIGlzSGVhZGVyVG9nZ2xlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIEV2ZXJ5IGZpZWxkIGluIHRoZSBjb25maWcsIGF0IGFueSBkZXB0aC4gKi9cclxuICBwcml2YXRlIGFsbEZpZWxkcygpOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHtcclxuICAgIGNvbnN0IG91dDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xyXG4gICAgY29uc3Qgd2Fsa0ZpZWxkcyA9IChmaWVsZHM6IE5lc3RlZEZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcyA/PyBbXSkge1xyXG4gICAgICAgIG91dC5wdXNoKGYpO1xyXG4gICAgICAgIHdhbGtGaWVsZHMoZi5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBjb25zdCB3YWxrVGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGFicyA/PyBbXSkge1xyXG4gICAgICAgIHdhbGtGaWVsZHModC5maWVsZHMpO1xyXG4gICAgICAgIHdhbGtUYWJzKHQuY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgd2Fsa1RhYnModGhpcy5jb25maWc/LnRhYnMpO1xyXG4gICAgcmV0dXJuIG91dDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmllbGQgZmxhZ2dlZCBgaXNQcm9maWxlSW1hZ2VgLCByZW5kZXJlZCBhcyB0aGUgcmVjb3JkIGF2YXRhci4gKi9cclxuICBnZXQgaGVhZGVyUHJvZmlsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxGaWVsZHMoKS5maW5kKGYgPT4gZi5pc1Byb2ZpbGVJbWFnZSkgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmllbGQgZmxhZ2dlZCBgaXNIZWFkZXJUb2dnbGVgLCByZW5kZXJlZCBhcyBhIHN0YXR1cyBzd2l0Y2ggaW4gdGhlIGhlYWRlci4gKi9cclxuICBnZXQgaGVhZGVyVG9nZ2xlRmllbGQoKTogTmVzdGVkRmllbGRDb25maWcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEZpZWxkcygpLmZpbmQoZiA9PiBmLmlzSGVhZGVyVG9nZ2xlKSA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF2YXRhciBpbWFnZSBVUkwsIHdoZW4gdGhlIHByb2ZpbGUgZmllbGQgaG9sZHMgYSBwZXJzaXN0ZWQgRmlsZVJlZi4gKi9cclxuICBnZXQgcHJvZmlsZUltYWdlVXJsKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclByb2ZpbGVGaWVsZDtcclxuICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpIGFzIHsgdXJsPzogc3RyaW5nIH0gfCBudWxsO1xyXG4gICAgcmV0dXJuIHZhbHVlPy51cmwgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBoZWFkZXJUb2dnbGVWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJUb2dnbGVGaWVsZDtcclxuICAgIHJldHVybiBmaWVsZCA/IHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCkgPT09IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZsaXAgdGhlIGhlYWRlciB0b2dnbGUuIEl0IHdyaXRlcyBzdHJhaWdodCB0byB0aGUgY29udHJvbCByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoXHJcbiAgICogc2VjdGlvbiBlZGl0aW5nIOKAlCB0aGUgcmVmZXJlbmNlIHRyZWF0cyBpdCBhcyBhIHJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBub3QgcGFydCBvZlxyXG4gICAqIGFueSBvbmUgdGFiJ3Mgc2VjdGlvbi5cclxuICAgKi9cclxuICB0b2dnbGVIZWFkZXJTdGF0dXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyVG9nZ2xlRmllbGQ7XHJcbiAgICBpZiAoIWZpZWxkIHx8IHRoaXMucmVjb3JkUmVhZE9ubHkpIHJldHVybjtcclxuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmNvbnRyb2xGb3IoZmllbGQuaWQpO1xyXG4gICAgaWYgKCFjdHJsKSByZXR1cm47XHJcbiAgICBjdHJsLnNldFZhbHVlKCF0aGlzLmhlYWRlclRvZ2dsZVZhbHVlKTtcclxuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcclxuICB9XHJcblxyXG4gIC8qKiBMb2NhdGUgYSBmaWVsZCdzIGNvbnRyb2wgd2hlcmV2ZXIgaXQgbGl2ZXMsIHNpbmNlIGhlYWRlciBmaWVsZHMgbWF5IGJlIG9uIGFueSB0YWIuICovXHJcbiAgcHJpdmF0ZSBjb250cm9sRm9yKGZpZWxkSWQ6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0Zvcm1Db21wPy5nZXRDb250cm9sKGZpZWxkSWQpID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogQSBmaWVsZCdzIGN1cnJlbnQgdmFsdWUsIHJlYWQgZnJvbSB0aGUgcmVjb3JkIHNvIGl0IGlzIHN0YWJsZSBkdXJpbmcgcmVuZGVyLiAqL1xyXG4gIHByaXZhdGUgZmllbGRWYWx1ZShmaWVsZElkOiBzdHJpbmcpOiB1bmtub3duIHtcclxuICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuY29uZmlnPy50YWJzID8/IFtdKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRUYWJEYXRhKHRhYi5pZCwgdGhpcy5jdXJyZW50RGF0YSgpLCB0aGlzLmNvbmZpZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xyXG4gICAgICBpZiAoZGF0YSAmJiBmaWVsZElkIGluIGRhdGEpIHJldHVybiBkYXRhW2ZpZWxkSWRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IGlzTW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBvcmlnID0gdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCk7XHJcbiAgICBjb25zdCBjdXJyID0gdGhpcy5jdXJyZW50RGF0YSgpO1xyXG4gICAgaWYgKCFvcmlnIHx8ICFjdXJyIHx8IE9iamVjdC5rZXlzKG9yaWcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9yaWcpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyKTtcclxuICB9KTtcclxuXHJcbiAgcmVhZG9ubHkgc3VtbWFyeUZpZWxkcyA9IGNvbXB1dGVkPE5lc3RlZEZpZWxkQ29uZmlnW10+KCgpID0+IHtcclxuICAgIGNvbnN0IGZpZWxkczogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xyXG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSkgPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGFicykge1xyXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0LmZpZWxkcyA/PyBbXSkge1xyXG4gICAgICAgICAgaWYgKGYuc2hvd09uTWluaW1pemUpIGZpZWxkcy5wdXNoKGYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodC5jaGlsZHJlbikgd2Fsa1RhYnModC5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB3YWxrVGFicyh0aGlzLmNvbmZpZz8udGFicyk7XHJcbiAgICByZXR1cm4gZmllbGRzO1xyXG4gIH0pO1xyXG5cclxuICBvbkZvcm1DaGFuZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xyXG4gICAgLy8gQmFzZWxpbmUgaXMgc2VlZGVkIGZyb20gYGluaXRpYWxEYXRhYCBpbiBuZ09uQ2hhbmdlczsgb25seSBmaWxsIGl0IGhlcmUgd2hlbiB0aGVcclxuICAgIC8vIHJlY29yZCB3YXMgb3BlbmVkIGVtcHR5IChjcmVhdGUgZmxvdyksIHNvIHRoZSBmaXJzdCBlbWl0dGVkIHNoYXBlIGJlY29tZXMgdGhlIGJhc2VsaW5lLlxyXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5vcmlnaW5hbEJhc2VsaW5lLnNldCh7IC4uLmRhdGEgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChkYXRhKTtcclxuICAgIHRoaXMuZm9ybUNoYW5nZS5lbWl0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25Gb3JtU3VibWl0KGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25Gb3JtUmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm1SZXNldC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRGaWVsZExhYmVsKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdW1tYXJ5IHZhbHVlcyByZW5kZXIgdGhyb3VnaCB0aGUgc2hhcmVkIGNvcmUgZm9ybWF0dGVyLCBub3QgYSBsb2NhbCBzdHJpbmdpZmllci4gKi9cclxuICBmb3JtYXRGaWVsZFZhbHVlKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZm9ybWF0RGlzcGxheVZhbHVlKGZpZWxkLnR5cGUsIGZpZWxkLm9wdGlvbnMsIHRoaXMuY3VycmVudERhdGEoKVtmaWVsZC5pZF0sIHRoaXMubGFuZ3VhZ2UpO1xyXG4gIH1cclxuXHJcbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHBhcmVudCB0YWIgZm9yIGZpZWxkXHJcbiAgICBmb3IgKGNvbnN0IHRhYiBvZiB0aGlzLmNvbmZpZz8udGFicyB8fCBbXSkge1xyXG4gICAgICBjb25zdCBoYXNGaWVsZCA9ICh0YWIuZmllbGRzIHx8IFtdKS5zb21lKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XHJcbiAgICAgIGlmIChoYXNGaWVsZCkge1xyXG4gICAgICAgIHRoaXMuZHluYW1pY0Zvcm1Db21wPy5zZXRBY3RpdmVUYWIodGFiLmlkKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGZpZWxkLWNvbnRhaW5lci0ke2ZpZWxkSWR9YCk7XHJcbiAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcclxuICAgICAgICAgICAgZWwuZm9jdXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yXCI+XHJcbiAgPCEtLSBSZWNvcmQgSGVhZGVyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlLWdyb3VwXCI+XHJcbiAgICAgIEBpZiAocHJvZmlsZUltYWdlVXJsKSB7XHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCJcclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaGVhZGVyLXByb2ZpbGUtaW1hZ2VcIlxyXG4gICAgICAgICAgW3NyY109XCJwcm9maWxlSW1hZ2VVcmxcIlxyXG4gICAgICAgICAgW2FsdF09XCJyZWNvcmRUaXRsZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXJcIiBkYXRhLXRlc3RpZD1cImhlYWRlci1hdmF0YXItaW5pdGlhbFwiPlxyXG4gICAgICAgICAge3sgYXZhdGFyTGV0dGVyIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fdGl0bGVcIiBkYXRhLXRlc3RpZD1cInJlY29yZC10aXRsZVwiPlxyXG4gICAgICAgICAge3sgcmVjb3JkVGl0bGUgfX1cclxuICAgICAgICA8L2gyPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1YnRpdGxlXCI+RW50aXR5OiB7eyBjb25maWcuZW50aXR5IH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG91dHNpZGUgc2VjdGlvbiBlZGl0aW5nIC0tPlxyXG4gICAgQGlmIChoZWFkZXJUb2dnbGVGaWVsZDsgYXMgdG9nZ2xlRmllbGQpIHtcclxuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGVcIj5cclxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRGaWVsZExhYmVsKHRvZ2dsZUZpZWxkKSB9fTwvc3Bhbj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICByb2xlPVwic3dpdGNoXCJcclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaGVhZGVyLXRvZ2dsZVwiXHJcbiAgICAgICAgICBbY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkUmVhZE9ubHlcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImhlYWRlclRvZ2dsZVZhbHVlXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlSGVhZGVyU3RhdHVzKClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZS10ZXh0XCI+e3sgaGVhZGVyVG9nZ2xlVmFsdWUgPyAnWWVzJyA6ICdObycgfX08L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRGlzbWlzc2libGUgaW5mbyBiYW5uZXJzIChydWxlcyBgaW5mb2AgYWN0aW9uKSAtLT5cclxuICBAZm9yIChiYW5uZXIgb2YgaW5mb0Jhbm5lcnM7IHRyYWNrIGJhbm5lci5maWVsZElkKSB7XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvXCJcclxuICAgICAgcm9sZT1cInN0YXR1c1wiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidpbmZvLWJhbm5lci0nICsgYmFubmVyLmZpZWxkSWRcIlxyXG4gICAgPlxyXG4gICAgICA8c3Bhbj7ihLnvuI8ge3sgYmFubmVyLm1lc3NhZ2UgfX08L3NwYW4+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzc1wiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2Rpc21pc3MtJyArIGJhbm5lci5maWVsZElkXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEaXNtaXNzOiAnICsgYmFubmVyLm1lc3NhZ2VcIlxyXG4gICAgICAgIChjbGljayk9XCJkaXNtaXNzSW5mb0Jhbm5lcihiYW5uZXIuZmllbGRJZClcIlxyXG4gICAgICA+4pyVPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDwhLS0gTW9kaWZpY2F0aW9uIGJhc2VsaW5lIGJhbm5lciAtLT5cclxuICBAaWYgKGlzTW9kaWZpZWQoKSkge1xyXG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXIgbmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0td2FybmluZ1wiPlxyXG4gICAgICDwn5SSIFJlY29yZCBtb2RpZmllZCBmcm9tIHNlc3Npb24gYmFzZWxpbmUg4oCUIHVuc2F2ZWQgY2hhbmdlcyBwZW5kaW5nLlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICA8IS0tIFN1bW1hcnkgUGFuZWwgKHNob3dPbk1pbmltaXplIGZpZWxkcyB3aXRoIGludGVyYWN0aXZlIGp1bXApIC0tPlxyXG4gIEBpZiAoc3VtbWFyeUZpZWxkcygpLmxlbmd0aCA+IDApIHtcclxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbFwiIGRhdGEtdGVzdGlkPVwic3VtbWFyeS1wYW5lbFwiPlxyXG4gICAgICBAZm9yIChzZiBvZiBzdW1tYXJ5RmllbGRzKCk7IHRyYWNrIHNmLmlkKSB7XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidzdW1tYXJ5LScgKyBzZi5pZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwianVtcFRvRmllbGQoc2YuaWQpXCJcclxuICAgICAgICAgIFt0aXRsZV09XCInQ2xpY2sgdG8ganVtcCB0byAnICsgZm9ybWF0RmllbGRMYWJlbChzZilcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWxcIj57eyBmb3JtYXRGaWVsZExhYmVsKHNmKSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktdmFsXCI+e3sgZm9ybWF0RmllbGRWYWx1ZShzZikgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuXHJcbiAgPCEtLSBTZWN0aW9uIGVkaXQgYmFyOiBvbmUgdGFiIGlzIGVkaXRlZCBhdCBhIHRpbWUsIGFuZCB2YWxpZGF0ZWQgb24gaXRzIG93biAtLT5cclxuICBAaWYgKHZpZXdNb2RlICYmICFyZWNvcmRSZWFkT25seSkge1xyXG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWJhclwiPlxyXG4gICAgICBAaWYgKGlzRWRpdGluZ0FjdGl2ZVRhYikge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24taGludFwiPkVkaXRpbmcgdGhpcyBzZWN0aW9uPC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtc2VjdGlvblwiIChjbGljayk9XCJjYW5jZWxTZWN0aW9uKClcIj5cclxuICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1zZWN0aW9uXCIgKGNsaWNrKT1cInNhdmVTZWN0aW9uKClcIj5cclxuICAgICAgICAgIFNhdmUgc2VjdGlvblxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiZWRpdC1zZWN0aW9uXCIgKGNsaWNrKT1cImVkaXRTZWN0aW9uKClcIj5cclxuICAgICAgICAgIEVkaXQgc2VjdGlvblxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIEBpZiAoT2JqZWN0LmtleXMoc2VjdGlvbkVycm9ycygpKS5sZW5ndGggPiAwKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1lcnJvclwiIHJvbGU9XCJhbGVydFwiIGRhdGEtdGVzdGlkPVwic2VjdGlvbi1lcnJvcnNcIj5cclxuICAgICAgQGZvciAoa2V5IG9mIE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSk7IHRyYWNrIGtleSkge1xyXG4gICAgICAgIDxkaXY+4pqg77iPIHt7IHNlY3Rpb25FcnJvcnMoKVtrZXldIH19PC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuXHJcbiAgPCEtLSBBcnJheSByb3dzOiBsaXN0ZWQgaGVyZSwgZWRpdGVkIGluIHRoZSBkcmF3ZXIgYmVsb3cgLS0+XHJcbiAgQGZvciAoYXJyYXlGaWVsZCBvZiBhcnJheUZpZWxkc0ZvckFjdGl2ZVRhYjsgdHJhY2sgYXJyYXlGaWVsZC5pZCkge1xyXG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvd3MtJyArIGFycmF5RmllbGQuaWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWxhYmVsXCI+e3sgZm9ybWF0RmllbGRMYWJlbChhcnJheUZpZWxkKSB9fTwvc3Bhbj5cclxuICAgICAgICBAaWYgKCFzZWN0aW9uUmVhZE9ubHkpIHtcclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2FkZC1yb3ctJyArIGFycmF5RmllbGQuaWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkFkZFJvdyhhcnJheUZpZWxkKVwiXHJcbiAgICAgICAgICA+KyBSb3c8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGZvciAocm93IG9mIHJvd3NPZihhcnJheUZpZWxkKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCIncm93LScgKyBhcnJheUZpZWxkLmlkICsgJy0nICsgJGluZGV4XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3ctdGV4dFwiPnt7IHJvd1N1bW1hcnkoYXJyYXlGaWVsZCwgcm93KSB9fTwvc3Bhbj5cclxuICAgICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZWRpdC1yb3ctJyArIGFycmF5RmllbGQuaWQgKyAnLScgKyAkaW5kZXhcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRWRpdFJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RWRpdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGVsZXRlLXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVtcHR5IHtcclxuICAgICAgICA8cCBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3ctZW1wdHlcIj5ObyByb3dzIHlldC48L3A+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuXHJcbiAgPCEtLVxyXG4gICAgUm93IGRyYXdlci4gRGVsaWJlcmF0ZWx5IG91dHNpZGUgdGhlIHRhYiBwYW5lbDogYnVpbGRpbmcgYSByb3cncyBGb3JtR3JvdXAgaW5zaWRlIHRoZVxyXG4gICAgdGFiIHZpZXcgcmFjZXMgdGhlIHRhYidzIG93biBpbml0aWFsaXNhdGlvbiAodGhlIHJlZmVyZW5jZSBoaXQgdGhpcyB3aXRoIEZvcm1BcnJheSkuXHJcbiAgLS0+XHJcbiAgQGlmIChpbmxpbmVSb3dGaWVsZCgpOyBhcyByb3dGaWVsZCkge1xyXG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXJcIiBkYXRhLXRlc3RpZD1cInJvdy1kcmF3ZXJcIiBbZm9ybUdyb3VwXT1cImlubGluZVJvd0Zvcm0hXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XHJcbiAgICAgICAgPHN0cm9uZz57eyBpbmxpbmVSb3dJbmRleCgpID09PSBudWxsID8gJ0FkZCcgOiAnRWRpdCcgfX0ge3sgZm9ybWF0RmllbGRMYWJlbChyb3dGaWVsZCkgfX0gcm93PC9zdHJvbmc+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1mb3JtX19wYW5lbFwiPlxyXG4gICAgICAgIEBmb3IgKGNoaWxkIG9mIHJvd0ZpZWxkLmNoaWxkcmVuID8/IFtdOyB0cmFjayBjaGlsZC5pZCkge1xyXG4gICAgICAgICAgPG5neC1keW5hbWljLWZpZWxkXHJcbiAgICAgICAgICAgIFtmaWVsZF09XCJjaGlsZFwiXHJcbiAgICAgICAgICAgIFtjb250cm9sXT1cImlubGluZVJvd0Zvcm0hLmdldChjaGlsZC5pZCkhXCJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxyXG4gICAgICAgICAgICBbbGFuZ3VhZ2VdPVwibGFuZ3VhZ2VcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ncmlkQ29sdW1uXT1cIidzcGFuIDEyJ1wiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImNhbmNlbC1yb3dcIiAoY2xpY2spPVwiY2FuY2VsUm93KClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19zdWJtaXRcIiBkYXRhLXRlc3RpZD1cInNhdmUtcm93XCIgKGNsaWNrKT1cInNhdmVSb3coKVwiPlNhdmUgcm93PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICA8IS0tIE1haW4gRHluYW1pYyBGb3JtIC0tPlxyXG4gIDxuZ3gtZHluYW1pYy1mb3JtXHJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXHJcbiAgICBbcnVsZXNdPVwicnVsZXNcIlxyXG4gICAgW2luaXRpYWxEYXRhXT1cImluaXRpYWxEYXRhXCJcclxuICAgIFtvcmlnaW5hbERhdGFdPVwib3JpZ2luYWxCYXNlbGluZSgpXCJcclxuICAgIFt1c2VyUm9sZXNdPVwidXNlclJvbGVzXCJcclxuICAgIFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXHJcbiAgICBbcmVhZG9ubHldPVwic2VjdGlvblJlYWRPbmx5XCJcclxuICAgIFtyZWFkT25seUZpZWxkc109XCJyZWFkT25seUZpZWxkc1wiXHJcbiAgICBbc2hvd0luZm9CYW5uZXJzXT1cImZhbHNlXCJcclxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgW2Vycm9yXT1cImVycm9yXCJcclxuICAgIChmb3JtQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCJcclxuICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdCgkZXZlbnQpXCJcclxuICAgIChmb3JtUmVzZXQpPVwib25Gb3JtUmVzZXQoKVwiXHJcbiAgICAoYWN0aXZlVGFiQ2hhbmdlKT1cIm9uQWN0aXZlVGFiQ2hhbmdlKCRldmVudClcIlxyXG4gIC8+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
494
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUE4QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFOUU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQW9NSCxNQUFNLE9BQU8sMEJBQTBCO0lBQzVCLE1BQU0sQ0FBb0I7SUFDMUIsS0FBSyxDQUFjO0lBQ25CLFdBQVcsQ0FBdUI7SUFDbEMsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixLQUFL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QUFDO2dCQUNQLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBMWRVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLDZmQTRCMUIsb0JBQW9CLHFFQzlQakMsdWhQQWtNQSwwa0dEaEtZLFlBQVksOEJBQUUsbUJBQW1CLDRVQUFFLG9CQUFvQiw2VUFBRSxxQkFBcUI7OzRGQWdNN0UsMEJBQTBCO2tCQW5NdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDOzhCQWlNaEYsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQVFHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFMEIsZUFBZTtzQkFBL0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcsIEZvcm1SdWxlLCBOZXN0ZWRGaWVsZENvbmZpZywgTmVzdGVkVGFiQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgZmluZFRhYiwgZm9ybWF0RGlzcGxheVZhbHVlLCBnZXRUYWJEYXRhLCByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQvZHluYW1pYy1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZXNFdmFsdWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBcIm5vIHRhYiBob2xkcyB0aGlzIGZpZWxkXCIgZnJvbSBcInRoZSBmaWVsZCBob2xkcyB1bmRlZmluZWRcIiwgc28gdGhlIHRhYiB3YWxrXG4gKiBjYW4ga2VlcCBzZWFyY2hpbmcgaW4gdGhlIGZpcnN0IGNhc2UgYW5kIHN0b3AgaW4gdGhlIHNlY29uZC5cbiAqL1xuY29uc3QgRklFTERfTk9UX0ZPVU5EID0gU3ltYm9sKCdmaWVsZC1ub3QtZm91bmQnKTtcblxuLyoqXG4gKiBEeW5hbWljUmVjb3JkRm9ybUNvbXBvbmVudCDigJQgY29tcHJlaGVuc2l2ZSB0YWJiZWQgcmVjb3JkIHZpZXcgJiBlZGl0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIGNyb3NzLXRhYiBydWxlIGV2YWx1YXRpb24sIHByb2ZpbGUgaGVhZGVyLCBzdW1tYXJ5IGRyYXdlciAoc2hvd09uTWluaW1pemUpLFxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtcmVjb3JkLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBEeW5hbWljRm9ybUNvbXBvbmVudCwgRHluYW1pY0ZpZWxkQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZS1ncm91cCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjtcbiAgICAgICAgY29sb3I6ICM0ZjQ2ZTU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBjb2xvcjogIzM3NDE1MTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZS10ZXh0IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIHtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzczpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0tZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgICBjb2xvcjogI2I5MWMxYztcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1iYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1oaW50IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cyB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LXRleHQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5IHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXIge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGJlYWZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6ICMxZjI5Mzc7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1JlY29yZEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBFbnRpdHlGb3JtQ29uZmlnO1xuICBASW5wdXQoKSBydWxlcz86IEZvcm1SdWxlW107XG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaG9sZSByZWNvcmQgcmVhZC1vbmx5LCByZWdhcmRsZXNzIG9mIFJCQUMuIEVxdWl2YWxlbnQgdG8gdGhlIHJlZmVyZW5jZSdzIGBpc1JlYWRPbmx5YC4gKi9cbiAgQElucHV0KCkgaXNSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU3BlY2lmaWMgZmllbGQgaWRzIGZvcmNlZCByZWFkLW9ubHkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHJlY29yZCBzdGF5cyBlZGl0YWJsZS4gKi9cbiAgQElucHV0KCkgcmVhZE9ubHlGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBPcGVuIHRoZSByZWNvcmQgcmVhZC1vbmx5LCB3aXRoIGEgcGVyLXRhYiBcIkVkaXQgc2VjdGlvblwiIGZsb3cg4oCUIG9uZSB0YWIgaXMgZWRpdGVkIGFuZFxuICAgKiB2YWxpZGF0ZWQgYXQgYSB0aW1lLiBUaGlzIGlzIHRoZSBmcmFtZXdvcmsncyBgRW50aXR5UmVjb3JkQ29tcG9uZW50YCBtb2RlbCBhbmQgdGhlXG4gICAqIGRlZmF1bHQgaGVyZS5cbiAgICpcbiAgICogU2V0IGZhbHNlIGZvciBhIGRpcmVjdGx5IGVkaXRhYmxlIHJlY29yZCB3aXRoIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIHZpZXdNb2RlOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcbiAgQE91dHB1dCgpIGZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG4gIEBPdXRwdXQoKSBmb3JtUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBPbmUgdGFiIHNlY3Rpb24gd2FzIHNhdmVkLiBDYXJyaWVzIHRoZSB3aG9sZSByZWNvcmQsIHBsdXMgd2hpY2ggdGFiIHdhcyBlZGl0ZWQuICovXG4gIEBPdXRwdXQoKSBzZWN0aW9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0YWJJZDogc3RyaW5nOyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfT4oKTtcblxuICBAVmlld0NoaWxkKER5bmFtaWNGb3JtQ29tcG9uZW50KSBkeW5hbWljRm9ybUNvbXA/OiBEeW5hbWljRm9ybUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzRXZhbHVhdGlvbiA9IGluamVjdChSdWxlc0V2YWx1YXRpb25TZXJ2aWNlKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0YSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IG9yaWdpbmFsQmFzZWxpbmUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYW55Pj4oe30pO1xuXG4gIC8qKlxuICAgKiBJbmZvIGJhbm5lcnMgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCwgYnkgZmllbGQgaWQuXG4gICAqXG4gICAqIFRoZSByZWZlcmVuY2UncyBjb250cmFjdDogYW4gaW5mbyBiYW5uZXIgcGVyc2lzdHMgdW50aWwgZGlzbWlzc2VkLCAqKm5vdCoqIHVudGlsIHRoZVxuICAgKiB2YWx1ZSBjaGFuZ2VzLiBEaXNtaXNzYWwgaXMga2V5ZWQgYnkgZmllbGQgc28gcmUtdHJpZ2dlcmluZyBhIGRpZmZlcmVudCBmaWVsZCdzIHJ1bGVcbiAgICogc3RpbGwgc2hvd3MuIFJlLWFybWVkIHdoZW4gYSBkaWZmZXJlbnQgcmVjb3JkIGlzIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzbWlzc2VkID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQ8c3RyaW5nPigpKTtcblxuICAvKipcbiAgICogSW5mbyBiYW5uZXJzIGZyb20gdGhlIHJ1bGVzIGVuZ2luZSB0aGF0IGFyZSBzdGlsbCBzaG93aW5nLlxuICAgKlxuICAgKiBBIGdldHRlciwgbm90IGEgYGNvbXB1dGVkYDogdGhlIHNvdXJjZSBpcyBgZHluYW1pY0Zvcm1Db21wYCwgYSBWaWV3Q2hpbGQuIEEgY29tcHV0ZWRcbiAgICogZXZhbHVhdGVkIGJlZm9yZSB0aGUgdmlldyBpbml0aWFsaXNlcyB3b3VsZCBjYXB0dXJlIG5vIGRlcGVuZGVuY3kgb24gdGhlIGNoaWxkJ3NcbiAgICogYHJ1bGVSZXN1bHRgIHNpZ25hbCBhbmQgdGhlbiBuZXZlciByZWNvbXB1dGUuIFJlYWQgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0IGluZm9CYW5uZXJzKCk6IHsgZmllbGRJZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8ucnVsZVJlc3VsdCgpO1xuICAgIGNvbnN0IGdvbmUgPSB0aGlzLmRpc21pc3NlZCgpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQ/LmluZm9CYW5uZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2ZpZWxkSWRdKSA9PiAhZ29uZS5oYXMoZmllbGRJZCkpXG4gICAgICAubWFwKChbZmllbGRJZCwgbWVzc2FnZV0pID0+ICh7IGZpZWxkSWQsIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSB9KSk7XG4gIH1cblxuICBkaXNtaXNzSW5mb0Jhbm5lcihmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5zZXQobmV3IFNldCh0aGlzLmRpc21pc3NlZCgpKS5hZGQoZmllbGRJZCkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBub3RoaW5nIGluIHRoZSByZWNvcmQgbWF5IGJlIGVkaXRlZC4gKi9cbiAgZ2V0IHJlY29yZFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNSZWFkT25seTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbmxpbmUgYXJyYXktcm93IGVkaXRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEEgcm93IG9mIGFuIGBhcnJheWAgZmllbGQgaXMgZWRpdGVkIGluIGEgZHJhd2VyLCBub3QgaW5saW5lIGluIHRoZSB0YWIgcGFuZWwuXG4gICAqXG4gICAqIFRoZSBkcmF3ZXIgaXMgcmVuZGVyZWQgb3V0c2lkZSB0aGUgdGFiIGNvbnRhaW5lciBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIGZvdW5kIHRoYXRcbiAgICogYnVpbGRpbmcgYSByb3cncyBGb3JtR3JvdXAgaW5zaWRlIHRoZSB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uLCBzb1xuICAgKiB0aGUgcm93IGZvcm0gaXMga2VwdCBkZXRhY2hlZCBhbmQgb25seSBwdXNoZWQgaW50byB0aGUgRm9ybUFycmF5IG9uIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVSb3dGaWVsZCA9IHNpZ25hbDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpbmxpbmVSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgaW5saW5lUm93Rm9ybTogRm9ybUdyb3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGBhcnJheWAgZmllbGRzIG9uIHRoZSB0YWIgY3VycmVudGx5IHNob3duLCBzbyB0aGUgdGVtcGxhdGUgY2FuIGxpc3QgdGhlaXIgcm93cy4gKi9cbiAgZ2V0IGFycmF5RmllbGRzRm9yQWN0aXZlVGFiKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWIgPSB0YWJJZCA/IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKSA6IG51bGw7XG4gICAgcmV0dXJuICh0YWI/LmZpZWxkcyA/PyBbXSkuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnYXJyYXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIGN1cnJlbnRseSBoZWxkIGJ5IGFuIGBhcnJheWAgZmllbGQsIHJlYWQgZnJvbSB0aGUgcmVjb3JkIHZhbHVlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbm90IHJlYWQgb2ZmIHRoZSBjaGlsZCdzIEZvcm1BcnJheTogdGhhdCBjb250cm9sIG9ubHkgZXhpc3RzIG9uY2UgdGhlXG4gICAqIGNoaWxkIGhhcyBpbml0aWFsaXNlZCwgc28gcmVuZGVyaW5nIGZyb20gaXQgY2hhbmdlZCB2YWx1ZSBtaWQtcGFzcy4gYGN1cnJlbnREYXRhYCBpcyBhXG4gICAqIHNpZ25hbCBzZWVkZWQgZnJvbSBgaW5pdGlhbERhdGFgIGFuZCBrZXB0IGN1cnJlbnQgYnkgdGhlIGNoaWxkJ3MgYGZvcm1DaGFuZ2VgLlxuICAgKi9cbiAgcm93c09mKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWJEYXRhID0gdGFiSWQgPyBnZXRUYWJEYXRhKHRhYklkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9ICh0YWJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltmaWVsZC5pZF07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93cykgPyAocm93cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA6IFtdO1xuICB9XG5cbiAgLyoqIE9uZSByb3cgcmVuZGVyZWQgYXMgdGV4dCwgc28gdGhlIGxpc3QgaXMgcmVhZGFibGUgd2l0aG91dCBvcGVuaW5nIHRoZSBkcmF3ZXIuICovXG4gIHJvd1N1bW1hcnkoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdyA/PyB7fTtcbiAgICBjb25zdCBwYXJ0cyA9IChmaWVsZC5jaGlsZHJlbiA/PyBbXSlcbiAgICAgIC5tYXAoY2hpbGQgPT4gdmFsdWVbY2hpbGQuaWRdKVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCh2ID0+ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2KSA6IFN0cmluZyh2KSkpO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnKGVtcHR5KSc7XG4gIH1cblxuICBvcGVuQWRkUm93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uY3JlYXRlQXJyYXlSb3coZmllbGQpIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIG9wZW5FZGl0Um93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChpbmRleCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA/LmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLnJvd3NPZihmaWVsZClbaW5kZXhdKSBhcyBGb3JtR3JvdXA7XG4gIH1cblxuICBjYW5jZWxSb3coKTogdm9pZCB7XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDb21taXQgdGhlIGRyYXdlciBpbnRvIHRoZSBGb3JtQXJyYXkuIFJ1bGVzIHJlLWV2YWx1YXRlIG9mZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGNoYW5nZS4gKi9cbiAgc2F2ZVJvdygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaW5saW5lUm93RmllbGQoKTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XG4gICAgaWYgKCFmaWVsZCB8fCAhZm9ybSB8fCAhdGhpcy5pbmxpbmVSb3dGb3JtKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pbmxpbmVSb3dGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW5saW5lUm93Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBmb3JtLmdldEFycmF5Q29udHJvbChmaWVsZC5pZCwgdGhpcy5hY3RpdmVUYWJJZCA/PyB1bmRlZmluZWQpO1xuICAgIGlmICghYXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmxpbmVSb3dJbmRleCgpO1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCkgYXJyYXkucHVzaChmb3JtLmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLmlubGluZVJvd0Zvcm0udmFsdWUpKTtcbiAgICBlbHNlIGFycmF5LmF0KGluZGV4KS5wYXRjaFZhbHVlKHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSk7XG5cbiAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xuICAgIHRoaXMuY2FuY2VsUm93KCk7XG4gIH1cblxuICBkZWxldGVSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XG4gICAgYXJyYXk/LnJlbW92ZUF0KGluZGV4KTtcbiAgICBhcnJheT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgICBpZiAodGhpcy5pbmxpbmVSb3dJbmRleCgpID09PSBpbmRleCkgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQZXItdGFiIHNlY3Rpb24gZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHRhYiBjdXJyZW50bHkgb3BlbiBmb3IgZWRpdGluZywgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQgaXMgYmVpbmcgdmlld2VkLlxuICAgKlxuICAgKiBUaGUgcmVmZXJlbmNlIGVkaXRzIG9uZSB0YWIgc2VjdGlvbiBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHJlY29yZCwgYW5kXG4gICAqIHZhbGlkYXRlcyBvbmx5IHRoYXQgc2VjdGlvbiBvbiBzYXZlIOKAlCBhIHJlcXVpcmVkIGZpZWxkIG9uIGFuIHVudG91Y2hlZCB0YWIgbXVzdCBub3RcbiAgICogYmxvY2sgc2F2aW5nIHRoZSB0YWIgeW91IGFyZSBhY3R1YWxseSB3b3JraW5nIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdGluZ1RhYklkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFiIHRoZSBpbm5lciBmb3JtIGlzIHNob3dpbmcuXG4gICAqXG4gICAqIFRyYWNrZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgVmlld0NoaWxkLiBUaGUgY2hpbGQgcmVzb2x2ZXMgaXRzIGZpcnN0IHRhYiBhc1xuICAgKiBwYXJ0IG9mIGl0cyBvd24gaW5pdGlhbGlzYXRpb24sIHNvIHJlYWRpbmcgaXQgZHVyaW5nIHRoaXMgY29tcG9uZW50J3MgcmVuZGVyIGNoYW5nZWRcbiAgICogdmFsdWUgbWlkLXBhc3Mg4oCUIGFuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIGVycm9yLiBTZWVkZWQgZnJvbSB0aGVcbiAgICogY29uZmlnIGFuZCBrZXB0IGluIHN0ZXAgYnkgdGhlIGNoaWxkJ3MgYGFjdGl2ZVRhYkNoYW5nZWAgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVUYWJJZFNpZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBnZXQgYWN0aXZlVGFiSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiSWRTaWcoKTtcbiAgfVxuXG4gIG9uQWN0aXZlVGFiQ2hhbmdlKHRhYklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJZFNpZygpID09PSB0YWJJZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiSWRTaWcuc2V0KHRhYklkKTtcbiAgICAvLyBFZGl0aW5nIGRvZXMgbm90IGZvbGxvdyB0aGUgdXNlciB0byBhbm90aGVyIHRhYi5cbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8qKiBGaXJzdCB0YWIgYSB1c2VyIGNhbiBzZWUsIHVzZWQgdG8gc2VlZCB0aGUgYWN0aXZlIHRhYiBiZWZvcmUgdGhlIGNoaWxkIHJlcG9ydHMgb25lLiAqL1xuICBwcml2YXRlIGZpcnN0VmlzaWJsZVRhYklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFicz8uZmluZCh0ID0+IHQudmlzaWJpbGl0eSAhPT0gZmFsc2UpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEVycm9ycyBmcm9tIHRoZSBsYXN0IHNhdmUgYXR0ZW1wdCwgYnkgZmllbGQgaWQuICovXG4gIHJlYWRvbmx5IHNlY3Rpb25FcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXG4gIC8qKiBUZW1wbGF0ZSBhY2Nlc3MgdG8gYE9iamVjdC5rZXlzYCBmb3IgaXRlcmF0aW5nIHRoZSBlcnJvciBtYXAuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPYmplY3QgPSBPYmplY3Q7XG5cbiAgZ2V0IGlzRWRpdGluZ0FjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICAvLyBXaXRob3V0IHZpZXcgbW9kZSB0aGVyZSBpcyBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24g4oCUIGV2ZXJ5dGhpbmcgaXMgYWx3YXlzIGVkaXRhYmxlLlxuICAgIGlmICghdGhpcy52aWV3TW9kZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy5hY3RpdmVUYWJJZCAmJiB0aGlzLmVkaXRpbmdUYWJJZCgpID09PSB0aGlzLmFjdGl2ZVRhYklkO1xuICB9XG5cbiAgLyoqIEZpZWxkcyByZW5kZXIgcmVhZC1vbmx5IHVubGVzcyB0aGVpciBvd24gdGFiIGlzIHRoZSBvbmUgYmVpbmcgZWRpdGVkLiAqL1xuICBnZXQgc2VjdGlvblJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmlzRWRpdGluZ0FjdGl2ZVRhYjtcbiAgfVxuXG4gIGVkaXRTZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3TW9kZSB8fCB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmFjdGl2ZVRhYklkKSByZXR1cm47XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KHRoaXMuYWN0aXZlVGFiSWQpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhpcyBzZWN0aW9uJ3MgZWRpdHMsIHJlc3RvcmluZyBlYWNoIGZpZWxkIGZyb20gdGhlIHNlc3Npb24gYmFzZWxpbmUuICovXG4gIGNhbmNlbFNlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmVkaXRpbmdUYWJJZCgpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcDtcbiAgICBpZiAodGFiSWQgJiYgZm9ybSkge1xuICAgICAgY29uc3QgdGFiID0gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpO1xuICAgICAgY29uc3QgYmFzZWxpbmVUYWIgPSAoZ2V0VGFiRGF0YSh0YWJJZCwgdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCksIHRoaXMuY29uZmlnKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRhYj8uZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lVmFsdWUgPSBiYXNlbGluZVRhYltmaWVsZC5pZF07XG5cbiAgICAgICAgLy8gQSBGb3JtQXJyYXkgY2Fubm90IGJlIHJlc3RvcmVkIHdpdGggc2V0VmFsdWUg4oCUIHRoYXQgZGVtYW5kcyBhIHZhbHVlIHNoYXBlZCBleGFjdGx5XG4gICAgICAgIC8vIGxpa2UgdGhlIGN1cnJlbnQgcm93cy4gUmVidWlsZCBpdCBmcm9tIHRoZSBiYXNlbGluZSByb3dzIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybS5nZXRBcnJheUNvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBBcnJheS5pc0FycmF5KGJhc2VsaW5lVmFsdWUpID8gYmFzZWxpbmVWYWx1ZSA6IFtdKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHJvdykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKT8uc2V0VmFsdWUoYmFzZWxpbmVWYWx1ZSA/PyBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudERhdGEuc2V0KGZvcm0uZXh0cmFjdFJlY29yZCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoaXMgc2VjdGlvbiBvbmx5LCB0aGVuIGVtaXQgaXQuIFZhbGlkYXRpb24gaXMgc2NvcGVkIHR3byB3YXlzOiBBbmd1bGFyXG4gICAqIHZhbGlkaXR5IG9mIHRoZSB0YWIncyBvd24gY29udHJvbHMsIGFuZCBydWxlcyBmaWx0ZXJlZCB0byB0aGlzIHRhYiDigJQgYSBydWxlIHRhcmdldGluZ1xuICAgKiBhIGhpZGRlbiB0YWIgbXVzdCBub3QgYmxvY2sgdGhlIHNhdmUgKHRoZSByZWZlcmVuY2UncyBPVjAtOTY4IGZpeCkuXG4gICAqL1xuICBzYXZlU2VjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xuICAgIGlmICghdGFiSWQgfHwgIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKTtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGN0cmwgPSBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgIGlmIChjdHJsPy5pbnZhbGlkKSB7XG4gICAgICAgIGN0cmwubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBlcnJvcnNbZmllbGQuaWRdID0gYCR7cmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKX0gaXMgaW52YWxpZC5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlZCA9IHRoaXMucnVsZXNFdmFsdWF0aW9uLmZpbHRlckZvclRhYih0aGlzLnJ1bGVzLCB0YWJJZCwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IHJ1bGVFcnJvcnMgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5ldmFsdWF0ZShzY29wZWQsIGZvcm0uZm9ybVZhbHVlcygpLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSlcbiAgICAgIC52YWxpZGF0aW9uRXJyb3JzO1xuICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBydWxlRXJyb3JzKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VjdGlvbkVycm9ycy5zZXQoZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSBmb3JtLmV4dHJhY3RSZWNvcmQoKTtcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChyZWNvcmQpO1xuICAgIHRoaXMuc2VjdGlvblNhdmUuZW1pdCh7IHRhYklkLCByZWNvcmQgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlZCB0aGUgc2Vzc2lvbiBiYXNlbGluZSBmcm9tIHRoZSBsb2FkZWQgcmVjb3JkIHNvIGBWQUxVRV9DSEFOR0VEYCBydWxlcyBhbmQgdGhlXG4gICAqIG1vZGlmaWNhdGlvbiBiYW5uZXIgY29tcGFyZSBhZ2FpbnN0IHRoZSByZWNvcmQgYXMgaXQgd2FzIG9wZW5lZCDigJQgbm90IGFzIGl0IHdhc1xuICAgKiBhZnRlciB0aGUgZmlyc3Qga2V5c3Ryb2tlLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0YSddIHx8IGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsQmFzZWxpbmUuc2V0KHsgLi4uKHRoaXMuaW5pdGlhbERhdGEgPz8ge30pIH0pO1xuICAgICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoeyAuLi4odGhpcy5pbml0aWFsRGF0YSA/PyB7fSkgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVRhYklkU2lnLnNldCh0aGlzLmZpcnN0VmlzaWJsZVRhYklkKCkpO1xuICAgICAgLy8gQSBkaWZmZXJlbnQgcmVjb3JkIGlzIGEgZGlmZmVyZW50IHNldCBvZiBiYW5uZXJzIOKAlCByZS1hcm0gdGhlbS5cbiAgICAgIHRoaXMuZGlzbWlzc2VkLnNldChuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlY29yZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuICdSZWNvcmQnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uYW1lID8gcmVzb2x2ZUxhYmVsKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMubGFuZ3VhZ2UpIDogdGhpcy5jb25maWcuZW50aXR5O1xuICB9XG5cbiAgZ2V0IGF2YXRhckxldHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5yZWNvcmRUaXRsZSB8fCAnUicpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEhlYWRlciBmaWVsZHMgKGlzUHJvZmlsZUltYWdlIC8gaXNIZWFkZXJUb2dnbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBmaWVsZCBpbiB0aGUgY29uZmlnLCBhdCBhbnkgZGVwdGguICovXG4gIHByaXZhdGUgYWxsRmllbGRzKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IG91dDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIG91dC5wdXNoKGYpO1xuICAgICAgICB3YWxrRmllbGRzKGYuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzID8/IFtdKSB7XG4gICAgICAgIHdhbGtGaWVsZHModC5maWVsZHMpO1xuICAgICAgICB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSBmaWVsZCBmbGFnZ2VkIGBpc1Byb2ZpbGVJbWFnZWAsIHJlbmRlcmVkIGFzIHRoZSByZWNvcmQgYXZhdGFyLiAqL1xuICBnZXQgaGVhZGVyUHJvZmlsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRmllbGRzKCkuZmluZChmID0+IGYuaXNQcm9maWxlSW1hZ2UpID8/IG51bGw7XG4gIH1cblxuICAvKiogVGhlIGZpZWxkIGZsYWdnZWQgYGlzSGVhZGVyVG9nZ2xlYCwgcmVuZGVyZWQgYXMgYSBzdGF0dXMgc3dpdGNoIGluIHRoZSBoZWFkZXIuICovXG4gIGdldCBoZWFkZXJUb2dnbGVGaWVsZCgpOiBOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFsbEZpZWxkcygpLmZpbmQoZiA9PiBmLmlzSGVhZGVyVG9nZ2xlKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEF2YXRhciBpbWFnZSBVUkwsIHdoZW4gdGhlIHByb2ZpbGUgZmllbGQgaG9sZHMgYSBwZXJzaXN0ZWQgRmlsZVJlZi4gKi9cbiAgZ2V0IHByb2ZpbGVJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyUHJvZmlsZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZFZhbHVlKGZpZWxkLmlkKSBhcyB7IHVybD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICByZXR1cm4gdmFsdWU/LnVybCA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGhlYWRlclRvZ2dsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJUb2dnbGVGaWVsZDtcbiAgICByZXR1cm4gZmllbGQgPyB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpID09PSB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmxpcCB0aGUgaGVhZGVyIHRvZ2dsZS4gSXQgd3JpdGVzIHN0cmFpZ2h0IHRvIHRoZSBjb250cm9sIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAgICogc2VjdGlvbiBlZGl0aW5nIOKAlCB0aGUgcmVmZXJlbmNlIHRyZWF0cyBpdCBhcyBhIHJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBub3QgcGFydCBvZlxuICAgKiBhbnkgb25lIHRhYidzIHNlY3Rpb24uXG4gICAqL1xuICB0b2dnbGVIZWFkZXJTdGF0dXMoKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclRvZ2dsZUZpZWxkO1xuICAgIGlmICghZmllbGQgfHwgdGhpcy5yZWNvcmRSZWFkT25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmNvbnRyb2xGb3IoZmllbGQuaWQpO1xuICAgIGlmICghY3RybCkgcmV0dXJuO1xuICAgIGN0cmwuc2V0VmFsdWUoIXRoaXMuaGVhZGVyVG9nZ2xlVmFsdWUpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgfVxuXG4gIC8qKiBMb2NhdGUgYSBmaWVsZCdzIGNvbnRyb2wgd2hlcmV2ZXIgaXQgbGl2ZXMsIHNpbmNlIGhlYWRlciBmaWVsZHMgbWF5IGJlIG9uIGFueSB0YWIuICovXG4gIHByaXZhdGUgY29udHJvbEZvcihmaWVsZElkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybUNvbXA/LmdldENvbnRyb2woZmllbGRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSwgcmVhZCBmcm9tIHRoZSByZWNvcmQgc28gaXQgaXMgc3RhYmxlIGR1cmluZyByZW5kZXIuXG4gICAqXG4gICAqIFJlc29sdmVkIHRocm91Z2ggYGdldFRhYkRhdGFgIHNvIGl0IGhvbm91cnMgZXhhY3RseSB0aGUgbmVzdGluZyBjb250cmFjdCB0aGUgZm9ybVxuICAgKiBwYXRjaGVzIHdpdGgg4oCUIGB7IHRhYklkOiB7IGZpZWxkSWQgfSB9YCwgb3IgdGhlIHJlY29yZCByb290IHdoZW4gdGhlIHRhYiBzZXRzXG4gICAqIGBmbGF0RGF0YWAuIFJlYWRpbmcgdGhlIHJlY29yZCBmbGF0IGluc3RlYWQgaXMgbm90IGEgc2hvcnRjdXQ6IGl0IG1ha2VzIHRoZSBzdW1tYXJ5XG4gICAqIGRpc3BsYXkgdmFsdWVzIHRoZSBmb3JtIG5ldmVyIGxvYWRlZCwgd2hpY2ggcmVhZHMgYXMgXCJ0aGUgZGF0YSBpcyB0aGVyZVwiIHdoaWxlIGV2ZXJ5XG4gICAqIGNvbnRyb2wgYmVoaW5kIGl0IGlzIGVtcHR5LlxuICAgKlxuICAgKiBXYWxrcyBzdWItdGFicyBhcyB3ZWxsOiBhIHN1bW1hcnksIGhlYWRlciwgb3IgcHJvZmlsZSBmaWVsZCBtYXkgc2l0IG9uIGFueSB0YWIgYXQgYW55XG4gICAqIGRlcHRoLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWVsZFZhbHVlKGZpZWxkSWQ6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHZpc2l0ID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10pOiB1bmtub3duID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldFRhYkRhdGEodGFiLmlkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgICAgIGlmIChkYXRhICYmIGZpZWxkSWQgaW4gZGF0YSkgcmV0dXJuIGRhdGFbZmllbGRJZF07XG4gICAgICAgIGlmICh0YWIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHZpc2l0KHRhYi5jaGlsZHJlbik7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSBGSUVMRF9OT1RfRk9VTkQpIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEZJRUxEX05PVF9GT1VORDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdmlzaXQodGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiByZXN1bHQgPT09IEZJRUxEX05PVF9GT1VORCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuXG4gIHJlYWRvbmx5IGlzTW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JpZyA9IHRoaXMub3JpZ2luYWxCYXNlbGluZSgpO1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmN1cnJlbnREYXRhKCk7XG4gICAgaWYgKCFvcmlnIHx8ICFjdXJyIHx8IE9iamVjdC5rZXlzKG9yaWcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkoY3Vycik7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN1bW1hcnlGaWVsZHMgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHQuZmllbGRzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKGYuc2hvd09uTWluaW1pemUpIGZpZWxkcy5wdXNoKGYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0LmNoaWxkcmVuKSB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9KTtcblxuICBvbkZvcm1DaGFuZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIC8vIEJhc2VsaW5lIGlzIHNlZWRlZCBmcm9tIGBpbml0aWFsRGF0YWAgaW4gbmdPbkNoYW5nZXM7IG9ubHkgZmlsbCBpdCBoZXJlIHdoZW4gdGhlXG4gICAgLy8gcmVjb3JkIHdhcyBvcGVuZWQgZW1wdHkgKGNyZWF0ZSBmbG93KSwgc28gdGhlIGZpcnN0IGVtaXR0ZWQgc2hhcGUgYmVjb21lcyB0aGUgYmFzZWxpbmUuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3JpZ2luYWxCYXNlbGluZS5zZXQoeyAuLi5kYXRhIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChkYXRhKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uRm9ybVN1Ym1pdChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBvbkZvcm1SZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1SZXNldC5lbWl0KCk7XG4gIH1cblxuICBmb3JtYXRGaWVsZExhYmVsKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbChmaWVsZC5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKiogU3VtbWFyeSB2YWx1ZXMgcmVuZGVyIHRocm91Z2ggdGhlIHNoYXJlZCBjb3JlIGZvcm1hdHRlciwgbm90IGEgbG9jYWwgc3RyaW5naWZpZXIuICovXG4gIGZvcm1hdEZpZWxkVmFsdWUoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGlzcGxheVZhbHVlKGZpZWxkLnR5cGUsIGZpZWxkLm9wdGlvbnMsIHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCksIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCBwYXJlbnQgdGFiIGZvciBmaWVsZFxuICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuY29uZmlnPy50YWJzIHx8IFtdKSB7XG4gICAgICBjb25zdCBoYXNGaWVsZCA9ICh0YWIuZmllbGRzIHx8IFtdKS5zb21lKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XG4gICAgICBpZiAoaGFzRmllbGQpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRm9ybUNvbXA/LnNldEFjdGl2ZVRhYih0YWIuaWQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBmaWVsZC1jb250YWluZXItJHtmaWVsZElkfWApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yXCI+XG4gIDwhLS0gUmVjb3JkIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlLWdyb3VwXCI+XG4gICAgICBAaWYgKHByb2ZpbGVJbWFnZVVybCkge1xuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci1wcm9maWxlLWltYWdlXCJcbiAgICAgICAgICBbc3JjXT1cInByb2ZpbGVJbWFnZVVybFwiXG4gICAgICAgICAgW2FsdF09XCJyZWNvcmRUaXRsZVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXJcIiBkYXRhLXRlc3RpZD1cImhlYWRlci1hdmF0YXItaW5pdGlhbFwiPlxuICAgICAgICAgIHt7IGF2YXRhckxldHRlciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoMiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX190aXRsZVwiIGRhdGEtdGVzdGlkPVwicmVjb3JkLXRpdGxlXCI+XG4gICAgICAgICAge3sgcmVjb3JkVGl0bGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGVcIj5FbnRpdHk6IHt7IGNvbmZpZy5lbnRpdHkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG91dHNpZGUgc2VjdGlvbiBlZGl0aW5nIC0tPlxuICAgIEBpZiAoaGVhZGVyVG9nZ2xlRmllbGQ7IGFzIHRvZ2dsZUZpZWxkKSB7XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZVwiPlxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRGaWVsZExhYmVsKHRvZ2dsZUZpZWxkKSB9fTwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci10b2dnbGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImhlYWRlclRvZ2dsZVZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkUmVhZE9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVIZWFkZXJTdGF0dXMoKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUtdGV4dFwiPnt7IGhlYWRlclRvZ2dsZVZhbHVlID8gJ1llcycgOiAnTm8nIH19PC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGlzbWlzc2libGUgaW5mbyBiYW5uZXJzIChydWxlcyBgaW5mb2AgYWN0aW9uKSAtLT5cbiAgQGZvciAoYmFubmVyIG9mIGluZm9CYW5uZXJzOyB0cmFjayBiYW5uZXIuZmllbGRJZCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvXCJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2luZm8tYmFubmVyLScgKyBiYW5uZXIuZmllbGRJZFwiXG4gICAgPlxuICAgICAgPHNwYW4+4oS577iPIHt7IGJhbm5lci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3NcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGlzbWlzcy0nICsgYmFubmVyLmZpZWxkSWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEaXNtaXNzOiAnICsgYmFubmVyLm1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc0luZm9CYW5uZXIoYmFubmVyLmZpZWxkSWQpXCJcbiAgICAgID7inJU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTW9kaWZpY2F0aW9uIGJhc2VsaW5lIGJhbm5lciAtLT5cbiAgQGlmIChpc01vZGlmaWVkKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS13YXJuaW5nXCI+XG4gICAgICDwn5SSIFJlY29yZCBtb2RpZmllZCBmcm9tIHNlc3Npb24gYmFzZWxpbmUg4oCUIHVuc2F2ZWQgY2hhbmdlcyBwZW5kaW5nLlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTdW1tYXJ5IFBhbmVsIChzaG93T25NaW5pbWl6ZSBmaWVsZHMgd2l0aCBpbnRlcmFjdGl2ZSBqdW1wKSAtLT5cbiAgQGlmIChzdW1tYXJ5RmllbGRzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbFwiIGRhdGEtdGVzdGlkPVwic3VtbWFyeS1wYW5lbFwiPlxuICAgICAgQGZvciAoc2Ygb2Ygc3VtbWFyeUZpZWxkcygpOyB0cmFjayBzZi5pZCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInc3VtbWFyeS0nICsgc2YuaWRcIlxuICAgICAgICAgIChjbGljayk9XCJqdW1wVG9GaWVsZChzZi5pZClcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ2xpY2sgdG8ganVtcCB0byAnICsgZm9ybWF0RmllbGRMYWJlbChzZilcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoc2YpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktdmFsXCI+e3sgZm9ybWF0RmllbGRWYWx1ZShzZikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTZWN0aW9uIGVkaXQgYmFyOiBvbmUgdGFiIGlzIGVkaXRlZCBhdCBhIHRpbWUsIGFuZCB2YWxpZGF0ZWQgb24gaXRzIG93biAtLT5cbiAgQGlmICh2aWV3TW9kZSAmJiAhcmVjb3JkUmVhZE9ubHkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICBAaWYgKGlzRWRpdGluZ0FjdGl2ZVRhYikge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWhpbnRcIj5FZGl0aW5nIHRoaXMgc2VjdGlvbjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImNhbmNlbC1zZWN0aW9uXCIgKGNsaWNrKT1cImNhbmNlbFNlY3Rpb24oKVwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fc3VibWl0XCIgZGF0YS10ZXN0aWQ9XCJzYXZlLXNlY3Rpb25cIiAoY2xpY2spPVwic2F2ZVNlY3Rpb24oKVwiPlxuICAgICAgICAgIFNhdmUgc2VjdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiZWRpdC1zZWN0aW9uXCIgKGNsaWNrKT1cImVkaXRTZWN0aW9uKClcIj5cbiAgICAgICAgICBFZGl0IHNlY3Rpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIG5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS10ZXN0aWQ9XCJzZWN0aW9uLWVycm9yc1wiPlxuICAgICAgQGZvciAoa2V5IG9mIE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSk7IHRyYWNrIGtleSkge1xuICAgICAgICA8ZGl2PuKaoO+4jyB7eyBzZWN0aW9uRXJyb3JzKClba2V5XSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBBcnJheSByb3dzOiBsaXN0ZWQgaGVyZSwgZWRpdGVkIGluIHRoZSBkcmF3ZXIgYmVsb3cgLS0+XG4gIEBmb3IgKGFycmF5RmllbGQgb2YgYXJyYXlGaWVsZHNGb3JBY3RpdmVUYWI7IHRyYWNrIGFycmF5RmllbGQuaWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd3NcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCIncm93cy0nICsgYXJyYXlGaWVsZC5pZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoYXJyYXlGaWVsZCkgfX08L3NwYW4+XG4gICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2FkZC1yb3ctJyArIGFycmF5RmllbGQuaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRSb3coYXJyYXlGaWVsZClcIlxuICAgICAgICAgID4rIFJvdzwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGZvciAocm93IG9mIHJvd3NPZihhcnJheUZpZWxkKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy10ZXh0XCI+e3sgcm93U3VtbWFyeShhcnJheUZpZWxkLCByb3cpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidlZGl0LXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRWRpdFJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidkZWxldGUtcm93LScgKyBhcnJheUZpZWxkLmlkICsgJy0nICsgJGluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgPHAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5XCI+Tm8gcm93cyB5ZXQuPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLVxuICAgIFJvdyBkcmF3ZXIuIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSB0YWIgcGFuZWw6IGJ1aWxkaW5nIGEgcm93J3MgRm9ybUdyb3VwIGluc2lkZSB0aGVcbiAgICB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uICh0aGUgcmVmZXJlbmNlIGhpdCB0aGlzIHdpdGggRm9ybUFycmF5KS5cbiAgLS0+XG4gIEBpZiAoaW5saW5lUm93RmllbGQoKTsgYXMgcm93RmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2RyYXdlclwiIGRhdGEtdGVzdGlkPVwicm93LWRyYXdlclwiIFtmb3JtR3JvdXBdPVwiaW5saW5lUm93Rm9ybSFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XG4gICAgICAgIDxzdHJvbmc+e3sgaW5saW5lUm93SW5kZXgoKSA9PT0gbnVsbCA/ICdBZGQnIDogJ0VkaXQnIH19IHt7IGZvcm1hdEZpZWxkTGFiZWwocm93RmllbGQpIH19IHJvdzwvc3Ryb25nPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZm9ybV9fcGFuZWxcIj5cbiAgICAgICAgQGZvciAoY2hpbGQgb2Ygcm93RmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XG4gICAgICAgICAgPG5neC1keW5hbWljLWZpZWxkXG4gICAgICAgICAgICBbZmllbGRdPVwiY2hpbGRcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiaW5saW5lUm93Rm9ybSEuZ2V0KGNoaWxkLmlkKSFcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgICAgICAgICBbc3R5bGUuZ3JpZENvbHVtbl09XCInc3BhbiAxMidcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtcm93XCIgKGNsaWNrKT1cImNhbmNlbFJvdygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1yb3dcIiAoY2xpY2spPVwic2F2ZVJvdygpXCI+U2F2ZSByb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBNYWluIER5bmFtaWMgRm9ybSAtLT5cbiAgPG5neC1keW5hbWljLWZvcm1cbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgW3J1bGVzXT1cInJ1bGVzXCJcbiAgICBbaW5pdGlhbERhdGFdPVwiaW5pdGlhbERhdGFcIlxuICAgIFtvcmlnaW5hbERhdGFdPVwib3JpZ2luYWxCYXNlbGluZSgpXCJcbiAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICBbcmVhZG9ubHldPVwic2VjdGlvblJlYWRPbmx5XCJcbiAgICBbcmVhZE9ubHlGaWVsZHNdPVwicmVhZE9ubHlGaWVsZHNcIlxuICAgIFtzaG93SW5mb0Jhbm5lcnNdPVwiZmFsc2VcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtlcnJvcl09XCJlcnJvclwiXG4gICAgKGZvcm1DaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKCRldmVudClcIlxuICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdCgkZXZlbnQpXCJcbiAgICAoZm9ybVJlc2V0KT1cIm9uRm9ybVJlc2V0KClcIlxuICAgIChhY3RpdmVUYWJDaGFuZ2UpPVwib25BY3RpdmVUYWJDaGFuZ2UoJGV2ZW50KVwiXG4gIC8+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -69,4 +69,4 @@ export function provideFieldTypes(types) {
|
|
|
69
69
|
export function provideBuiltInFieldTypes() {
|
|
70
70
|
return provideFieldTypes(builtInFieldTypes());
|
|
71
71
|
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1maWVsZC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixTQUFTLEVBQUUsdUJBQXVCO1FBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLFlBQVksRUFBRSx1QkFBdUI7UUFDckMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBZ0M7SUFDaEUsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzNELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRklFTERfVFlQRV9TRVRTIH0gZnJvbSAnLi4vdG9rZW5zL2luamVjdGlvbi10b2tlbnMnO1xuXG5pbXBvcnQgeyBUZXh0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0YXJlYUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvdGV4dGFyZWEtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbnVtYmVyLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXJyZW5jeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY3VycmVuY3ktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVtYWlsRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9lbWFpbC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL3Bhc3N3b3JkLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY2hlY2tib3gtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2RhdGUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbW9udGgteWVhci1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Ryb3Bkb3duLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYWRpb0ZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvcmFkaW8tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9tdWx0aS1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZW50aXR5LXJlZi1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JvdXBGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2dyb3VwLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYXJyYXktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZmlsZS1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEZpZWxkLXR5cGUgcmVnaXN0cmF0aW9uIOKAlCB0aGUgdHJlZS1zaGFraW5nIHNlYW0uXG4gKlxuICogYEZpZWxkUmVnaXN0cnlTZXJ2aWNlYCBpbXBvcnRzIG5vIGNvbXBvbmVudHMuIFdoYXRldmVyIHlvdSByZWdpc3RlciBoZXJlIGlzIHdoYXQgZ2V0c1xuICogYnVuZGxlZCwgc28gYW4gYXBwIHRoYXQgb25seSB1c2VzIHRleHQvbnVtYmVyL2Ryb3Bkb3duIHBheXMgZm9yIHRocmVlIGNvbXBvbmVudHMgYW5kXG4gKiB0aGVpciBpbXBvcnRzLCBub3QgbmluZXRlZW4uXG4gKlxuICogYGBgdHNcbiAqIC8vIEV2ZXJ5dGhpbmcgKGNvbnZlbmllbnQ7IGJ1bmRsZXMgYWxsIGJ1aWx0LWlucyk6XG4gKiBwcm92aWRlTmd4RHluYW1pY0VudGl0eSgpLCBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKVxuICpcbiAqIC8vIE9ubHkgd2hhdCB0aGlzIGFwcCByZW5kZXJzOlxuICogcHJvdmlkZUZpZWxkVHlwZXMoeyB0ZXh0OiBUZXh0RmllbGRDb21wb25lbnQsIG51bWJlcjogTnVtYmVyRmllbGRDb21wb25lbnQgfSlcbiAqIGBgYFxuICpcbiAqIEJvdGggbWVyZ2UgaW50byBgRklFTERfVFlQRV9SRUdJU1RSWWA7IGxhdGVyIHJlZ2lzdHJhdGlvbnMgd2luIG9uIGtleSBjb2xsaXNpb24uXG4gKi9cblxuLyoqIE1hcCBvZiBldmVyeSBidWlsdC1pbiBmaWVsZCB0eXBlIGtleSDihpIgY29tcG9uZW50LiBSZWZlcmVuY2luZyB0aGlzIHB1bGxzIGluIGFsbCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWx0SW5GaWVsZFR5cGVzKCk6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4ge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IFRleHRGaWVsZENvbXBvbmVudCxcbiAgICB0ZXh0YXJlYTogVGV4dGFyZWFGaWVsZENvbXBvbmVudCxcbiAgICBudW1iZXI6IE51bWJlckZpZWxkQ29tcG9uZW50LFxuICAgIGN1cnJlbmN5OiBDdXJyZW5jeUZpZWxkQ29tcG9uZW50LFxuICAgIGVtYWlsOiBFbWFpbEZpZWxkQ29tcG9uZW50LFxuICAgIHBhc3N3b3JkOiBQYXNzd29yZEZpZWxkQ29tcG9uZW50LFxuICAgIGNoZWNrYm94OiBDaGVja2JveEZpZWxkQ29tcG9uZW50LFxuICAgIGJvb2xlYW46IEJvb2xlYW5GaWVsZENvbXBvbmVudCxcbiAgICBkYXRlOiBEYXRlRmllbGRDb21wb25lbnQsXG4gICAgZGF0ZXRpbWU6IERhdGVGaWVsZENvbXBvbmVudCxcbiAgICBtb250aFllYXI6IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50LFxuICAgIGRyb3Bkb3duOiBEcm9wZG93bkZpZWxkQ29tcG9uZW50LFxuICAgIHJhZGlvOiBSYWRpb0ZpZWxkQ29tcG9uZW50LFxuICAgIG11bHRpU2VsZWN0OiBNdWx0aVNlbGVjdEZpZWxkQ29tcG9uZW50LFxuICAgICdlbnRpdHktcmVmJzogRW50aXR5UmVmRmllbGRDb21wb25lbnQsXG4gICAgZ3JvdXA6IEdyb3VwRmllbGRDb21wb25lbnQsXG4gICAgYXJyYXk6IEFycmF5RmllbGRDb21wb25lbnQsXG4gICAgaW1hZ2U6IEltYWdlRmllbGRDb21wb25lbnQsXG4gICAgZmlsZTogRmlsZUZpZWxkQ29tcG9uZW50LFxuICB9O1xufVxuXG4vKiogUmVnaXN0ZXIgYSBzcGVjaWZpYyBzZXQgb2YgZmllbGQgdHlwZXMuIE9ubHkgdGhlIGNvbXBvbmVudHMgeW91IG5hbWUgYXJlIGJ1bmRsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZpZWxkVHlwZXModHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogRklFTERfVFlQRV9TRVRTLCB1c2VWYWx1ZTogdHlwZXMsIG11bHRpOiB0cnVlIH0sXG4gIF0pO1xufVxuXG4vKiogUmVnaXN0ZXIgYWxsIDE5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5cy4gQ29udmVuaWVuY2UgZm9yIGFwcHMgdGhhdCB1c2UgbW9zdCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCdWlsdEluRmllbGRUeXBlcygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBwcm92aWRlRmllbGRUeXBlcyhidWlsdEluRmllbGRUeXBlcygpKTtcbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { makeEnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
|
|
2
|
+
import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, ASYNC_VALIDATOR_REGISTRY, RECORD_MIGRATIONS, VALIDATION_MESSAGES, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
|
|
3
3
|
/**
|
|
4
4
|
* Provider function for ngx-dynamic-entity.
|
|
5
5
|
* All options are optional — consumers provide only what they use (ISP).
|
|
@@ -16,6 +16,12 @@ export const provideNgxDynamicEntity = (config = {}) => makeEnvironmentProviders
|
|
|
16
16
|
{ provide: ENTITY_REF_REGISTRY, useValue: new Map(Object.entries(config.entityRefs ?? {})) },
|
|
17
17
|
{ provide: LOOKUP_REGISTRY, useValue: new Map(Object.entries(config.lookups ?? {})) },
|
|
18
18
|
{ provide: VALIDATOR_REGISTRY, useValue: new Map(Object.entries(config.validators ?? {})) },
|
|
19
|
+
{
|
|
20
|
+
provide: ASYNC_VALIDATOR_REGISTRY,
|
|
21
|
+
useValue: new Map(Object.entries(config.asyncValidators ?? {})),
|
|
22
|
+
},
|
|
19
23
|
{ provide: HOOK_REGISTRY, useValue: new Map(Object.entries(config.hooks ?? {})) },
|
|
24
|
+
{ provide: RECORD_MIGRATIONS, useValue: config.migrations ?? [] },
|
|
25
|
+
{ provide: VALIDATION_MESSAGES, useValue: config.validationMessages ?? {} },
|
|
20
26
|
]);
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGFBQWEsRUFFYix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsWUFBWSxFQUNaLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBNkNwQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFNBQWlDLEVBQUUsRUFBd0IsRUFBRSxDQUNuRyx3QkFBd0IsQ0FBQztJQUN2QixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO0lBQzdELEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM1RixFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNyRixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDM0Y7UUFDRSxPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7S0FDaEU7SUFDRCxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2pGLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRTtJQUNqRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsRUFBRTtDQUM1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVJlZmVyZW5jZUxvYWRlciwgTG9va3VwTGlzdFNvdXJjZSwgUmVjb3JkTWlncmF0aW9uIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHtcbiAgRU5USVRZX1JFRl9SRUdJU1RSWSxcbiAgRklFTERfVFlQRV9SRUdJU1RSWSxcbiAgSE9PS19SRUdJU1RSWSxcbiAgdHlwZSBIb29rRm4sXG4gIEFTWU5DX1ZBTElEQVRPUl9SRUdJU1RSWSxcbiAgUkVDT1JEX01JR1JBVElPTlMsXG4gIFZBTElEQVRJT05fTUVTU0FHRVMsXG4gIExPT0tVUF9SRUdJU1RSWSxcbiAgTUFTS0VEX1JPTEVTLFxuICBWQUxJREFUT1JfUkVHSVNUUlksXG59IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hEeW5hbWljRW50aXR5Q29uZmlnIHtcbiAgLyoqIFJvbGVzIHRoYXQgc2VlIG1hc2tlZCBmaWVsZCB2YWx1ZXMgYXMgWFhYWFhYWFhYICovXG4gIG1hc2tlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKiBDdXN0b20gZmllbGQgdHlwZSBjb21wb25lbnRzIGtleWVkIGJ5IHR5cGUgc3RyaW5nICovXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xuICAvKipcbiAgICogRW50aXR5LXJlZiBvcHRpb24gbG9hZGVycyBrZXllZCBieSBlbnRpdHkga2V5LlxuICAgKiBFYWNoIHJlY2VpdmVzIGB7IHBhcmVudFZhbHVlLCBmaWx0ZXJzLCBsYW5nIH1gIGFuZCBtYXkgcmV0dXJuIGFuIGFycmF5LCBQcm9taXNlLCBvciBPYnNlcnZhYmxlLlxuICAgKi9cbiAgZW50aXR5UmVmcz86IFJlY29yZDxzdHJpbmcsIEVudGl0eVJlZmVyZW5jZUxvYWRlcj47XG4gIC8qKlxuICAgKiBOYW1lZCBtYXN0ZXIgbGlzdHMga2V5ZWQgYnkgbGlzdCBuYW1lLCBmb3IgZmllbGRzIHRoYXQgc2V0IGBsaXN0TmFtZWAuXG4gICAqIEVhY2ggbWF5IGJlIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyAoYXJyYXkvUHJvbWlzZS9PYnNlcnZhYmxlKSBvciBhIGxvYWRlciBmdW5jdGlvbiDigJQgcHJlZmVyXG4gICAqIGEgbG9hZGVyIGZvciBhbnl0aGluZyBmZXRjaGVkLCBzbyBhbiB1bnVzZWQgbGlzdCBpcyBuZXZlciBsb2FkZWQuXG4gICAqL1xuICBsb29rdXBzPzogUmVjb3JkPHN0cmluZywgTG9va3VwTGlzdFNvdXJjZT47XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbWVzc2FnZXMgc2hvd24gdW5kZXIgaW52YWxpZCBmaWVsZHMsIGtleWVkIGJ5IEFuZ3VsYXIgZXJyb3Iga2V5LiBBIHZhbHVlIGlzXG4gICAqIGEgc3RyaW5nLCBvciBhIGZ1bmN0aW9uIHJlY2VpdmluZyBgKGxhbmd1YWdlLCBlcnJvcilgIHdoZW4gaXQgbmVlZHMgdGhlIGVycm9yJ3MgZGV0YWlsLlxuICAgKiBVbmxpc3RlZCBrZXlzIGtlZXAgdGhlaXIgRW5nbGlzaCBkZWZhdWx0LlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgKChsYW5ndWFnZTogc3RyaW5nLCBlcnJvcjogYW55KSA9PiBzdHJpbmcpPjtcbiAgLyoqXG4gICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgbmFtZSwgZm9yIGNoZWNrcyB0aGF0IG5lZWQgYSBzZXJ2ZXIg4oCUIHVuaXF1ZW5lc3MsXG4gICAqIGF2YWlsYWJpbGl0eSwgYSByZW1vdGUgcnVsZS4gTmFtZSB0aGVtIGZyb20gYSBzY2hlbWEgd2l0aFxuICAgKiBgdmFsaWRhdG9yczogeyBjdXN0b21Bc3luYzogWyd1bmlxdWVFbWFpbCddIH1gLlxuICAgKlxuICAgKiBFYWNoIGlzIGFuIEFuZ3VsYXIgYEFzeW5jVmFsaWRhdG9yRm5gOiBpdCByZWNlaXZlcyB0aGUgY29udHJvbCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb3JcbiAgICogT2JzZXJ2YWJsZSBvZiBgVmFsaWRhdGlvbkVycm9ycyB8IG51bGxgLiBUaGUgY29udHJvbCBpcyBgcGVuZGluZ2Agd2hpbGUgaXQgcnVucywgYW5kIHRoZVxuICAgKiBmb3JtIGNhbm5vdCBiZSBzdWJtaXR0ZWQgdW50aWwgZXZlcnkgcGVuZGluZyBjaGVjayBzZXR0bGVzLlxuICAgKi9cbiAgYXN5bmNWYWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIEN1c3RvbSB2YWxpZGF0b3IgZnVuY3Rpb25zIGtleWVkIGJ5IHZhbGlkYXRvciBuYW1lICovXG4gIHZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogSG9vayBmdW5jdGlvbnMga2V5ZWQgYnkgaG9vayBuYW1lICovXG4gIGhvb2tzPzogUmVjb3JkPHN0cmluZywgSG9va0ZuPjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgc3RlcHMgdGhhdCB1cGdyYWRlIGEgc2F2ZWQgcmVjb3JkIHdoZW4gYEVudGl0eUZvcm1Db25maWcudmVyc2lvbmAgbW92ZXMgYWhlYWRcbiAgICogb2YgdGhlIHJlY29yZCdzIGBfY29uZmlnVmVyc2lvbmAuIEFwcGxpZWQgdG8gYGluaXRpYWxEYXRhYCBiZWZvcmUgdGhlIGZvcm0gaXMgcGF0Y2hlZC5cbiAgICovXG4gIG1pZ3JhdGlvbnM/OiBSZWNvcmRNaWdyYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm92aWRlciBmdW5jdGlvbiBmb3Igbmd4LWR5bmFtaWMtZW50aXR5LlxuICogQWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsIOKAlCBjb25zdW1lcnMgcHJvdmlkZSBvbmx5IHdoYXQgdGhleSB1c2UgKElTUCkuXG4gKlxuICogVXNhZ2UgaW4gYXBwLmNvbmZpZy50czpcbiAqICAgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoe1xuICogICAgIG1hc2tlZFJvbGVzOiBbJ0lUX1NVUFBPUlQnXSxcbiAqICAgICBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IGNsaWVudFNlcnZpY2UuZ2V0T3B0aW9ucygpIH0sXG4gKiAgIH0pXG4gKi9cbmV4cG9ydCBjb25zdCBwcm92aWRlTmd4RHluYW1pY0VudGl0eSA9IChjb25maWc6IE5neER5bmFtaWNFbnRpdHlDb25maWcgPSB7fSk6IEVudmlyb25tZW50UHJvdmlkZXJzID0+XG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgeyBwcm92aWRlOiBNQVNLRURfUk9MRVMsIHVzZVZhbHVlOiBjb25maWcubWFza2VkUm9sZXMgPz8gW10gfSxcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5maWVsZFR5cGVzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IEVOVElUWV9SRUZfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5lbnRpdHlSZWZzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IExPT0tVUF9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmxvb2t1cHMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogVkFMSURBVE9SX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcudmFsaWRhdG9ycyA/PyB7fSkpIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQVNZTkNfVkFMSURBVE9SX1JFR0lTVFJZLFxuICAgICAgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmFzeW5jVmFsaWRhdG9ycyA/PyB7fSkpLFxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBIT09LX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcuaG9va3MgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogUkVDT1JEX01JR1JBVElPTlMsIHVzZVZhbHVlOiBjb25maWcubWlncmF0aW9ucyA/PyBbXSB9LFxuICAgIHsgcHJvdmlkZTogVkFMSURBVElPTl9NRVNTQUdFUywgdXNlVmFsdWU6IGNvbmZpZy52YWxpZGF0aW9uTWVzc2FnZXMgPz8ge30gfSxcbiAgXSk7XG4iXX0=
|